diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000000..816d95814b3 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,3 @@ +# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json +remote_config: + url: "http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml" diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 214cca6aae5..eeaaefdfb48 100755 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,9 +1,90 @@ -#Authors ordered by first contribution. +#Authors ordered by name. # # Names should be added to this file like: # Name -Frank Zhang -Yongkang You -Matt Yen -Nan Su +AlanJager ye.zou@zstack.io +anquan.wu anquan.wu@zstack.io +baijiewen 15364719037@163.com +boce.wang boce.wang@zstack.io +Chu Kun luchukun@sjtu.edu.cn +Cui,xingxing xingxing.cui@zstack.io +David Lee live4thee@gmail.com +dengsong.yang dengsong.yang@zstack.io +FuBang bang.fu@zstack.io +fuwei fuwei@sugon.com +fuyi fuyi@sugon.com +gantao tao.gan@zstack.io +Guo Yi yi.guo@zstack.io +haibiao.xiao haibiao.xiao@zstack.io +hanyu.liang hanyu.liang@zstack.io +jialong.dong jialong.dong@zstack.io +JianAZhang jianzhang_pro@foxmail.com +Jianfeng Wu jianfeng.wu@zstack.io +jianzhang jianzhang@zstack.io +jingjing.zhou jingjing.zhou@zstack.io +jin.ma jin.ma@zstack.io +jintao.chen jintao.chen@zstack.io +junfei.wang junfei.wang@zstack.io +kaicai.hu kaicai.hu@zstack.io +kefeng.wang kefeng.wang@zstack.io +Lei Liu lei.liu@zstack.io +le.jin le.jin@zstack.io +liangbo.zhou liangbo.zhou@zstack.io +lianghy hanyu.liang@zstack.io +lining 2313806311@qq.com +lining yaoning.li@zstack.io +lin.ma lin.ma@zstack.io +li.wang li.wang@zstack.io +mahaibin haibin_ma@qq.com +Mei Lei meilei007@gmail.com +miao.DengSheng xuexuemiao@yeah.net +mingjian.deng mingjian.deng@zstack.io +mingmin.wen mingmin.wen@zstack.io +Ning,GuoHui guohui.ning@zstack.io +pengchao.liu pengchao.liu@zstack.io +pengchao.zhang pengchao.zhang@zstack.io +Qi Le qi.le@zstack.io +Qilin.Wang qilin.wang@zstack.io +QiRaining 804470533@qq.com +qiuyu.zhang qiuyu.zhang@zstack.io +Rickylss xiaohaibiao331@outlook.com +Ruan Shixin shixin.ruan@zstack.io +shanshan.ning shanshan.ning@zstack.io +shan.wu shan.wu@zstack.io +Shaohui Liu liushaohui@xiaomi.com +shengyan.zhao shengyan.zhao@zstack.io +shenjin jin.shen@zstack.io +ShiXiao, Chen shixiao.chen@zstack.io +Shixin Ruan shixin.ruan@zstack.io +shuang.he shuang.he@zstack.io +siying.huang siying.huang@zstack.io +sulin.sheng sulin.sheng@zstack.io +Sun, Yu yu.sun@zstack.io +tao.gan tao.gan@zstack.io +tao.yang tao.yang@zstack.io +Tao Yang tao.yang@zstack.io +tianyang tianyang@fusionstack.com +ting.su ting.su@zstack.io +wangjie jie.wang@zstack.io +Wang Jing jing.wang@zstack.io +Wang,Qilin qilin.wang@zstack.io +Wei Wang wei.wang@zstack.io +Wenhao, Zhang wenhao.zhang@zstack.io +Wen, Yubo yubo.wen@zstack.io +Xingwei Yu xingwei.yu@zstack.io +xingxing.cui xingxing.cui@zstack.io +xinhao.huang xinhao.huang@zstack.io +yang.yu yang.yu@zstack.io +yaohua.wu pandawuu@163.com +ye.tian ye.tian@zstack.io +yingzhe.hu yingzhe.hu@zstack.io +zaifeng.wang zaifeng.wang@zstack.io +zhangjf zhangjunfeng@huayunwangji.com +zhangjianjun jianjun.zhang@zstack.io +zhangjunfeng zhangjunfeng@huayunwangji.com +Zhang Wenhao wenhao.zhang@zstack.io +zhanyong.miao zhanyong.miao@zstack.io +Zhou Jingjing jingjing.zhou@zstack.io +zhutianhao zhutianhao75@hotmail.com +zxwing xing5820@gmail.com diff --git a/README.zh-CN.md b/README.zh-CN.md index fab094389f7..1559431bad6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -87,91 +87,57 @@ ZStack采用与OSGi和Eclipse类似的插件系统方式作为核心架构基础 ZStack提供**3套全自动化的严密测试系统**,确保每个功能的代码质量。 -## 安装 +## 安装和使用 安装ZStack极为便捷。用户可按需选择不同的安装模式安装首套ZStack环境。 -* 如需快速尝试,请参阅[快速安装手册](http://en.zstack.io/installation/index.html)。 -* 如需部署生产环境,请参阅[手动安装手册](http://en.zstack.io/installation/manual.html)。 -* 如需部署多管理节点环境,请参阅[多管理节点安装手册](http://en.zstack.io/installation/multi-node.html)。 +* 如需快速尝试,请参阅[快速安装手册](https://www.zstack.io/help/tutorials/quick_install_guide/v5/)。 +* 如需部署生产环境,请参阅[手动安装手册](https://www.zstack.io/help/product_manuals/user_guide/v5/)。 +* 如需部署多管理节点环境,请参阅[多管理节点安装手册](https://www.zstack.io/help/tutorials/double_mn_ha_solution/v5/)。 -安装完成之后,可参考以下手册快速使用云平台: - -* [快速使用云平台(快速安装)](http://en.zstack.io/documentation/getstart-quick.html) -* [快速使用云平台(手动安装)](http://en.zstack.io/documentation/getstart-manual.html) -* [快速使用云平台(多管理节点安装)](http://en.zstack.io/documentation/getstart-multi.html) - -## 教程 - -对于首次使用All in One方式在单台Linux机器上搭建使用ZStack云平台的用户,ZStack提供以下6本教程可供参阅: - -#### Amazon EC2经典弹性IP域: - -* [UI界面](http://en.zstack.io/tutorials/ec2-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/ec2-cli.html) - -#### 扁平网络: - -* [UI界面](http://en.zstack.io/tutorials/flat-network-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/flat-network-cli.html) - -#### 三层网络: - -* [UI界面](http://en.zstack.io/tutorials/three-tiered-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/three-tiered-cli.html) - -#### 安全组: - -* [UI界面](http://en.zstack.io/tutorials/security-group-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/security-group-cli.html) - -#### 弹性端口转发: - -* [UI界面](http://en.zstack.io/tutorials/elastic-port-forwarding-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/elastic-port-forwarding-cli.html) - -#### 快照: - -* [UI界面](http://en.zstack.io/tutorials/snapshot-ui.html) -* [命令行工具](http://en.zstack.io/tutorials/snapshot-cli.html) - -#### 更多 - -关于ZStack架构设计的更多解读,请参阅以下文章: +## ZStack架构设计 #### 伸缩性 -* [ZStack弹性架构揭秘 1:异构架构](http://en.zstack.io/blog/asynchronous-architecture.html) -* [ZStack弹性架构揭秘 2:无状态服务架构](http://en.zstack.io/blog/stateless-clustering.html) -* [ZStack弹性架构揭秘 3:无锁架构](http://en.zstack.io/blog/lock-free.html) +* [ZStack弹性架构揭秘](https://res.zstack.io/assets/pdf/08.pdf) + - 异构架构 + - 无状态服务架构 + - 无锁架构 #### 插件架构 -* [进程内微服务架构](http://en.zstack.io/blog/microservices.html) -* [通用插件系统](http://en.zstack.io/blog/plugin.html) -* [标签系统](http://en.zstack.io/blog/tag.html) -* [工作流引擎](http://en.zstack.io/blog/workflow.html) -* [瀑布流架构](http://en.zstack.io/blog/cascade.html) +* [ZStack插件架构](https://res.zstack.io/assets/pdf/09.pdf) + - 进程内微服务架构 + - 通用插件系统 + - 工作流引擎 -#### 查询API: +#### 资源操作框架 -* [查询API](http://en.zstack.io/blog/query.html) +* [标签系统/级联框架/查询API](https://res.zstack.io/assets/pdf/10.pdf) -#### 自动化: +#### 整体技术架构概述 +* [技术架构概述](https://www.zstack.io/help/product_manuals/white_paper/v5/) -* [全自动化Ansible部署](http://en.zstack.io/blog/ansible.html) +## 社区交流 +* 加入QQ群,共同探讨和分享对ZStack的建议、使用心得、发展方向等。QQ群号:一群(410185063)、二群(443027683)、三群(741300236)、四群(1046295840)、五群(1071894823)、六群(1012034825) -#### 存储与网络: +## 参与贡献 +#### 问题反馈 +1. 提交Issue或通过QQ群反馈问题 +2. 描述如何重现该问题(可选) +3. 可提供解决方案(可选) +4. 提交PR以解决问题(可选) -* [网络模型 1:二层网络和三层网络](http://en.zstack.io/blog/network-l2.html) -* [网络模型 2:云路由器网络服务提供商](http://en.zstack.io/blog/virtual-router.html) -* [存储模型:主存储与镜像服务器](http://en.zstack.io/blog/storage.html) +#### 功能需求 +1. 提交Issue或通过QQ群反馈新功能需求及原因 +2. 指出这个功能的实现方案(可选) +3. 提出PR实现这个新的功能(可选) -#### 测试 +#### 代码贡献 +1. 参考[快速编译手册](https://gitee.com/zstackio/zstack-utility/blob/master/zstackbuild/README.md) 准备一个开发环境 +2. 提交PR请求根据社区反馈进行完善 -* [自动化测试系统 1:综合测试](http://en.zstack.io/blog/integration-testing.html) -* [自动化测试系统2:系统测试](http://en.zstack.io/blog/system-testing.html) -* [自动化测试系统3:模型测试](http://en.zstack.io/blog/model-based-testing.html) +感谢以下小伙伴对本仓库的贡献和反馈[社区贡献榜](https://gitee.com/zstackio/zstack/blob/master/CONTRIBUTORS)! ## 许可证 diff --git a/VERSION b/VERSION index 93ac0f51e8d..397ec1fbbca 100755 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MAJOR=5 -MINOR=2 -UPDATE=1 +MINOR=4 +UPDATE=8 diff --git a/abstraction/pom.xml b/abstraction/pom.xml new file mode 100644 index 00000000000..4e18325c587 --- /dev/null +++ b/abstraction/pom.xml @@ -0,0 +1,39 @@ + + + zstack + org.zstack + 5.4.0 + .. + + 4.0.0 + abstraction + + + + org.apache.maven.plugins + maven-compiler-plugin + ${project.compiler.version} + + groovy-eclipse-compiler + ${project.java.version} + ${project.java.version} + lines,vars,source + true + + + + org.codehaus.groovy + groovy-eclipse-compiler + ${groovy.eclipse.compiler} + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.eclipse.batch} + + + + + + diff --git a/abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java b/abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java new file mode 100644 index 00000000000..4f83b5629da --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/InvalidPluginDefinitionException.java @@ -0,0 +1,4 @@ +package org.zstack.abstraction; + +public class InvalidPluginDefinitionException extends RuntimeException { +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/OptionType.java b/abstraction/src/main/java/org/zstack/abstraction/OptionType.java new file mode 100644 index 00000000000..019fe354b98 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/OptionType.java @@ -0,0 +1,689 @@ +package org.zstack.abstraction; +/** + * A Model representation of an input / option that is represented either in a UI or CLI. + * This allows an Integration to specify custom inputs for various configuration screens where custom data may need to be provided. + * This could include provisioning options. + * There are several input types as well as display orders. + * this must be provided by the relevant provider interface. + */ +public class OptionType { + protected String uuid; + protected String name; + protected String code; + protected String category; + protected Boolean required = false; // Indicates if the field is mandatory + protected Boolean editable = true; // Indicates if the field is editable + protected Boolean enabled = true; // Indicates if the field is enabled + protected Integer displayOrder; // Specifies the display order of the field + protected InputType inputType = InputType.TEXT; // Input type, refer to the InputType enum for possible values + protected String placeHolderText; // Placeholder text, displayed as a hint + protected String defaultValue; // Default value for the field + protected String noSelection; // Indicates if no selection is allowed by default + protected Boolean noBlank = false; // Indicates if the field can have an empty value + protected Boolean secretField = false; // Indicates if the field contains sensitive information + protected Long minVal; // Minimum allowed value + protected Long maxVal; // Maximum allowed value + protected Long minLength; // Minimum allowed length for input + protected Long maxLength; // Maximum allowed length for input + + protected String fieldContext = "config"; + protected String fieldClass; // CSS class for styling the field + protected String fieldLabel; // Label for the field, displayed in the UI + protected String fieldCode; // Internationalization (i18n) code for the field + protected String fieldName; // The key used by the backend to identify this field + protected String fieldGetName; // Key for retrieving the value from a different property + protected String fieldSetName; // Key for setting the value from a different property + protected String fieldGetContext; // Context for retrieving the field's value + protected String fieldSetContext; // Context for setting the field's value + + protected String fieldGroup; // Specifies the group to which the field belongs + protected String fieldGroupI18nCode; // i18n code for the field group heading + + protected String helpText; // Help text providing guidance to users + protected String helpTextI18nCode; // i18n code for the help text + + protected String optionSourceType; // Source type for dynamic options (e.g., database or API) + protected String optionSource; // Source for dynamic options, such as a method name + protected String dependsOn; // Fields this field depends on; updates when dependent field values change + + protected Boolean showOnEdit = true; // Indicates if the field is displayed during editing + protected Boolean displayValueOnDetails = false; // Indicates if the field value is displayed on details page + protected Boolean showOnCreate = true; // Indicates if the field is displayed during creation + protected String verifyPattern; // Validation pattern for input value, specified as a regular expression + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * Gets the Unique code representation of the option type. This is used for tracking changes and should be globally unique. It also + * allows for multiple provider types to reuse the same input field if they share the same option set. + * + * @return unique String code identifier for this particular Option Type + */ + public String getCode() { + return code; + } + + /** + * Sets the Unique code representation of the option type. This is used for tracking changes and should be globally unique. It also + * allows for multiple provider types to reuse the same input field if they share the same option set. + * + * @param code unique String code identifier for this particular Option Type + */ + public void setCode(String code) { + this.code = code; + } + + /** + * Gets the field label of the current Option Type. The Field Label is the human readable label that is typically displayed left of the + * input prompt in most UI representations. + * + * @return Human readable Field Label + */ + public String getFieldLabel() { + return fieldLabel; + } + + /** + * Sets the field label of the current Option Type. The Field Label is the human readable label that is typically displayed left of the + * input prompt in most UI representations. + * + * @param fieldLabel Human readable Field Label + */ + public void setFieldLabel(String fieldLabel) { + this.fieldLabel = fieldLabel; + } + + /** + * Gets the field name of the current option type. The Field Name is typically the actual property name the field correlates to. + * It can be period seperated for referencing nested objects and is typically combined with the fieldContext. + * (example: config.provider.name). + * + * @return the field name of the property being saved + */ + public String getFieldName() { + return fieldName; + } + + /** + * Sets the field name of the current option type. The Field Name is typically the actual property name the field correlates to. + * It can be period seperated for referencing nested objects and is typically combined with the fieldContext. + * (example: config.provider.name). + * + * @param fieldName the field name of the property being saved + */ + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + /** + * Gets the field context which is the primary object the field is being saved onto. This could be something like + * 'instance' or 'config'. It typically gets combined with field names such as a fieldName of 'name' with a context + * of 'instance' would get combined to save onto 'instance.name' within Morpheus data model. + * + * @return the field context to be used for determining where the value is saved + */ + public String getFieldContext() { + return fieldContext; + } + + /** + * Sets the field context which is the primary object the field is being saved onto. This could be something like + * 'instance' or 'config'. It typically gets combined with field names such as a fieldName of 'name' with a context + * of 'instance' would get combined to save onto 'instance.name' within Morpheus data model. + * + * @param fieldContext the field context to be used for determining where the value is saved + */ + public void setFieldContext(String fieldContext) { + this.fieldContext = fieldContext; + } + + /** + * Gets the field group which is the name that is used to group fields together in the user interface. + * To have all fields at the same level, do not specify a field group. + * + * @return the field group to be used for grouping fields together + */ + public String getFieldGroup() { + return fieldGroup; + } + + /** + * Sets the field group which is the name that is used to group fields together in the user interface. + * To have all fields at the same level, do not specify a field group. + * + * @param fieldGroup the field group to be used for grouping fields together + */ + public void setFieldGroup(String fieldGroup) { + this.fieldGroup = fieldGroup; + } + + /** + * Gets the type of Input this option type represents. This could range in type and be anything from a free form + * text field to a dropdown with remote loaded data from an {@link #getOptionSource()}. + * + * @return the type of input this option type correlates to. + */ + public InputType getInputType() { + return inputType; + } + + /** + * Sets the type of Input this option type represents. This could range in type and be anything from a free form + * text field to a dropdown with remote loaded data from an {@link #getOptionSource()}. + * + * @param inputType the type of input this option type correlates to. + */ + public void setInputType(InputType inputType) { + this.inputType = inputType; + } + + /** + * Gets the display order position of the following Option Type. The Display order is sorted ascending numerically. Sometimes + * it may be advised to use multiples when incrementing the display order to allow for injection points between them. + * + * @return the Numerical display order (typically starting at 0) of the input. + */ + public Integer getDisplayOrder() { + return displayOrder; + } + + /** + * Sets the display order position of the following Option Type. The Display order is sorted ascending numerically. Sometimes + * it may be advised to use multiples when incrementing the display order to allow for injection points between them. + * + * @param displayOrder the Numerical display order (typically starting at 0) of the input. + */ + public void setDisplayOrder(Integer displayOrder) { + this.displayOrder = displayOrder; + + } + + /** + * Gets an inputs placeholder text for helpful display when awaiting input on a field. A placeholder text can be + * helpful hint to the user as to what type of input should go in the associated field. + * + * @return the place holder input text + */ + public String getPlaceHolderText() { + return placeHolderText; + } + + /** + * Convenience method for binding data, see {@link #getPlaceHolderText() getPlaceHolderText} + */ + public String getPlaceHolder() { + return getPlaceHolderText(); + } + + /** + * Sets an inputs placeholder text for helpful display when awaiting input on a field. A placeholder text can be + * helpful hint to the user as to what type of input should go in the associated field. + * + * @param placeHolderText the place holder input text + */ + public void setPlaceHolderText(String placeHolderText) { + this.placeHolderText = placeHolderText; + + } + + /** + * Convenience method for binding data, see {@link #setPlaceHolderText(String) setPlaceHolderText} + */ + public void setPlaceHolder(String placeHolderText) { + setPlaceHolderText(placeHolderText); + } + + /** + * Returns a String representation of the default value for the current Input. When a user first is prompted for input + * if no input is given by the user, this default value is used. + * + * @return the default value of the following input option + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + * Sets a String representation of the default value for the current Input. When a user first is prompted for input + * if no input is given by the user, this default value is used. + * + * @param defaultValue the default value of the following input option + */ + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + /** + * Gets the required flag off of the option type. This determines if an input is user required or not. The CLI and UI will use + * this flag as an initial validation step to ensure a user has at least entered a value. + * + * @return the required flag to determine if an input requires a value or not + */ + public Boolean getRequired() { + return required; + } + + /** + * Sets the required flag off of the option type. This determines if an input is user required or not. The CLI and UI will use + * this flag as an initial validation step to ensure a user has at least entered a value. + * + * @param required the required flag to determine if an input requires a value or not + */ + public void setRequired(Boolean required) { + this.required = required; + } + + /** + * Gets the help text pertaining to an input. Some inputs have help text that display below them to give better + * context for the user when determining what value to enter. This data is optional. + * + * @return the descriptive help block of text for an input + */ + public String getHelpText() { + return helpText; + } + + public String getHelpBlock() { + return helpText; + } + + /** + * Gets the help text pertaining to an input. Some inputs have help text that display below them to give better + * context for the user when determining what value to enter. This data is optional. + * + * @param helpText the descriptive help block of text for an input + */ + public void setHelpText(String helpText) { + this.helpText = helpText; + + } + + public void setHelpBlock(String helpText) { + this.helpText = helpText; + + } + + /** + * Gets the option source api method endpoint to hit when using the {@link InputType#SELECT} option. This allows a remote + * data source query to be queried for loading dynamic data. It also can take a POST request with the values of previously entered + * inputs to use as a way to filter the available options. This should be globally unique. + * + * @return option source api method for loading dynamic options + */ + public String getOptionSource() { + return optionSource; + } + + /** + * Sets the option source api method endpoint to hit when using the {@link InputType#SELECT} option. This allows a remote + * data source query to be queried for loading dynamic data. It also can take a POST request with the values of previously entered + * inputs to use as a way to filter the available options. This should be globally unique. + * + * @param optionSource option source api method for loading dynamic options + */ + public void setOptionSource(String optionSource) { + this.optionSource = optionSource; + + } + + /** + * Gets the code of an option type that this option type depends on. Some option types depend on input from previous option types. By placing the code or fieldName representation of that field into this + * input, this field will refresh upon changes made to that previous input + * + * @return the code of the parent option type + */ + public String getDependsOn() { + return dependsOn; + } + + /** + * Convenience method for binding data, see {@link #getDependsOn() getDependsOn} + */ + public String getDependsOnCode() { + return getDependsOn(); + } + + /** + * Sets the code of an option type that this option type depends on. Some option types depend on input from previous option types. By placing the code or fieldName representation of that field into this + * input, this field will refresh upon changes made to that previous input + * + * @param dependsOn the code of the parent option type + */ + public void setDependsOn(String dependsOn) { + this.dependsOn = dependsOn; + + } + + /** + * Convenience method for binding data, see {@link #setDependsOn(String) setDependsOn} + */ + public void setDependsOnCode(String dependsOn) { + setDependsOn(dependsOn); + } + + /** + * Specifies whether this option type is editable on edit. This sometimes is the case where a field can be set on create + * but not changed later + * + * @return whether or not this option type value is editable + */ + public Boolean getEditable() { + return editable; + } + + /** + * Sets whether or not this option type is editable. This sometimes is the case where a field can be set on create + * but not changed later + * + * @param editable whether or not this field is editable upon edit and not just create + */ + public void setEditable(Boolean editable) { + this.editable = editable; + } + + /** + * Specifies whether this option type is visible on create forms. This sometimes is the case where a field can be set on create + * but not changed later nor does it make sense to display it after create. + * + * @return whether or not this option type is visible upon create + */ + public Boolean getShowOnCreate() { + return showOnCreate; + } + + /** + * Sets whether or not this option type is visible on create forms. This sometimes is the case where a field can be set on create + * but not changed later, nor does it make sense to display it after create. + * + * @param showOnCreate whether or not this option type is visible upon create + */ + public void setShowOnCreate(Boolean showOnCreate) { + this.showOnCreate = showOnCreate; + + } + + /** + * Specifies if this option type is visible on edit forms. This sometimes is the case where a field can be set on create + * but not changed later nor does it make sense to display it after create. + * + * @return determines if this option type is visible upon edit + */ + public Boolean getShowOnEdit() { + return showOnEdit; + } + + /** + * Sets if this option type is visible on edit forms. This sometimes is the case where a field can be set on create + * but not changed later, nor does it make sense to display it after create. + * + * @param showOnEdit determines if this option type is visible upon edit + */ + public void setShowOnEdit(Boolean showOnEdit) { + this.showOnEdit = showOnEdit; + } + + public String getFieldClass() { + return fieldClass; + } + + public void setFieldClass(String fieldClass) { + this.fieldClass = fieldClass; + } + + /** + * Specifies if this option type is visible on resource detail views. + * + * @return determines if this option type is visible upon edit + */ + public Boolean getDisplayValueOnDetails() { + return displayValueOnDetails; + } + + /** + * Sets if this option type is visible on resource detail views. + * + * @param displayValueOnDetails determines if this option type is visible on resource detail views + */ + public void setDisplayValueOnDetails(Boolean displayValueOnDetails) { + this.displayValueOnDetails = displayValueOnDetails; + + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + + } + + /** + * returns the uuid + * + * @return the uuid of the current record + */ + public String getUuid() { + return uuid; + } + + /** + * Sets the uuid. In this class this should not be called directly + * + * @param uuid the uuid of the current record + */ + public void setUuid(String uuid) { + this.uuid = uuid; + + } + + public String getNoSelection() { + return noSelection; + } + + public void setNoSelection(String noSelection) { + this.noSelection = noSelection; + + } + + public Long getMinVal() { + return minVal; + } + + public void setMinVal(Long minVal) { + this.minVal = minVal; + + } + + public Long getMaxVal() { + return maxVal; + } + + public void setMaxVal(Long maxVal) { + this.maxVal = maxVal; + + } + + public Long getMinLength() { + return minLength; + } + + public void setMinLength(Long minLength) { + this.minLength = minLength; + + } + + public Long getMaxLength() { + return maxLength; + } + + public void setMaxLength(Long maxLength) { + this.maxLength = maxLength; + + } + + public String getFieldCode() { + return fieldCode; + } + + public void setFieldCode(String fieldCode) { + this.fieldCode = fieldCode; + + } + + public String getFieldGetName() { + return fieldGetName; + } + + public void setFieldGetName(String fieldGetName) { + this.fieldGetName = fieldGetName; + + } + + public String getFieldSetName() { + return fieldSetName; + } + + public void setFieldSetName(String fieldSetName) { + this.fieldSetName = fieldSetName; + + } + + public String getFieldGetContext() { + return fieldGetContext; + } + + public void setFieldGetContext(String fieldGetContext) { + this.fieldGetContext = fieldGetContext; + + } + + public String getFieldSetContext() { + return fieldSetContext; + } + + public void setFieldSetContext(String fieldSetContext) { + this.fieldSetContext = fieldSetContext; + + } + + public String getFieldGroupI18nCode() { + return fieldGroupI18nCode; + } + + /** + * Convenience method for binding data, see {@link #getFieldGroupI18nCode() getFieldGroupI18nCode} + */ + public String getFieldGroupCode() { + return getFieldGroupI18nCode(); + } + + public void setFieldGroupI18nCode(String fieldGroupI18nCode) { + this.fieldGroupI18nCode = fieldGroupI18nCode; + + } + + /** + * Convenience method for binding data, see {@link #setFieldGroupI18nCode(String) setFieldGroupI18nCode} + */ + public void setFieldGroupCode(String fieldGroupI18nCode) { + setFieldGroupI18nCode(fieldGroupI18nCode); + } + + public String getHelpTextI18nCode() { + return helpTextI18nCode; + } + + /** + * Convenience method for binding data, see {@link #getHelpTextI18nCode() getHelpTextI18nCode} + */ + public String getHelpBlockCode() { + return getHelpTextI18nCode(); + } + + public void setHelpTextI18nCode(String helpTextI18nCode) { + this.helpTextI18nCode = helpTextI18nCode; + + } + + /** + * Convenience method for binding data, see {@link #setHelpTextI18nCode(String) setHelpTextI18nCode} + */ + public void setHelpBlockCode(String helpTextI18nCode) { + setHelpTextI18nCode(helpTextI18nCode); + } + + public String getOptionSourceType() { + return optionSourceType; + } + + public void setOptionSourceType(String optionSourceType) { + this.optionSourceType = optionSourceType; + + } + + public Boolean getNoBlank() { + return noBlank; + } + + public void setNoBlank(Boolean noBlank) { + this.noBlank = noBlank; + } + + public Boolean getSecretField() { + return secretField; + } + + public void setSecretField(Boolean secretField) { + this.secretField = secretField; + } + + public String getVerifyPattern() { + return verifyPattern; + } + + public void setVerifyPattern(String verifyPattern) { + this.verifyPattern = verifyPattern; + } + + public enum InputType { + TEXT("text"), + PASSWORD("password"), + NUMBER("number"), + TEXTAREA("textarea"), + SELECT("select"), + MULTI_SELECT("multiSelect"), + CHECKBOX("checkbox"), + RADIO("radio"), + CREDENTIAL("credential"), + TYPEAHEAD("typeahead"), + MULTI_TYPEAHEAD("multiTypeahead"), + CODE_EDITOR("code-editor"), + HIDDEN("hidden"); + + private final String value; + + InputType(String value) { + this.value = value; + } + + public String toString() { + return this.value; + } + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java b/abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java new file mode 100644 index 00000000000..49b3846c29f --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginCapabilityState.java @@ -0,0 +1,13 @@ +package org.zstack.abstraction; + +/** + * PluginCapabilityState offers two states of plugin capabilities. + *

+ * SUPPORTED: means plugin support the capability + * UNSUPPORTED: means plugin do not support the capability + *

+ */ +public enum PluginCapabilityState { + SUPPORTED, + UNSUPPORTED +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java new file mode 100644 index 00000000000..61a812f06c3 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginDriver.java @@ -0,0 +1,73 @@ +package org.zstack.abstraction; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; + +/** + * PluginRegister defines the specific requirements for plugin. + *

+ * by PluginRegister we should get all metadata of the plugin. + *

+ */ +public interface PluginDriver { + String type(); + + /** + * product name of your plugin + * @return a String of name + */ + String name(); + + /** + * unique product key from distribution + * @return the key of current environment + */ + String uuid(); + + /** + * plugin version + * @return version of current plugin + */ + String version(); + + /** + * capabilities map describe current plugin's whole + * capabilities + * @return map of feature + */ + Map features(); + + /** + * plugin's description + * @return description of current plugin + */ + String description(); + + /** + * plugin's vendor + * @return vendor of current plugin + */ + String vendor(); + + /** + * plugin's url + * @return url of current plugin + */ + String url(); + + /** + * plugin's license + * @return license of current plugin + */ + String license(); + + /** + * Provides a Collection of OptionType inputs that define the required input fields for defining a plugin integration + * + * @return Collection of OptionType + */ + default Collection optionTypes() { + return new ArrayList<>(); + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java b/abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java new file mode 100644 index 00000000000..b76d8e6c382 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginEndpointValidator.java @@ -0,0 +1,36 @@ +package org.zstack.abstraction; + +import org.zstack.abstraction.sns.EndpointDriver; + +import java.util.List; +import java.util.stream.Collectors; + +public class PluginEndpointValidator implements PluginValidator { + @Override + public Class pluginClass() { + return EndpointDriver.class; + } + + @Override + public void validate(PluginDriver register) { + if (register.type() == null) { + throw new InvalidPluginDefinitionException(); + } + } + + @Override + public void validateAllPlugins(List pluginDriverList) { + int pluginNumber = pluginDriverList.size(); + + int distinctPluginByEndpointTypeNumber = pluginDriverList + .stream() + .map(PluginDriver::type) + .collect(Collectors.toSet()).size(); + + if (pluginNumber == distinctPluginByEndpointTypeNumber) { + return; + } + + throw new InvalidPluginDefinitionException(); + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java b/abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java new file mode 100644 index 00000000000..cd371c05499 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginMethod.java @@ -0,0 +1,5 @@ +package org.zstack.abstraction; + +public @interface PluginMethod { + boolean required() default true; +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java b/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java new file mode 100644 index 00000000000..ac41e00705e --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/PluginValidator.java @@ -0,0 +1,11 @@ +package org.zstack.abstraction; + +import java.util.List; + +public interface PluginValidator { + Class pluginClass(); + + void validate(PluginDriver register); + + void validateAllPlugins(List pluginRegisterList); +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java new file mode 100644 index 00000000000..7602905bb85 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/crypto/CryptoClientDriver.java @@ -0,0 +1,70 @@ +package org.zstack.abstraction.crypto; + +import org.zstack.abstraction.OptionType; +import org.zstack.abstraction.PluginDriver; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public interface CryptoClientDriver extends PluginDriver { + boolean initialize(Map properties); + /** + * Test client connectivity + * + * @return true means test connection succeed else false + */ + boolean connect(Map properties); + + /** + * Parse original text and certificate base64 string + * + * @param input Signature string representation + * @return A 2D byte array where Result[0] contains the original text and Result[1] contains the certificate base64 string + */ + byte[][] attachedVerify(String input); + + /** + * Retrieves additional signature properties. + * + * @return A map containing additional signature properties, + * where each key-value pair represents a signature-related configuration or metadata. + */ + default Map additionSignatureProperties(){ + return new HashMap<>(); + }; + + /** + * Return SM3 encrypted cipher text + * + * @param plain the original text + * @return encrypt result + */ + String sm3Encrypt(String plain); + + /** + * SM4 encryption of the string + * + * @param plain the original text + * @return SM4 encrypted text + */ + String sm4Encrypt(String plain); + + /** + * SM4 decryption of the string + * + * @param plain the encrypted text + * @return sSM4 decrypted text + */ + String sm4Decrypt(String plain); + + /** + * Encrypt the string with hmac + * + * @param plain the original text + * @return hmac encrypted text + */ + String hmac(String plain); + + Collection optionTypes(); +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java b/abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java new file mode 100644 index 00000000000..ce8e54c4070 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sns/EndpointDriver.java @@ -0,0 +1,11 @@ +package org.zstack.abstraction.sns; + +import org.zstack.abstraction.PluginDriver; + +/** + * PluginEndpointSender extends PluginRegister and contains sender + * of sns endpoint. + */ +public interface EndpointDriver extends PluginDriver { + boolean send(PluginEndpointData message); +} \ No newline at end of file diff --git a/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java new file mode 100755 index 00000000000..b3e523e473a --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sns/PluginEndpointData.java @@ -0,0 +1,36 @@ +package org.zstack.abstraction.sns; + +import java.util.Map; + +/** + * PluginEndpointData used to copy sns message data for plugin. + */ +public class PluginEndpointData { + private Map metadata; + private String message; + private Map properties; + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java new file mode 100644 index 00000000000..087bbd5129e --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2PluginConstants.java @@ -0,0 +1,49 @@ +package org.zstack.abstraction.sso; + +/** + * @Author: DaoDao + * @Date: 2022/8/24 + */ +public interface OAuth2PluginConstants { + //default use OIDC, + public static final String AUTH_SCOPE_VALUE= "openid"; + + public static final int AUTH_RESPONSE_SUCCESS = 200; + public static final int AUTH_RESPONSE_ERROR = 500; + + public static final String OAUTH2_REDIRECT = "/sso/oauth2"; + public static final String TOKEN_INTROSPECT_PATH= "/introspect"; + public static final String TOKEN_Authorization = "Authorization"; + public static final String OAUTH2_TOKEN = "token"; + public static final String TOKEN_INTROSPECT_ACTIVE = "active"; + public static final String GRANT_TYPE_NAME = "grant_type"; + public static final String GRANT_TYPE_OCDE_VALUE = "authorization_code"; + public static final String REFRESH_TOKEN_VALUE = "refresh_token"; + public static final String GRANT_TYPE_PASSWORD_VALUE = "password"; + public static final String AUTH_REDIRECT_URL_NAME= "redirect_uri"; + public static final String CLIENT_ID_NAME = "client_id"; + public static final String CLIENT_SECRET_NAME = "client_secret"; + public static final String OAUTH2_CODE = "code"; + public static final String AUTH_SCOPE_NAME= "scope"; + public static final String RESPONSE_TYPE_NAME = "response_type"; + public static final String AUTH2_STATE = "state"; + + public static final String OAUTH2_USER_NAME = "username"; + public static final String OAUTH2_PASSWORD = "password"; + + public static final String OIDC_GET_USERNAME = "preferred_username"; + public static final String IAM2_ORGANIZATIONS = "organization"; + + public static final String OIDC_SSO_CLIENT_TYPE = "OIDC"; + public static final String OAUTH2_SSO_CLIENT_TYPE = "OAuth2"; + + public static final String ID_TOKEN_VALUE = "id_token"; + public static final String ACCESS_TOKEN_VALUE = "access_token"; + public static final String TOKEN_EXPIRE_TIME_NAME = "exp"; + + String DEFAULT_PROVIDER_NAME = "default"; + String PLUGIN_PROVIDER_NAME = "plugin"; + String ZF_PROVIDER_NAME = "zf"; + String ALI_PROVIDER_NAME = "ali_idaas_private"; + String MAX_KEY_PROVIDER_NAME = "max_key"; +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java new file mode 100644 index 00000000000..d6bbeada4f2 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sso/OAuth2ProviderDriver.java @@ -0,0 +1,65 @@ +package org.zstack.abstraction.sso; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponentsBuilder; +import org.zstack.abstraction.PluginDriver; + +import java.util.Map; + +public interface OAuth2ProviderDriver extends PluginDriver { + default String type() { + return "sso"; + } + + default String prepareUrl(String requestUrl, MultiValueMap map, HttpHeaders headers) { + return UriComponentsBuilder.fromHttpUrl(requestUrl).toUriString(); + } + + default HttpEntity> prepareReq(MultiValueMap map, HttpHeaders headers) { + return new HttpEntity<>(map, headers); + } + + default MultiValueMap generateRequestCode(String code, String thirdPartyRedirectUrl, Map client) { + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add(OAuth2PluginConstants.GRANT_TYPE_NAME, OAuth2PluginConstants.GRANT_TYPE_OCDE_VALUE); + map.add(OAuth2PluginConstants.AUTH_REDIRECT_URL_NAME, thirdPartyRedirectUrl); + map.add(OAuth2PluginConstants.CLIENT_ID_NAME, client.get("clientId")); + map.add(OAuth2PluginConstants.CLIENT_SECRET_NAME, client.get("clientSecret")); + map.add(OAuth2PluginConstants.OAUTH2_CODE, code); + map.add(OAuth2PluginConstants.AUTH_SCOPE_NAME, StringUtils.isEmpty(client.get("scope")) ? OAuth2PluginConstants.AUTH_SCOPE_VALUE : client.get("scope").replace("::", " ")); + return map; + } + + default RequestData buildRequestTokenData(MultiValueMap map, String requestUrl) { + return new RequestData(requestUrl, map, HttpMethod.POST, new HttpHeaders()); + } + + default RequestData buildRequestLogOutData(MultiValueMap map, String requestUrl) { + return new RequestData(requestUrl, map, HttpMethod.POST, new HttpHeaders()); + } + + default boolean skipRefreshToken() { + return false; + } + + default RequestData buildRequestRefreshTokenData(MultiValueMap map, String requestUrl) { + return new RequestData(requestUrl, map, HttpMethod.POST, new HttpHeaders()); + } + + default RequestData buildRequestTokenIntrospectData(MultiValueMap map, String requestUrl, HttpHeaders headers) { + return new RequestData(requestUrl, map, HttpMethod.POST, headers); + } + + default Map parseUserInfo(Map response) { + return response; + } + + default RequestData buildRequestUserInfoData(MultiValueMap map, String requestUrl, HttpHeaders headers) { + return new RequestData(requestUrl, map, HttpMethod.POST, headers); + } +} diff --git a/abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java b/abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java new file mode 100644 index 00000000000..be2828b0725 --- /dev/null +++ b/abstraction/src/main/java/org/zstack/abstraction/sso/RequestData.java @@ -0,0 +1,19 @@ +package org.zstack.abstraction.sso; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.util.MultiValueMap; + +public class RequestData { + public String requestUrl; + public HttpMethod method; + public MultiValueMap map; + public HttpHeaders headers; + + public RequestData(String requestUrl, MultiValueMap map, HttpMethod method, HttpHeaders headers) { + this.requestUrl = requestUrl; + this.method = method; + this.map = map; + this.headers = headers; + } +} diff --git a/build/bump_version.py b/build/bump_version.py new file mode 100644 index 00000000000..5b4ffec093b --- /dev/null +++ b/build/bump_version.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +import subprocess +import sys +import re +import os + + +def get_files(paths=['.', 'premium']): + all_files = [] + for path in paths: + if os.path.exists(path): + result = subprocess.run(['git', 'ls-files'], + cwd=path, + capture_output=True, + text=True) + files = result.stdout.splitlines() + path_files = [(os.path.join(path, f), + 'pom' if 'pom.xml' in f else 'global') + for f in files + if 'pom.xml' in f or 'GlobalProperty' in f] + all_files.extend(path_files) + return all_files + + +def update_version_in_pom(file_path, new_version): + try: + # 使用 'rb' 模式读取,保留原始字节 + with open(file_path, 'rb') as f: + content = f.read() + + # 将字节转换为字符串进行处理 + str_content = content.decode('utf-8') + pattern = r'(.*?)(.*?)(.*?)' + regex = re.compile(pattern, re.DOTALL) + + if not regex.search(str_content): + print(f"Skipped {file_path} - no matching parent version found") + return + + def replace_version(match): + old_version = match.group(2) + print(f"In {file_path}: Changing version from { + old_version} to {new_version}") + return f'{match.group(1)}{new_version}{match.group(3)}' + + new_content = regex.sub(replace_version, str_content) + + if new_content != str_content: + # 使用 'wb' 模式写入,确保字节级别的一致性 + with open(file_path, 'wb') as f: + f.write(new_content.encode('utf-8')) + print(f"Updated {file_path}") + + except Exception as e: + print(f"Error processing {file_path}: {str(e)}") + + +def update_version_in_global_property(file_path, old_version, new_version): + try: + # 使用 'rb' 模式读取,保留原始字节 + with open(file_path, 'rb') as f: + content = f.read() + + # 将字节转换为字符串进行处理 + str_content = content.decode('utf-8') + pattern = r'(@GlobalProperty\s*\([^)]*defaultValue\s*=\s*"[^"]*?)' + \ + re.escape(old_version) + r'(\.tar\.gz"[^)]*\))' + regex = re.compile(pattern) + + if not regex.search(str_content): + print( + f"Skipped {file_path} - no matching version in GlobalProperty") + return + + def replace_version(match): + print(f"In {file_path}: Changing version from { + old_version} to {new_version}") + return f'{match.group(1)}{new_version}{match.group(2)}' + + new_content = regex.sub(replace_version, str_content) + + if new_content != str_content: + # 使用 'wb' 模式写入,确保字节级别的一致性 + with open(file_path, 'wb') as f: + f.write(new_content.encode('utf-8')) + print(f"Updated {file_path}") + + except Exception as e: + print(f"Error processing {file_path}: {str(e)}") + + +def main(): + if len(sys.argv) != 3: + print("Usage: python script.py ") + print("Example: python script.py 5.2.0 5.3.0") + sys.exit(1) + + old_version = sys.argv[1] + new_version = sys.argv[2] + files = get_files() + + print(f"Found {len(files)} files to process") + for file_path, file_type in files: + if file_type == 'pom': + update_version_in_pom(file_path, new_version) + else: + update_version_in_global_property( + file_path, old_version, new_version) + + +if __name__ == "__main__": + main() diff --git a/build/deploydb.sh b/build/deploydb.sh index 49964c58754..b0d922475bc 100755 --- a/build/deploydb.sh +++ b/build/deploydb.sh @@ -12,6 +12,13 @@ if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then MYSQL='sudo mysql' fi +if command -v greatdb &> /dev/null; then + MYSQL='greatdb' + if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo greatdb' + fi +fi + base=`dirname $0` if [[ ! -n $host ]] || [[ ! -n $port ]];then @@ -20,17 +27,33 @@ else loginCmd="--user=$user --password=$password --host=$host --port=$port" fi -${MYSQL} ${loginCmd} << EOF -set global log_bin_trust_function_creators=1; -DROP DATABASE IF EXISTS zstack; -CREATE DATABASE zstack; -DROP DATABASE IF EXISTS zstack_rest; -CREATE DATABASE zstack_rest; -grant all privileges on zstack.* to root@'%' identified by "${password}"; -grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; -grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; -grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; +if command -v greatdb &> /dev/null; then + ${MYSQL} ${loginCmd} << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY "${password}"; + CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY "${password}"; + grant all privileges on zstack.* to root@'%'; + grant all privileges on zstack_rest.* to root@'%'; + grant all privileges on zstack.* to root@'127.0.0.1'; + grant all privileges on zstack_rest.* to root@'127.0.0.1'; EOF +else + ${MYSQL} ${loginCmd} << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + grant all privileges on zstack.* to root@'%' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; + grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; +EOF +fi # assign flyway version if not defined : "${flywayver:=3.2.1}" diff --git a/build/pom.xml b/build/pom.xml index 2d4d59a8ae6..504841e00b9 100755 --- a/build/pom.xml +++ b/build/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. build @@ -34,6 +34,9 @@ WEB-INF/lib/groovy-2.4.7.jar, WEB-INF/lib/sisu-guava-0.9.9.jar, WEB-INF/lib/groovy-sandbox-1.19.jar, + WEB-INF/lib/bcpkix-jdk18on-1.72.jar, + WEB-INF/lib/bcprov-jdk18on-1.72.jar, + WEB-INF/lib/bcutil-jdk18on-1.72.jar, @@ -372,6 +375,11 @@ sanyuan ${project.version} + + org.zstack + proxy + ${project.version} + org.zstack zstack-ticket @@ -613,6 +621,26 @@ hostNetworkInterface ${project.version} + + org.zstack + ovn + ${project.version} + + + org.zstack + observabilityServer + ${project.version} + + + org.zstack + zdfs + ${project.version} + + + org.zstack + huawei-imaster + ${project.version} + @@ -892,6 +920,21 @@ sshKeyPair ${project.version} + + org.zstack + ai + ${project.version} + + + org.zstack + container + ${project.version} + + + org.zstack + iam2-container + ${project.version} + org.zstack snmp @@ -902,5 +945,15 @@ hostNetworkInterface ${project.version} + + org.zstack + observabilityServer + ${project.version} + + + org.zstack + huawei-imaster + ${project.version} + diff --git a/compute/pom.xml b/compute/pom.xml index ae7e85340e7..e87ed4a4b12 100755 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. compute @@ -132,5 +132,10 @@ directory ${project.version} + + org.zstack + configuration + ${project.version} + diff --git a/compute/src/main/java/org/zstack/compute/VmNicUtils.java b/compute/src/main/java/org/zstack/compute/VmNicUtils.java index 703c7f8b741..6d001bdfb86 100644 --- a/compute/src/main/java/org/zstack/compute/VmNicUtils.java +++ b/compute/src/main/java/org/zstack/compute/VmNicUtils.java @@ -11,6 +11,8 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.argerr; +import static org.zstack.header.vm.VmInstanceConstant.VM_NIC_QOS_MAX; +import static org.zstack.header.vm.VmInstanceConstant.VM_NIC_QOS_MIN; public class VmNicUtils { public static void validateVmParms(List vmNicParms, List l3Uuids, List supportNicDriverTypes) { @@ -33,13 +35,13 @@ public static void validateVmParms(List vmNicParms, List l3U } if (nic.getOutboundBandwidth() != null) { - if (nic.getOutboundBandwidth() < 8192 || nic.getOutboundBandwidth() > 32212254720L) { + if (nic.getOutboundBandwidth() < VM_NIC_QOS_MIN || nic.getOutboundBandwidth() > VM_NIC_QOS_MAX) { throw new ApiMessageInterceptionException(argerr("outbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getOutboundBandwidth())); } } if (nic.getInboundBandwidth() != null) { - if (nic.getInboundBandwidth() < 8192 || nic.getInboundBandwidth() > 32212254720L) { + if (nic.getInboundBandwidth() < VM_NIC_QOS_MIN || nic.getInboundBandwidth() > VM_NIC_QOS_MAX) { throw new ApiMessageInterceptionException(argerr("inbound bandwidth[%d] of vm nic is out of [8192, 32212254720]", nic.getInboundBandwidth())); } } diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java new file mode 100644 index 00000000000..28e89c931c7 --- /dev/null +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.compute.allocator; + +import java.util.List; + +public interface AttachedL2NetworkAllocatorExtensionPoint { + List filter(List hostUuids, List l2Uuids); +} diff --git a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java old mode 100755 new mode 100644 index 0d70b40e0fe..cd986023bd1 --- a/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/AttachedL2NetworkAllocatorFlow.java @@ -4,19 +4,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.annotation.Transactional; -import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.allocator.AbstractHostAllocatorFlow; -import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostVO; import org.zstack.header.host.HostVO_; -import org.zstack.header.network.l2.L2NetworkAttachStatus; -import org.zstack.header.network.l2.L2NetworkClusterRefVO; -import org.zstack.header.network.l2.L2NetworkHostRefVO; -import org.zstack.header.network.l2.L2NetworkHostRefVO_; +import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkInventory; import javax.persistence.Tuple; @@ -25,12 +20,7 @@ import java.util.stream.Collectors; import org.zstack.utils.logging.CLogger; -import org.zstack.header.host.HostVO; -import org.zstack.header.host.HostVO_; -import org.zstack.core.db.Q; import org.zstack.utils.Utils; -import org.zstack.core.db.SimpleQuery; -import org.zstack.header.host.*; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) @@ -100,6 +90,14 @@ private List allocate(Collection l3NetworkUuids, Collection(); } + for (AttachedL2NetworkAllocatorExtensionPoint extp : pluginRgty.getExtensionList(AttachedL2NetworkAllocatorExtensionPoint.class)) { + retHostUuids = extp.filter(retHostUuids, l2uuids); + } + + if (retHostUuids.isEmpty()){ + return new ArrayList<>(); + } + sql = "select h from HostVO h where h.uuid in (:huuids)"; TypedQuery hq = dbf.getEntityManager().createQuery(sql, HostVO.class); hq.setParameter("huuids", retHostUuids); diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java index daf3a9259a2..814cf91b83a 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostAllocatorManagerImpl.java @@ -286,6 +286,7 @@ private void handle(ReportHostCapacityMessage msg) { vo.setAvailablePhysicalMemory(availMem); vo.setCpuNum(msg.getCpuNum()); vo.setCpuSockets(msg.getCpuSockets()); + vo.setCpuCoreNum(msg.getCpuCoreNum()); HostCapacityStruct s = new HostCapacityStruct(); s.setCpuSockets(vo.getCpuSockets()); @@ -308,6 +309,7 @@ private void handle(ReportHostCapacityMessage msg) { vo.setAvailablePhysicalMemory(availMem); vo.setTotalMemory(msg.getTotalMemory()); vo.setCpuSockets(msg.getCpuSockets()); + vo.setCpuCoreNum(msg.getCpuCoreNum()); HostCapacityStruct s = new HostCapacityStruct(); s.setCapacityVO(vo); @@ -327,10 +329,10 @@ private void handle(ReportHostCapacityMessage msg) { } private boolean needUpdateCapacity(HostCapacityVO vo, ReportHostCapacityMessage msg, long totalCpu, long avaliCpu, long availMem) { - return vo.getCpuNum() != msg.getCpuNum() || vo.getTotalCpu() != totalCpu + return vo.getCpuNum() != msg.getCpuNum() || vo.getTotalCpu() != totalCpu || vo.getAvailableCpu() != avaliCpu || vo.getTotalPhysicalMemory() != msg.getTotalMemory() || vo.getAvailablePhysicalMemory() != availMem || vo.getTotalMemory() != msg.getTotalMemory() - || vo.getCpuSockets() != msg.getCpuSockets(); + || vo.getCpuSockets() != msg.getCpuSockets() || vo.getCpuCoreNum() != msg.getCpuCoreNum(); } private void handle(final AllocateHostMsg msg) { diff --git a/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java b/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java index b6376025859..aa4a0a6de31 100755 --- a/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/allocator/HostCapacityReserveManagerImpl.java @@ -266,7 +266,7 @@ private void reserveCapacityWithChecking(String hostUuid, long requestCpu, long updater.run(cap -> { long availCpu = cap.getAvailableCpu() - requestCpu; - if (requestCpu != 0 && availCpu < 0) { + if (requestCpu != 0 && availCpu - ret.getReservedCpuCapacity() < 0) { throw new UnableToReserveHostCapacityException( String.format("no enough CPU[%s] on the host[uuid:%s]", requestCpu, hostUuid)); } diff --git a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java index d82e3e69b23..5cb565683f4 100644 --- a/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java +++ b/compute/src/main/java/org/zstack/compute/allocator/ResourceBindingAllocatorFlow.java @@ -90,6 +90,17 @@ public void allocate() { // get bind resources from config ResourceBindingClusterCollector clusterCollector = new ResourceBindingClusterCollector(); if (!resourceConfig) { + //remove bind cluster uuid from system tag, use current cluster uuid from config + if (resources.containsKey(clusterCollector.getType())) { + List uuids = resources.get(clusterCollector.getType()); + if (!uuids.contains(spec.getVmInstance().getClusterUuid())) { + String tag = String.format("Cluster:%s", spec.getVmInstance().getClusterUuid()); + VmSystemTags.VM_RESOURCE_BINGDING.updateTagByToken(spec.getVmInstance().getUuid(), + VmSystemTags.VM_RESOURCE_BINGDING_TOKEN, tag); + } + resources.remove(clusterCollector.getType()); + } + resources.computeIfAbsent(clusterCollector.getType(), k -> new ArrayList<>()).add(spec.getVmInstance().getClusterUuid()); } diff --git a/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java b/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java index ecad4823e90..cc21cfb257a 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/host/HostApiInterceptor.java @@ -55,11 +55,37 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIChangeHostStateMsg) msg); } else if (msg instanceof APIGetHostWebSshUrlMsg) { validate((APIGetHostWebSshUrlMsg) msg); + } else if (msg instanceof APICreateHostNetworkServiceTypeMsg) { + validate((APICreateHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIDeleteHostNetworkServiceTypeMsg) { + validate((APIDeleteHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIUpdateHostNetworkServiceTypeMsg) { + validate((APIUpdateHostNetworkServiceTypeMsg) msg); } return msg; } + private void validate(APIDeleteHostNetworkServiceTypeMsg msg) { + if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.uuid, msg.getUuid()) + .eq(HostNetworkLabelVO_.system, Boolean.TRUE).isExists()) { + throw new ApiMessageInterceptionException(argerr("system host network service type[%s] cannot be deleted", msg.getUuid())); + } + } + + private void validate(APIUpdateHostNetworkServiceTypeMsg msg) { + if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.uuid, msg.getUuid()) + .eq(HostNetworkLabelVO_.system, Boolean.TRUE).isExists()) { + throw new ApiMessageInterceptionException(argerr("system host network service type[%s] cannot be updated", msg.getUuid())); + } + } + + private void validate(APICreateHostNetworkServiceTypeMsg msg) { + if (Q.New(HostNetworkLabelVO.class).eq(HostNetworkLabelVO_.serviceType, msg.getServiceType()).isExists()) { + throw new ApiMessageInterceptionException(argerr("there has been a host network service type[%s]", msg.getServiceType())); + } + } + private void validate(APIGetHostWebSshUrlMsg msg) { String ZOPS_CONTAINER_NAME = "zops-controller"; ShellResult ret; diff --git a/compute/src/main/java/org/zstack/compute/host/HostBase.java b/compute/src/main/java/org/zstack/compute/host/HostBase.java index dad898b017c..2d2d3ed64ce 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostBase.java +++ b/compute/src/main/java/org/zstack/compute/host/HostBase.java @@ -54,6 +54,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import static org.zstack.core.Platform.*; import static org.zstack.utils.CollectionDSL.e; @@ -261,7 +262,6 @@ private void handle(APIShutdownHostMsg msg) { final APIShutdownHostEvent event = new APIShutdownHostEvent(msg.getId()); ShutdownHostMsg shutdownHostMsg = new ShutdownHostMsg(); shutdownHostMsg.setMethod(HostPowerManagementMethod.valueOf(msg.getMethod())); - shutdownHostMsg.setWaitTaskCompleted(!msg.isReturnEarly()); shutdownHostMsg.setReturnEarly(msg.isReturnEarly()); shutdownHostMsg.setUuid(msg.getUuid()); shutdownHostMsg.setForce(msg.isForce()); @@ -1192,7 +1192,7 @@ protected boolean changeConnectionState(final HostStatusEvent event) { return changeConnectionState(event, null); } - protected boolean changeConnectionState(final HostStatusEvent event, Runnable runnable) { + protected boolean changeConnectionState(final HostStatusEvent event, Consumer consumer) { String hostUuid = self.getUuid(); self = dbf.reload(self); if (self == null) { @@ -1206,7 +1206,7 @@ protected boolean changeConnectionState(final HostStatusEvent event, Runnable ru } self.setStatus(next); - Optional.ofNullable(runnable).ifPresent(Runnable::run); + Optional.ofNullable(consumer).ifPresent(it -> it.accept(self)); self = dbf.updateAndRefresh(self); logger.debug(String.format("Host %s [uuid:%s] changed connection state from %s to %s", self.getName(), self.getUuid(), before, next)); diff --git a/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java b/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java index 349e9a54948..b13f95673c7 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java +++ b/compute/src/main/java/org/zstack/compute/host/HostGlobalConfig.java @@ -56,4 +56,7 @@ public class HostGlobalConfig { @GlobalConfigValidation(numberGreaterThan = 1) public static GlobalConfig SYNC_HOST_HW_MONITOR_INTERVAL = new GlobalConfig(CATEGORY, "sync.host.hw.monitor.interval"); + @GlobalConfigValidation + @GlobalConfigDef(type = String.class, defaultValue = "10501:10999", description = "nbd port range") + public static GlobalConfig NBD_PORT_RANGE = new GlobalConfig(CATEGORY, "nbd.port.range"); } diff --git a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java index 7bb2bdf10c8..10dfe6049d1 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java @@ -115,11 +115,119 @@ private void handleApiMessage(APIMessage msg) { } else if (msg instanceof HostMessage) { HostMessage hmsg = (HostMessage) msg; passThrough(hmsg); + } else if (msg instanceof APICreateHostNetworkServiceTypeMsg) { + handle((APICreateHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIUpdateHostNetworkServiceTypeMsg) { + handle((APIUpdateHostNetworkServiceTypeMsg) msg); + } else if (msg instanceof APIDeleteHostNetworkServiceTypeMsg) { + handle((APIDeleteHostNetworkServiceTypeMsg) msg); } else { bus.dealWithUnknownMessage(msg); } } + + private void handle(APIDeleteHostNetworkServiceTypeMsg msg) { + APIDeleteHostNetworkServiceTypeEvent event = new APIDeleteHostNetworkServiceTypeEvent(msg.getId()); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public void run(SyncTaskChain chain) { + deleteHostNetworkLabel(msg, new Completion(msg, chain){ + @Override + public void success() { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + dbf.remove(vo); + logger.debug(String.format("delete host network service type[uuid:%s]", vo.getUuid())); + bus.publish(event); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + chain.next(); + } + }); + } + + @Override + public String getSyncSignature() { + return String.format("delete-host-network-label[uuid:%s]", msg.getUuid()); + } + + @Override + public String getName() { + return "delete-host-network-label"; + } + }); + } + + private void handle(APIUpdateHostNetworkServiceTypeMsg msg) { + APIUpdateHostNetworkServiceTypeEvent event = new APIUpdateHostNetworkServiceTypeEvent(msg.getId()); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public void run(SyncTaskChain chain) { + updateHostNetworkLabel(msg, new Completion(msg, chain){ + @Override + public void success() { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + vo.setServiceType(msg.getServiceType()); + vo.setSystem(msg.isSystem()); + dbf.updateAndRefresh(vo); + logger.debug(String.format("update host network service type[uuid:%s, serviceType:%s, system:%s]", + vo.getUuid(), vo.getServiceType(), vo.getSystem())); + event.setInventory(HostNetworkLabelInventory.valueOf(vo)); + bus.publish(event); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + chain.next(); + } + }); + } + + @Override + public String getSyncSignature() { + return String.format("update-host-network-label[uuid:%s]", msg.getUuid()); + } + + @Override + public String getName() { + return "update-host-network-label"; + } + }); + } + + private void handle(APICreateHostNetworkServiceTypeMsg msg) { + HostNetworkLabelVO vo = new HostNetworkLabelVO(); + vo.setUuid(Platform.getUuid()); + vo.setServiceType(msg.getServiceType()); + vo.setSystem(msg.isSystem()); + dbf.persist(vo); + logger.debug(String.format("create host network service type[uuid:%s, serviceType:%s, system:%s]", + vo.getUuid(), vo.getServiceType(), vo.getSystem())); + APICreateHostNetworkServiceTypeEvent event = new APICreateHostNetworkServiceTypeEvent(msg.getId()); + event.setInventory(HostNetworkLabelInventory.valueOf(vo)); + bus.publish(event); + } + + private void deleteHostNetworkLabel(APIDeleteHostNetworkServiceTypeMsg msg, Completion completion) { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(HostNetworkLabelExtensionPoint.class), + arg -> arg.deleteHostNetworkLabel(vo.toInventory(), completion)); + } + + private void updateHostNetworkLabel(APIUpdateHostNetworkServiceTypeMsg msg, Completion completion) { + HostNetworkLabelVO vo = dbf.findByUuid(msg.getUuid(), HostNetworkLabelVO.class); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(HostNetworkLabelExtensionPoint.class), + arg -> arg.updateHostNetworkLabel(vo.toInventory(), msg.getServiceType(), completion)); + } + private void handle(APIGetHostWebSshUrlMsg msg) { APIGetHostWebSshUrlEvent event = new APIGetHostWebSshUrlEvent(msg.getId()); GetHostWebSshUrlMsg getHostWebSshUrlMsg = new GetHostWebSshUrlMsg(); @@ -262,17 +370,27 @@ public String getName() { } private void doAddHost(final AddHostMessage msg, ReturnValueCompletion completion) { - if (Q.New(HostVO.class).eq(HostVO_.managementIp, msg.getManagementIp()).isExists()) { - completion.fail(argerr("there has been a host having managementIp[%s]", msg.getManagementIp())); - return; - } - final ClusterVO cluster = findClusterByUuid(msg.getClusterUuid()); if (cluster == null) { completion.fail(argerr("cluster[uuid:%s] is not existing", msg.getClusterUuid())); return; } + String hvType = cluster.getHypervisorType(); + if (hvType == null) { + completion.fail(argerr("cluster[uuid:%s] has null hypervisorType", msg.getClusterUuid())); + return; + } + + if (Q.New(HostVO.class) + .eq(HostVO_.managementIp, msg.getManagementIp()) + .eq(HostVO_.hypervisorType, hvType) + .isExists()) { + completion.fail(argerr("there has been a host having managementIp[%s] for hypervisor[%s]", + msg.getManagementIp(), hvType)); + return; + } + final HostVO hvo = new HostVO(); if (msg.getResourceUuid() != null) { hvo.setUuid(msg.getResourceUuid()); @@ -621,33 +739,37 @@ public String getName() { @Override public void run() { - List ipmis = Q.New(HostIpmiVO.class).list(); + List ipmis = Q.New(HostIpmiVO.class) + .list(); + + ipmis = ipmis.stream().filter(i -> destMaker.isManagedByUs(i.getUuid())).collect(Collectors.toList()); new While<>(ipmis).step((ipmi, comp) -> { refreshHostPowerStatus(ipmi); comp.done(); },10).run(new NopeWhileDoneCompletion()); } - @AsyncThread private void refreshHostPowerStatus(HostIpmiVO ipmi) { if (ipmi == null) { return; } HostPowerStatus status = HostIpmiPowerExecutor.getPowerStatus(ipmi); - if ( HostPowerStatus.POWER_BOOTING == ipmi.getIpmiPowerStatus() + if (HostPowerStatus.POWER_BOOTING == ipmi.getIpmiPowerStatus() && HostPowerStatus.POWER_OFF == status) { return; } - if ( HostPowerStatus.POWER_SHUTDOWN == ipmi.getIpmiPowerStatus() + if (HostPowerStatus.POWER_SHUTDOWN == ipmi.getIpmiPowerStatus() && HostPowerStatus.POWER_ON == status) { return; } if (ipmi.getIpmiPowerStatus() != status) { - ipmi.setIpmiPowerStatus(status); - dbf.update(ipmi); + SQL.New(HostIpmiVO.class) + .set(HostIpmiVO_.ipmiPowerStatus, status) + .eq(HostIpmiVO_.uuid, ipmi.getUuid()) + .update(); } } }); diff --git a/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java b/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java index caf94d1ad87..8de3693633c 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/host/HostSystemTags.java @@ -106,4 +106,7 @@ public class HostSystemTags { public static String MEMORY_SLOTS_MAXIMUM_TOKEN = "memorySlotsMaximum"; public static PatternedSystemTag MEMORY_SLOTS_MAXIMUM = new PatternedSystemTag(String.format("memorySlotsMaximum::{%s}", MEMORY_SLOTS_MAXIMUM_TOKEN), HostVO.class); + + public static String DEPLOY_MODE_TOKEN = "deployMode"; + public static PatternedSystemTag DEPLOY_MODE = new PatternedSystemTag(String.format("deployMode::{%s}", DEPLOY_MODE_TOKEN), HostVO.class); } diff --git a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java index 3d5684914b0..49394e88b78 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java @@ -1,5 +1,7 @@ package org.zstack.compute.host; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.cloudbus.*; @@ -35,6 +37,7 @@ public class HostTrackImpl implements HostTracker, ManagementNodeChangeListener, private Map trackers = new ConcurrentHashMap<>(); private static boolean alwaysStartRightNow = false; + private static final Cache skippedPingHostDeadline = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build(); @Autowired private DatabaseFacade dbf; @@ -124,6 +127,12 @@ private void track() { return; } + if (skippedPingHostDeadline.getIfPresent(uuid) != null && System.currentTimeMillis() / 1000 <= skippedPingHostDeadline.getIfPresent(uuid)) { + logger.debug(String.format("skip tracking host[uuid:%s] this time, deadline %s", uuid, skippedPingHostDeadline.getIfPresent(uuid))); + continueToRunThisTimer(); + return; + } + PingHostMsg msg = new PingHostMsg(); msg.setHostUuid(uuid); bus.makeLocalServiceId(msg, HostConstant.SERVICE_ID); @@ -341,6 +350,7 @@ private HostReconnectTaskFactory getHostReconnectTaskFactory(String hvType) { public boolean start() { populateExtensions(); onHostStatusChange(); + onHostPingSkip(); HostGlobalConfig.PING_HOST_INTERVAL.installUpdateExtension((oldConfig, newConfig) -> { logger.debug(String.format("%s change from %s to %s, restart host trackers", @@ -386,6 +396,24 @@ protected void run(Map tokens, Object data) { }); } + private void onHostPingSkip() { + evtf.on(HostCanonicalEvents.HOST_PING_SKIP, new EventCallback() { + @Override + protected void run(Map tokens, Object data) { + HostCanonicalEvents.HostPingSkipData d = (HostCanonicalEvents.HostPingSkipData) data; + Long deadline = System.currentTimeMillis() / 1000 + d.getSkipTimeInSec(); + skippedPingHostDeadline.put(d.getHostUuid(), deadline); + } + }); + evtf.on(HostCanonicalEvents.HOST_PING_CANCEL_SKIP, new EventCallback() { + @Override + protected void run(Map tokens, Object data) { + HostCanonicalEvents.HostPingSkipData d = (HostCanonicalEvents.HostPingSkipData) data; + skippedPingHostDeadline.invalidate(d.getHostUuid()); + } + }); + } + @Override public boolean stop() { return true; diff --git a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java index 15bf4c1cf73..5d500f451b5 100644 --- a/compute/src/main/java/org/zstack/compute/vm/MacOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/MacOperator.java @@ -3,18 +3,22 @@ import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.Platform; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.errorcode.OperationFailureException; -import org.zstack.header.network.l3.*; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.vm.*; import org.zstack.tag.PatternedSystemTag; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.NetworkUtils; import java.math.BigInteger; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -28,6 +32,7 @@ public class MacOperator { private static final CLogger logger = Utils.getLogger(MacOperator.class); private static final Pattern pattern = Pattern.compile("([a-f0-9]{2}:){5}[a-f0-9]{2}"); + private static final Random random = new Random(); class VmMacStruct { private String l3Uuid; @@ -39,9 +44,6 @@ public VmMacStruct(String l3Uuid, String mac) { } } - @Autowired - private DatabaseFacade dbf; - private PatternedSystemTag that = VmSystemTags.CUSTOM_MAC; public List getMacInfobyVmUuid(String vmUuid) { @@ -94,15 +96,110 @@ public void validateAvailableMac(String mac) { } } - public boolean checkDuplicateMac(String hypervisorType, String mac) { + public boolean checkDuplicateMac(String hypervisorType, String l3Uuid, String mac) { if (!VmInstanceConstant.KVM_HYPERVISOR_TYPE.equals(hypervisorType)) { return false; } + L3NetworkVO l3vo = Q.New(L3NetworkVO.class) + .eq(L3NetworkVO_.uuid, l3Uuid).find(); + if (l3vo == null) { + return false; + } + + List l3Uuids = Q.New(L3NetworkVO.class) + .select(L3NetworkVO_.uuid) + .eq(L3NetworkVO_.l2NetworkUuid, l3vo.getL2NetworkUuid()) + .listValues(); + + if (l3Uuids.isEmpty()) { + return false; + } + return Q.New(VmNicVO.class) .eq(VmNicVO_.hypervisorType, hypervisorType) .eq(VmNicVO_.mac, mac.toLowerCase()) + .in(VmNicVO_.l3NetworkUuid, l3Uuids) .notEq(VmNicVO_.state, VmNicState.disable) .isExists(); } + + public static String generateMacWithDeviceId(short deviceId) { + VmMacAddressSchemaType type; + try { + type = VmMacAddressSchemaType.valueOf(VmGlobalProperty.vmMacAddressSchema); + } catch (Exception e) { + type = VmMacAddressSchemaType.Random; + } + + switch (type) { + case Ip: + return generateMacWithDeviceIdIp(deviceId); + case Random: + default: + return generateMacWithDeviceIdRandom(deviceId); + } + } + + public static String generateMacWithDeviceIdIp(short deviceId) { + String mgtIp = Platform.getManagementServerIp(); + if (!NetworkUtils.isIpv4Address(mgtIp)) { + return generateMacWithDeviceIdRandom(deviceId); + } + + /* encode mgt ip address into mac address: for example, + * mgt ip is: 172.24.0.81, its hex string: AC 18 00 51, + * so mac address will look like: fa:00:51:xx:xx:yy + * xx:xx are random. yy is device ID */ + int mgtIpL = (int)NetworkUtils.ipv4StringToLong(mgtIp); + String mgtIpStr = Integer.toHexString(mgtIpL); + if (mgtIpStr.length() < 8) { + String compensate = StringUtils.repeat("0", 8 - mgtIpStr.length()); + mgtIpStr = compensate + mgtIpStr; + } + + StringBuilder sb = new StringBuilder("fa").append(":"); + sb.append(mgtIpStr, 4, 6).append(":"); + sb.append(mgtIpStr, 6, 8).append(":"); + + int seed = random.nextInt(); + String seedStr = Integer.toHexString(seed); + if (seedStr.length() < 4) { + String compensate = StringUtils.repeat("0", 4 - seedStr.length()); + seedStr = compensate + seedStr; + } + + sb.append(seedStr, 0, 2).append(":"); + sb.append(seedStr, 2, 4).append(":"); + String deviceIdStr = Integer.toHexString(deviceId); + if (deviceIdStr.length() < 2) { + deviceIdStr = "0" + deviceIdStr; + } + sb.append(deviceIdStr); + return sb.toString(); + } + + public static String generateMacWithDeviceIdRandom(short deviceId) { + int seed = random.nextInt(); + String seedStr = Integer.toHexString(seed); + if (seedStr.length() < 8) { + String compensate = StringUtils.repeat("0", 8 - seedStr.length()); + seedStr = compensate + seedStr; + } + String octet2 = seedStr.substring(0, 2); + String octet3 = seedStr.substring(2, 4); + String octet4 = seedStr.substring(4, 6); + String octet5 = seedStr.substring(6, 8); + StringBuilder sb = new StringBuilder("fa").append(":"); + sb.append(octet2).append(":"); + sb.append(octet3).append(":"); + sb.append(octet4).append(":"); + sb.append(octet5).append(":"); + String deviceIdStr = Integer.toHexString(deviceId); + if (deviceIdStr.length() < 2) { + deviceIdStr = "0" + deviceIdStr; + } + sb.append(deviceIdStr); + return sb.toString(); + } } diff --git a/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java b/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java index 183b095154a..0fe152196f5 100755 --- a/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/StaticIpOperator.java @@ -318,8 +318,7 @@ public void validateSystemTagInCreateMessage(APICreateMessage msg) { validateSystemTagInApiMessage(msg); } - public void validateSystemTagInApiMessage(APIMessage msg) { - Map staticIps = getNicNetworkInfoBySystemTag(msg.getSystemTags()); + public List fillUpStaticIpInfoToVmNics(Map staticIps) { List newSystags = new ArrayList<>(); for (Map.Entry e : staticIps.entrySet()) { String l3Uuid = e.getKey(); @@ -350,7 +349,7 @@ public void validateSystemTagInApiMessage(APIMessage msg) { )); } else if (!nicIp.ipv4Netmask.equals(ipRangeVO.getNetmask())) { throw new ApiMessageInterceptionException(operr("netmask error, expect: %s, got: %s", - ipRangeVO.getNetmask(), nicIp.ipv4Netmask)); + ipRangeVO.getNetmask(), nicIp.ipv4Netmask)); } if (StringUtils.isEmpty(nicIp.ipv4Gateway)) { @@ -397,10 +396,16 @@ public void validateSystemTagInApiMessage(APIMessage msg) { } } } + } - if (!newSystags.isEmpty()) { - msg.getSystemTags().addAll(newSystags); - } + return newSystags; + } + + public void validateSystemTagInApiMessage(APIMessage msg) { + Map staticIps = getNicNetworkInfoBySystemTag(msg.getSystemTags()); + List newSystags = fillUpStaticIpInfoToVmNics(staticIps); + if (!newSystags.isEmpty()) { + msg.getSystemTags().addAll(newSystags); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java index b316305a6b6..89631335ea4 100644 --- a/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/TfVmNicFactory.java @@ -4,6 +4,8 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.workflow.FlowException; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.VSwitchType; import org.zstack.header.vm.*; import org.zstack.identity.Account; import org.zstack.utils.Utils; @@ -15,7 +17,9 @@ public class TfVmNicFactory extends VmNicFactory { private static final CLogger logger = Utils.getLogger(TfVmNicFactory.class); + private static final VSwitchType vSwitchType = new VSwitchType(VmInstanceConstant.L2_TF_VSWITCH_TYPE); private static final VmNicType type = new VmNicType(VmInstanceConstant.TF_VIRTUAL_NIC_TYPE); + @Autowired private CloudBus bus; @Autowired @@ -23,6 +27,9 @@ public class TfVmNicFactory extends VmNicFactory { @Override public VmNicType getType() { + type.setHasAddon(true); + vSwitchType.addVmNicType(VmNicType.VmNicSubType.NONE, type); + return type; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java index a614bd0fb1d..b463cca81b0 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAfterInstantiateVolumeInAttachingVolumeFlow.java @@ -4,6 +4,8 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.workflow.FlowTrigger; @@ -18,8 +20,11 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAfterInstantiateVolumeInAttachingVolumeFlow extends NoRollbackFlow { - CLogger logger = Utils.getLogger(VmAfterInstantiateVolumeInAttachingVolumeFlow.class); - + private static final CLogger logger = Utils.getLogger(VmAfterInstantiateVolumeInAttachingVolumeFlow.class); + @Autowired + private DatabaseFacade dbf; + @Autowired + private PluginRegistry pluginRegistry; @Autowired ErrorFacade errf; @Autowired diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java index 962412de85a..ee542fe36ee 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java @@ -110,10 +110,7 @@ public String call(L3NetworkInventory arg) { } if (msg.getAllocatorStrategy() == null && - (spec.getRequiredClusterUuid() != null - || spec.getRequiredHostUuid() != null - || CollectionUtils.isEmpty(spec.getRequiredClusterUuids()) - || CollectionUtils.isEmpty(spec.getVmInventory().getVmNics()))) { + (!CollectionUtils.isEmpty(msg.getClusterUuids()) || msg.getHostUuid() != null)) { msg.setAllocatorStrategy(HostAllocatorConstant.DESIGNATED_HOST_ALLOCATOR_STRATEGY_TYPE); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java index 365e6d6d13f..3589d8c7307 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java @@ -101,7 +101,7 @@ public void run(final FlowTrigger trigger, final Map data) { mo.deleteCustomMacSystemTag(spec.getVmInventory().getUuid(), nw.getUuid(), customMac); customMac = customMac.toLowerCase(); } else { - customMac = NetworkUtils.generateMacWithDeviceId((short) deviceId); + customMac = MacOperator.generateMacWithDeviceId((short) deviceId); } final String mac = customMac; CustomNicOperator nicOperator = new CustomNicOperator(spec.getVmInventory().getUuid(),nw.getUuid()); @@ -128,7 +128,7 @@ public void run(final FlowTrigger trigger, final Map data) { nic.setMac(mac); nic.setHypervisorType(spec.getDestHost() == null ? spec.getVmInventory().getHypervisorType() : spec.getDestHost().getHypervisorType()); - if (mo.checkDuplicateMac(nic.getHypervisorType(), nic.getMac())) { + if (mo.checkDuplicateMac(nic.getHypervisorType(), nic.getL3NetworkUuid(), nic.getMac())) { trigger.fail(operr("Duplicate mac address [%s]", nic.getMac())); return; } @@ -136,8 +136,8 @@ public void run(final FlowTrigger trigger, final Map data) { if (!StringUtils.isEmpty(nicSpec.getNicDriverType())) { nic.setDriverType(nicSpec.getNicDriverType()); } else { - boolean vmHasVirtio = VmSystemTags.VIRTIO.hasTag(spec.getVmInventory().getUuid()); - nicManager.setNicDriverType(nic, vmHasVirtio, + boolean vmImageHasVirtio = VmSystemTags.VIRTIO.hasTag(spec.getVmInventory().getUuid()); + nicManager.setNicDriverType(nic, vmImageHasVirtio, ImagePlatform.valueOf(spec.getVmInventory().getPlatform()).isParaVirtualization(), spec.getVmInventory()); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java index 007f5b71a5e..bb0fdafcb01 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicIpFlow.java @@ -168,8 +168,8 @@ public void done(ErrorCodeList errorCodeList) { UsedIpVO ipVO = Q.New(UsedIpVO.class).eq(UsedIpVO_.uuid, usedIp.getUuid()).find(); ipVO.setVmNicUuid(nic.getUuid()); ipVOS.add(ipVO); + nic.getUsedIps().add(ipVO); } - nic.setUsedIps(ipVOS); nicsWithIp.add(nic); spec.getDestNics().removeIf(inv -> nic.getUuid().equals(inv.getUuid())); spec.getDestNics().add(VmNicInventory.valueOf(nic)); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java index 9a05509d53e..bc2f59d6cdc 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocatePrimaryStorageForAttachingDiskFlow.java @@ -1,13 +1,11 @@ package org.zstack.compute.vm; -import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.SQL; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.core.workflow.Flow; import org.zstack.header.core.workflow.FlowRollback; @@ -19,13 +17,10 @@ import org.zstack.header.storage.primary.*; import org.zstack.header.vm.VmInstanceConstant; import org.zstack.header.vm.VmInstanceSpec; -import org.zstack.header.vm.VmInstanceSpec.VolumeSpec; import org.zstack.header.volume.VolumeInventory; -import java.util.Arrays; -import java.util.List; +import java.util.Collections; import java.util.Map; -import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -38,7 +33,7 @@ public class VmAllocatePrimaryStorageForAttachingDiskFlow implements Flow { @Autowired protected ErrorFacade errf; - private String allocatedInstallUrl; + private final String ALLOCATED_INSTALL_URL = "allocated_install_url"; @Override public void run(final FlowTrigger chain, final Map data) { @@ -63,25 +58,8 @@ public void run(final FlowTrigger chain, final Map data) { if (volume.isShareable()) { String clusterUuid = spec.getVmInventory().getClusterUuid(); - List vos = SQL.New("select pri" + - " from PrimaryStorageVO pri, PrimaryStorageClusterRefVO ref" + - " where ref.clusterUuid = :clusterUuid" + - " and ref.primaryStorageUuid = pri.uuid" + - " and pri.status = :status" + - " and pri.state = :priState") - .param("clusterUuid", clusterUuid) - .param("status", PrimaryStorageStatus.Connected) - .param("priState", PrimaryStorageState.Enabled) - .list(); - - if (CollectionUtils.isNotEmpty(vos)) { - amsg.setPossiblePrimaryStorageTypes(vos.stream() - .filter(v -> PrimaryStorageType.valueOf(v.getType()).isSupportSharedVolume()) - .map(PrimaryStorageVO::getType) - .collect(Collectors.toList())); - } - - amsg.setRequiredClusterUuids(Arrays.asList(clusterUuid)); + amsg.setRequiredClusterUuids(Collections.singletonList(clusterUuid)); + amsg.setRequiredFeatures(Collections.singleton(PrimaryStorageFeature.SHARED_VOLUME)); } else { amsg.setRequiredHostUuid(hinv.getUuid()); } @@ -91,9 +69,9 @@ public void run(final FlowTrigger chain, final Map data) { public void run(MessageReply reply) { if (reply.isSuccess()) { AllocatePrimaryStorageSpaceReply ar = (AllocatePrimaryStorageSpaceReply) reply; - allocatedInstallUrl = ar.getAllocatedInstallUrl(); + data.put(ALLOCATED_INSTALL_URL, ar.getAllocatedInstallUrl()); data.put(VmInstanceConstant.Params.DestPrimaryStorageInventoryForAttachingVolume.toString(), ar.getPrimaryStorageInventory()); - data.put(VmInstanceConstant.Params.AllocatedUrlForAttachingVolume.toString(), allocatedInstallUrl); + data.put(VmInstanceConstant.Params.AllocatedUrlForAttachingVolume.toString(), ar.getAllocatedInstallUrl()); data.put(VmAllocatePrimaryStorageForAttachingDiskFlow.class, ar.getSize()); chain.next(); } else { @@ -109,7 +87,7 @@ public void rollback(FlowRollback chain, Map data) { if (size != null) { PrimaryStorageInventory pri = (PrimaryStorageInventory) data.get(VmInstanceConstant.Params.DestPrimaryStorageInventoryForAttachingVolume.toString()); ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); - rmsg.setAllocatedInstallUrl(allocatedInstallUrl); + rmsg.setAllocatedInstallUrl((String)data.get(ALLOCATED_INSTALL_URL)); rmsg.setPrimaryStorageUuid(pri.getUuid()); rmsg.setDiskSize(size); bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, pri.getUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java index cdc5010a804..28fd645f421 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAssignDeviceIdToAttachingVolumeFlow.java @@ -31,7 +31,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmAssignDeviceIdToAttachingVolumeFlow implements Flow { - CLogger logger = Utils.getLogger(VmAssignDeviceIdToAttachingVolumeFlow.class); + private static final CLogger logger = Utils.getLogger(VmAssignDeviceIdToAttachingVolumeFlow.class); @Autowired private DatabaseFacade dbf; @Autowired diff --git a/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java index 51668d6dc0b..5b054dede75 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmCreateOnHypervisorFlow.java @@ -33,11 +33,7 @@ public class VmCreateOnHypervisorFlow implements Flow { @Autowired private EventFacade evtf; - private List exts; - - public VmCreateOnHypervisorFlow() { - exts = pluginRgty.getExtensionList(VmBeforeCreateOnHypervisorExtensionPoint.class); - } + private final List exts = pluginRgty.getExtensionList(VmBeforeCreateOnHypervisorExtensionPoint.class); private void fireExtensions(VmInstanceSpec spec) { for (VmBeforeCreateOnHypervisorExtensionPoint ext : exts) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmPriorityGlobalProperty.java b/compute/src/main/java/org/zstack/compute/vm/VmGlobalProperty.java similarity index 76% rename from compute/src/main/java/org/zstack/compute/vm/VmPriorityGlobalProperty.java rename to compute/src/main/java/org/zstack/compute/vm/VmGlobalProperty.java index 1e1ce074c68..0aace3b05b1 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmPriorityGlobalProperty.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmGlobalProperty.java @@ -8,10 +8,12 @@ * @ Date : Created in 14:22 2019/9/24 */ @GlobalPropertyDefinition -public class VmPriorityGlobalProperty { +public class VmGlobalProperty { @GlobalProperty(name="initRunningVmPriority", defaultValue = "false") public static boolean initRunningVmPriority; @GlobalProperty(name="initRunningApplianceVmPriority", defaultValue = "false") public static boolean initRunningApplianceVmPriority; + @GlobalProperty(name="vmMacAddressSchema", defaultValue = "random") + public static String vmMacAddressSchema; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java index 2ef9bc7aba3..fe1f33f104c 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceApiInterceptor.java @@ -26,8 +26,7 @@ import org.zstack.header.image.ImageConstant.ImageMediaType; import org.zstack.header.image.*; import org.zstack.header.message.APIMessage; -import org.zstack.header.network.l2.L2NetworkClusterRefVO; -import org.zstack.header.network.l2.L2NetworkClusterRefVO_; +import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO; import org.zstack.header.storage.primary.PrimaryStorageClusterRefVO_; @@ -879,11 +878,18 @@ private void validate(APIAttachL3NetworkToVmMsg msg) { newAddedL3Uuids, l2Uuids)); } - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2Uuids.get(0)) - .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); - if (clusterUuids.isEmpty()) { - throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", - newAddedL3Uuids, l2Uuids)); + List l2NetworkVOS = Q.New(L2NetworkVO.class).in(L2NetworkVO_.uuid, l2Uuids).list(); + List ovnL2Networks = l2NetworkVOS.stream().filter(vo -> + vo.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)).collect(Collectors.toList()); + l2NetworkVOS = l2NetworkVOS.stream().filter(vo -> + !vo.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)).collect(Collectors.toList()); + if (!l2NetworkVOS.isEmpty()) { + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2Uuids.get(0)) + .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); + if (clusterUuids.isEmpty()) { + throw new ApiMessageInterceptionException(operr("unable to attach a L3 network. The L3 network[uuid:%s] are belonged to l2 networks [uuids:%s] that have not been attached to any cluster", + newAddedL3Uuids, l2Uuids)); + } } String sql = "select nic.l3NetworkUuid from VmNicVO nic where nic.vmInstanceUuid = :vmUuid and nic.l3NetworkUuid in (:l3Uuids)"; @@ -1085,7 +1091,8 @@ private void validate(APIChangeVmNicStateMsg msg) { VmNicVO nicVO = Q.New(VmNicVO.class).eq(VmNicVO_.uuid, msg.getVmNicUuid()).find(); if (msg.getState().equals(VmNicState.enable.toString()) && !msg.getState().equals(nicVO.getState().toString())) { MacOperator mo = new MacOperator(); - if (mo.checkDuplicateMac(nicVO.getHypervisorType(), nicVO.getMac())) { + if (mo.checkDuplicateMac(nicVO.getHypervisorType(), nicVO.getL3NetworkUuid(), + nicVO.getMac())) { throw new ApiMessageInterceptionException(Platform.argerr("Duplicate mac address [%s]", nicVO.getMac())); } } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 466e1d2ec0d..ed98aef34e0 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -1510,7 +1510,8 @@ private void vmStateChangeOnHost(final VmStateChangedOnHostMsg msg, final NoErro completion.done(); return; } else if (operation == VmAbnormalLifeCycleOperation.VmNoStateFromRunningStateHostNotChanged - || operation == VmAbnormalLifeCycleOperation.VmNoStateFromCrashedStateHostNotChanged) { + || operation == VmAbnormalLifeCycleOperation.VmNoStateFromCrashedStateHostNotChanged + || operation == VmAbnormalLifeCycleOperation.VmNoStateFromUnknownStateHostNotChanged) { // the vm is detected on the host again. It's largely because the host disconnected before // and now reconnected changeVmStateInDb(VmInstanceStateEvent.noState, () -> self.setHostUuid(msg.getHostUuid())); @@ -3213,7 +3214,7 @@ protected List getImageCandidatesForVm(ImageMediaType type) { } q.setParameter("state", ImageState.Enabled); q.setParameter("status", ImageStatus.Ready); - q.setParameter("system", false); + q.setParameter("system", Objects.equals(self.getType(), VmInstanceConstant.APPLIANCE_VM_TYPE)); q.setParameter("arch", architecture); q.setParameter("bsUuids", bsUuids); List candidates = ImageInventory.valueOf(q.getResultList()); @@ -7053,6 +7054,7 @@ protected void startVm(final Message msg, final Completion completion) { spec.setEnableRDP(VmSystemTags.RDP_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.RDP_ENABLE_TOKEN)); spec.setVDIMonitorNumber(VmSystemTags.VDI_MONITOR_NUMBER.getTokenByResourceUuid(self.getUuid(), VmSystemTags.VDI_MONITOR_NUMBER_TOKEN)); spec.setEnableSecurityElement(Boolean.parseBoolean(VmSystemTags.SECURITY_ELEMENT_ENABLE.getTokenByResourceUuid(self.getUuid(), VmSystemTags.SECURITY_ELEMENT_ENABLE_TOKEN))); + spec.setAllocationScene(AllocationScene.Auto); } if (msg instanceof HaStartVmInstanceMsg) { @@ -7831,20 +7833,28 @@ public void done() { completion.fail(errCode); } }); - } else { - VmInstanceState currentState = Q.New(VmInstanceVO.class) - .select(VmInstanceVO_.state) - .eq(VmInstanceVO_.uuid, self.getUuid()) - .findValue(); - if (currentState == VmInstanceState.Rebooting) { - SQL.New(VmInstanceVO.class) - .set(VmInstanceVO_.state, originState) - .eq(VmInstanceVO_.uuid, self.getUuid()) - .update(); - } + return; + } - completion.fail(errCode); + VmInstanceState currentState = Q.New(VmInstanceVO.class) + .select(VmInstanceVO_.state) + .eq(VmInstanceVO_.uuid, self.getUuid()) + .findValue(); + + if (currentState == VmInstanceState.Rebooting) { + if (data.containsKey(VmStopOnHypervisorFlow.class.getName())) { + currentState = currentState.nextState(VmInstanceStateEvent.stopped); + } + if (data.containsKey(VmStartOnHypervisorFlow.class.getName())) { + currentState = currentState.nextState(VmInstanceStateEvent.running); + } + SQL.New(VmInstanceVO.class) + .set(VmInstanceVO_.state, currentState) + .eq(VmInstanceVO_.uuid, self.getUuid()) + .update(); } + + completion.fail(errCode); } }).start(); } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 0adf9ad8bc5..8ed1ba2e943 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -8,6 +8,9 @@ import org.springframework.transaction.annotation.Transactional; import org.zstack.compute.allocator.HostAllocatorManager; import org.zstack.compute.vm.quota.*; +import org.zstack.configuration.DiskOfferingSystemTags; +import org.zstack.configuration.InstanceOfferingSystemTags; +import org.zstack.configuration.OfferingUserConfigUtils; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.*; @@ -32,6 +35,8 @@ import org.zstack.header.cluster.ClusterInventory; import org.zstack.header.cluster.ClusterVO; import org.zstack.header.configuration.*; +import org.zstack.header.configuration.userconfig.DiskOfferingUserConfig; +import org.zstack.header.configuration.userconfig.InstanceOfferingUserConfig; import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; @@ -822,6 +827,7 @@ protected ImageInventory scripts() { } else { Tuple t = Q.New(DiskOfferingVO.class).eq(DiskOfferingVO_.uuid, msg.getRootDiskOfferingUuid()) .select(DiskOfferingVO_.diskSize, DiskOfferingVO_.allocatorStrategy).findTuple(); + rmsg.setSize((long) t.get(0)); rmsg.setAllocationStrategy((String) t.get(1)); rmsg.setDiskOfferingUuid(msg.getRootDiskOfferingUuid()); @@ -829,6 +835,23 @@ protected ImageInventory scripts() { } else { rmsg.setSize(imageInv.getSize()); } + + if (msg.getRootDiskOfferingUuid() != null && DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.hasTag(msg.getRootDiskOfferingUuid())) { + DiskOfferingUserConfig config = OfferingUserConfigUtils.getDiskOfferingConfig(msg.getRootDiskOfferingUuid(), DiskOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + rmsg.setRequiredPrimaryStorageUuid(psUuid); + } + } + + if (msg.getInstanceOfferingUuid() != null && InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.hasTag(msg.getInstanceOfferingUuid())) { + InstanceOfferingUserConfig config = OfferingUserConfigUtils.getInstanceOfferingConfig(msg.getInstanceOfferingUuid(), InstanceOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + rmsg.setRequiredPrimaryStorageUuid(psUuid); + } + } + rmsg.setPurpose(PrimaryStorageAllocationPurpose.CreateNewVm.toString()); rmsg.setPossiblePrimaryStorageTypes(new ArrayList<>(psTypes)); bus.makeLocalServiceId(rmsg, PrimaryStorageConstant.SERVICE_ID); @@ -842,6 +865,14 @@ protected ImageInventory scripts() { amsg.setRequiredClusterUuids(clusterUuids); amsg.setAllocationStrategy(dinv.getAllocatorStrategy()); amsg.setDiskOfferingUuid(dinv.getUuid()); + if (DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.hasTag(dinv.getUuid())) { + DiskOfferingUserConfig config = OfferingUserConfigUtils.getDiskOfferingConfig(dinv.getUuid(), DiskOfferingUserConfig.class); + if (config.getAllocate() != null && config.getAllocate().getPrimaryStorage() != null) { + String psUuid = config.getAllocate().getPrimaryStorage().getUuid(); + amsg.setRequiredPrimaryStorageUuid(psUuid); + } + } + bus.makeLocalServiceId(amsg, PrimaryStorageConstant.SERVICE_ID); msgs.add(amsg); } @@ -897,7 +928,7 @@ private void handle(APICreateVmNicMsg msg) { @Override public void run(FlowTrigger trigger, Map data) { int deviceId = 1; - String mac = NetworkUtils.generateMacWithDeviceId((short) deviceId); + String mac = MacOperator.generateMacWithDeviceId((short) deviceId); nic.setUuid(Platform.getUuid()); nic.setMac(mac); nic.setDeviceId(deviceId); @@ -928,7 +959,7 @@ protected void scripts() { "The error[Duplicate entry] printed by jdbc.spi.SqlExceptionHelper is no harm, " + "we will try finding another mac", nicVO.getMac())); logger.trace("", e); - nicVO.setMac(NetworkUtils.generateMacWithDeviceId((short) nicVO.getDeviceId())); + nicVO.setMac(MacOperator.generateMacWithDeviceId((short) nicVO.getDeviceId())); } else { throw e; } @@ -1195,12 +1226,21 @@ public void setup() { } flow(new Flow() { - List errorCodes = Collections.emptyList(); + List errorCodes = new ArrayList<>(); String __name__ = String.format("instantiate-systemTag-for-vm-%s", finalVo.getUuid()); @Override public void run(FlowTrigger trigger, Map data) { - instantiateTagsForCreateMessage(msg, cmsg, finalVo); + try { + instantiateTagsForCreateMessage(msg, cmsg, finalVo); + } catch (Exception e) { + errorCodes.add(operr("instantiate system tag for vm failed because %s", e.getMessage())); + } + if (!errorCodes.isEmpty()) { + trigger.fail(errorCodes.get(0)); + return; + } + errorCodes = extEmitterHandleSystemTag(msg, cmsg, finalVo); if (!errorCodes.isEmpty()) { trigger.fail(operr("handle system tag fail when creating vm because [%s]", @@ -2285,7 +2325,11 @@ public List reportQuota() { diskOfferingUuids.addAll(msg.getDataDiskOfferingUuids()); } if (imgType == ImageConstant.ImageMediaType.RootVolumeTemplate) { - allVolumeSizeAsked += imgSize; + if (msg.getRootDiskOfferingUuid() != null) { + diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); + } else { + allVolumeSizeAsked += imgSize; + } } else if (imgType == ImageConstant.ImageMediaType.ISO) { if (msg.getRootDiskOfferingUuid() != null) { diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java index f84c0c59577..bbdb2978036 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourceForChangeImageFlow.java @@ -25,14 +25,9 @@ public class VmInstantiateResourceForChangeImageFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions = null; + private final List extensions = pluginRgty.getExtensionList(ChangeVmImageExtensionPoint.class); + - public VmInstantiateResourceForChangeImageFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(ChangeVmImageExtensionPoint.class); - } - } - private void runExtensions(final Iterator it, final VmInstanceSpec spec, final FlowTrigger chain) { if (!it.hasNext()) { chain.next(); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java index 07914db1903..e6a7f14c34d 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePostFlow.java @@ -28,13 +28,8 @@ public class VmInstantiateResourcePostFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions; + private final List extensions = pluginRgty.getExtensionList(PostVmInstantiateResourceExtensionPoint.class); - public VmInstantiateResourcePostFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(PostVmInstantiateResourceExtensionPoint.class); - } - } public void run(FlowTrigger trigger, Map data) { VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java index 6f71c6ac970..4c7b6eee38f 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateResourcePreFlow.java @@ -29,14 +29,9 @@ public class VmInstantiateResourcePreFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions = null; - - public VmInstantiateResourcePreFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(PreVmInstantiateResourceExtensionPoint.class); - } - } + private final List extensions = pluginRgty.getExtensionList(PreVmInstantiateResourceExtensionPoint.class); + private void runExtensions(final Iterator it, final VmInstanceSpec spec, final FlowTrigger chain) { if (!it.hasNext()) { spec.setInstantiateResourcesSuccess(true); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java b/compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java new file mode 100644 index 00000000000..e8d72a94c7a --- /dev/null +++ b/compute/src/main/java/org/zstack/compute/vm/VmMacAddressSchemaType.java @@ -0,0 +1,16 @@ +package org.zstack.compute.vm; + +public enum VmMacAddressSchemaType { + Random("random"), + Ip("ip"); + + private VmMacAddressSchemaType(String type) { + this.type = type; + } + + private final String type; + + public String getType() { + return type; + } +} diff --git a/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java index a0ad92e81d6..98a343691a6 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmMigrationCheckL2NetworkOnHostFlow.java @@ -5,19 +5,21 @@ import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusListCallBack; +import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.workflow.Flow; import org.zstack.header.core.workflow.FlowRollback; import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.CheckL2NetworkOnHostMsg; import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.VSwitchType; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.*; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** */ @@ -25,6 +27,8 @@ public class VmMigrationCheckL2NetworkOnHostFlow implements Flow { @Autowired private CloudBus bus; + @Autowired + private DatabaseFacade dbf; @Override public void run(final FlowTrigger trigger, Map data) { @@ -34,6 +38,11 @@ public void run(final FlowTrigger trigger, Map data) { List cmsgs = new ArrayList(); for (L3NetworkInventory l3 : VmNicSpec.getL3NetworkInventoryOfSpec(spec.getL3Networks())) { CheckL2NetworkOnHostMsg msg = new CheckL2NetworkOnHostMsg(); + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType switchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (!switchType.isAttachToCluster()) { + continue; + } msg.setL2NetworkUuid(l3.getL2NetworkUuid()); msg.setHostUuid(spec.getDestHost().getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, l3.getL2NetworkUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java index 9c48f66c0f9..73193da3c37 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicFactory.java @@ -5,8 +5,6 @@ import org.zstack.header.core.workflow.FlowException; import org.zstack.header.network.l2.L2NetworkConstant; import org.zstack.header.network.l2.VSwitchType; -import org.zstack.header.network.l3.UsedIpInventory; -import org.zstack.header.network.l3.UsedIpVO; import org.zstack.header.vm.*; import org.zstack.identity.Account; import org.zstack.utils.ExceptionDSL; @@ -16,27 +14,23 @@ import javax.persistence.PersistenceException; import java.sql.SQLIntegrityConstraintViolationException; -import java.util.ArrayList; -import java.util.List; import static org.zstack.core.Platform.err; public class VmNicFactory implements VmInstanceNicFactory { private static final CLogger logger = Utils.getLogger(VmNicFactory.class); + private static final VSwitchType vSwitchType = new VSwitchType(L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE); private static final VmNicType type = new VmNicType(VmInstanceConstant.VIRTUAL_NIC_TYPE); - private static final VSwitchType vSwitchType = new VSwitchType(L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE, type); @Autowired private DatabaseFacade dbf; @Override public VmNicType getType() { - return type; - } + type.setHasAddon(true); + vSwitchType.addVmNicType(VmNicType.VmNicSubType.NONE, type); - @Override - public VSwitchType getVSwitchType() { - return vSwitchType; + return type; } @Override @@ -66,7 +60,7 @@ public VmNicVO persistAndRetryIfMacCollision(VmNicVO vo) { "The error[Duplicate entry] printed by jdbc.spi.SqlExceptionHelper is no harm, " + "we will try finding another mac", vo.getMac())); logger.trace("", e); - vo.setMac(NetworkUtils.generateMacWithDeviceId((short) vo.getDeviceId())); + vo.setMac(MacOperator.generateMacWithDeviceId((short) vo.getDeviceId())); } else { throw e; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java index 14a21f15d50..df2bc6bcaf7 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java @@ -193,7 +193,7 @@ public void vmPlatformChange(VmInstanceInventory vm, String previousPlatform, St return; } - if (ImagePlatform.valueOf(nowPlatform).isParaVirtualization()) { + if (ImagePlatform.valueOf(nowPlatform).isParaVirtualization() || VmSystemTags.VIRTIO.hasTag(vm.getUuid())) { resetVmNicDriverType(vm.getUuid(), defaultPVNicDriver); return; } @@ -266,7 +266,7 @@ public void setNicDriverType(VmNicInventory nic, boolean isImageSupportVirtIo, b return; } - if (isImageSupportVirtIo || isParaVirtualization || VmSystemTags.VIRTIO.hasTag(nic.getVmInstanceUuid())) { + if (isImageSupportVirtIo || isParaVirtualization || VmSystemTags.VIRTIO.hasTag(vm.getUuid())) { nic.setDriverType(getDefaultPVNicDriver()); } else { nic.setDriverType(getDefaultNicDriver()); @@ -286,17 +286,16 @@ public VmNicType getVmNicType(String vmUuid, L3NetworkInventory l3nw) { logger.debug(String.format("create %s on l3 network[uuid:%s] inside VmAllocateNicFlow", enableSriov ? "vf nic" : "vnic", l3nw.getUuid())); boolean enableVhostUser = NetworkServiceGlobalConfig.ENABLE_VHOSTUSER.value(Boolean.class); - - L2NetworkVO l2nw = dbf.findByUuid(l3nw.getL2NetworkUuid(), L2NetworkVO.class); - VmNicType type; - if (l2nw.getType().equals(L2NetworkConstant.L2_TF_NETWORK_TYPE)) { - type = VmNicType.valueOf(VmInstanceConstant.TF_VIRTUAL_NIC_TYPE); - } else { - VSwitchType vSwitchType = VSwitchType.valueOf(l2nw.getvSwitchType()); - type = vSwitchType.getVmNicTypeWithCondition(enableSriov, enableVhostUser); + VmNicType.VmNicSubType subType = VmNicType.VmNicSubType.NONE; + if (enableSriov) { + subType = VmNicType.VmNicSubType.SRIOV; + } else if (enableVhostUser) { + subType = VmNicType.VmNicSubType.VHOSTUSER; } + L2NetworkVO l2nw = dbf.findByUuid(l3nw.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2nw.getvSwitchType()); - return type; + return vSwitchType.getVmNicType(subType); } @Override diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java b/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java index b2fc09d36f5..20dc50c7f7f 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicQosStruct.java @@ -4,6 +4,7 @@ public class VmNicQosStruct { public String hostUuid; public String vmUuid; public String vmNicUuid; + public String l2Uuid; public String internalName; public Long outboundBandwidth; public Long inboundBandwidth; diff --git a/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java b/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java index 11f1253b0db..f182c443925 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmPriorityUpgradeExtension.java @@ -9,14 +9,12 @@ import org.zstack.header.tag.SystemTagVO; import org.zstack.header.tag.SystemTagVO_; import org.zstack.header.vm.*; -import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * @ Author : yh.w @@ -96,7 +94,7 @@ public void run(MessageReply reply) { } private void initRunningVmPriority() { - if (!VmPriorityGlobalProperty.initRunningVmPriority) { + if (!VmGlobalProperty.initRunningVmPriority) { return; } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java b/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java index d4f6676a70c..52e10ec6cfd 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java @@ -523,7 +523,11 @@ private void check(APICreateVmInstanceMsg msg, Map pair diskOfferingUuids.addAll(msg.getDataDiskOfferingUuids()); } if (imgType == ImageConstant.ImageMediaType.RootVolumeTemplate) { - allVolumeSizeAsked += imgSize; + if (msg.getRootDiskOfferingUuid() != null) { + diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); + } else { + allVolumeSizeAsked += imgSize; + } } else if (imgType == ImageConstant.ImageMediaType.ISO) { if (msg.getRootDiskOfferingUuid() != null) { diskOfferingUuids.add(msg.getRootDiskOfferingUuid()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java index 56fe116c3ca..a57b93acde1 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmReleaseResourceFlow.java @@ -27,13 +27,7 @@ public class VmReleaseResourceFlow implements Flow { @Autowired private PluginRegistry pluginRgty; - private static List extensions = null; - - public VmReleaseResourceFlow() { - if (extensions == null) { - extensions = pluginRgty.getExtensionList(VmReleaseResourceExtensionPoint.class); - } - } + private final List extensions = pluginRgty.getExtensionList(VmReleaseResourceExtensionPoint.class); private void fireExtensions(final Iterator it, final VmInstanceSpec spec, final Map ctx, final FlowTrigger chain) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java index f2ced4d90da..20965f61655 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmStartOnHypervisorFlow.java @@ -19,18 +19,14 @@ import java.util.Map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmStartOnHypervisorFlow implements Flow { - private static CLogger logger = Utils.getLogger(VmStartOnHypervisorFlow.class); + private static final CLogger logger = Utils.getLogger(VmStartOnHypervisorFlow.class); @Autowired private CloudBus bus; @Autowired private PluginRegistry pluginRgty; - private List exts; - - public VmStartOnHypervisorFlow() { - exts = pluginRgty.getExtensionList(VmBeforeStartOnHypervisorExtensionPoint.class); - } + private final List exts = pluginRgty.getExtensionList(VmBeforeStartOnHypervisorExtensionPoint.class);; private void fireExtensions(VmInstanceSpec spec) { for (VmBeforeStartOnHypervisorExtensionPoint ext : exts) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java index d7df47541f1..96120fbb7a5 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmStopOnHypervisorFlow.java @@ -50,6 +50,7 @@ public void run(final FlowTrigger chain, Map data) { @Override public void run(MessageReply reply) { if (reply.isSuccess()) { + data.put(VmStopOnHypervisorFlow.class.getName(), true); chain.next(); } else { if (spec.isGcOnStopFailure() && reply.getError().isError(HostErrors.OPERATION_FAILURE_GC_ELIGIBLE)) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java index d48265f56cb..21c9668175a 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmSystemTags.java @@ -195,6 +195,10 @@ public class VmSystemTags { public static PatternedSystemTag VM_GUEST_TOOLS = new PatternedSystemTag(String.format("GuestTools::{%s}", VM_GUEST_TOOLS_VERSION_TOKEN), VmInstanceVO.class); + public static String VM_GUEST_TOOLS_PREVIEW_STATE_TOKEN = "guestToolsPreviewState"; + public static PatternedSystemTag VM_GUEST_TOOLS_PREVIEW_STATE = + new PatternedSystemTag(String.format("GuestToolsPreviewState::{%s}", VM_GUEST_TOOLS_PREVIEW_STATE_TOKEN), VmInstanceVO.class); + public static String VM_RESOURCE_BINGDING_TOKEN = "resourceUUids"; public static PatternedSystemTag VM_RESOURCE_BINGDING = new PatternedSystemTag(String.format("resourceBindings::{%s}", VM_RESOURCE_BINGDING_TOKEN), VmInstanceVO.class); @@ -235,7 +239,6 @@ public class VmSystemTags { public static PatternedSystemTag XML_HOOK = new PatternedSystemTag(String.format("xmlHook::{%s}", XML_HOOK_TOKEN), VmInstanceVO.class); public static final String MARKET_PLACE_TOKEN = "marketplace::true"; - public static PatternedSystemTag CREATED_BY_MARKETPLACE = new PatternedSystemTag( MARKET_PLACE_TOKEN, VmInstanceVO.class ); @@ -305,4 +308,6 @@ public String desensitizeTag(SystemTag systemTag, String tag) { } public static PatternedSystemTag VM_STATE_PAUSED_AFTER_MIGRATE = new PatternedSystemTag(("vmPausedAfterMigrate"), VmInstanceVO.class); + + public static PatternedSystemTag VM_MEMORY_ACCESS_MODE_SHARED = new PatternedSystemTag(("vmMemoryAccessModeShared"), VmInstanceVO.class); } diff --git a/conf/db/V0.6__schema.sql b/conf/db/V0.6__schema.sql index 87d0461af1e..7e956f3d195 100755 --- a/conf/db/V0.6__schema.sql +++ b/conf/db/V0.6__schema.sql @@ -1327,7 +1327,7 @@ CREATE INDEX idxZoneEOname ON ZoneEO (name); CREATE VIEW `zstack`.`VmInstanceVO` AS SELECT uuid, name, description, zoneUuid, clusterUuid, imageUuid, hostUuid, internalId, lastHostUuid, instanceOfferingUuid, rootVolumeUuid, defaultL3NetworkUuid, type, hypervisorType, cpuNum, cpuSpeed, memorySize, allocatorStrategy, createDate, lastOpDate, state FROM `zstack`.`VmInstanceEO` WHERE deleted IS NULL; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, md5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, md5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; CREATE VIEW `zstack`.`VolumeVO` AS SELECT uuid, name, description, primaryStorageUuid, vmInstanceUuid, diskOfferingUuid, rootImageUuid, installPath, type, status, size, deviceId, format, state, createDate, lastOpDate FROM `zstack`.`VolumeEO` WHERE deleted IS NULL; @@ -1343,7 +1343,7 @@ CREATE VIEW `zstack`.`VolumeSnapshotTreeVO` AS SELECT uuid, volumeUuid, current, CREATE VIEW `zstack`.`BackupStorageVO` AS SELECT uuid, name, url, description, totalCapacity, availableCapacity, type, state, status, createDate, lastOpDate FROM `zstack`.`BackupStorageEO` WHERE deleted IS NULL; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; CREATE VIEW `zstack`.`IpRangeVO` AS SELECT uuid, l3NetworkUuid, name, description, startIp, endIp, netmask, gateway, networkCidr, createDate, lastOpDate FROM `zstack`.`IpRangeEO` WHERE deleted IS NULL; diff --git a/conf/db/upgrade/V1.3__schema.sql b/conf/db/upgrade/V1.3__schema.sql index 33bb3a47ce2..54afa7d0b55 100755 --- a/conf/db/upgrade/V1.3__schema.sql +++ b/conf/db/upgrade/V1.3__schema.sql @@ -70,7 +70,7 @@ ALTER TABLE FusionstorPrimaryStorageVO ADD CONSTRAINT fkFusionstorPrimaryStorage ALTER TABLE ImageEO ADD actualSize bigint unsigned DEFAULT NULL; DROP VIEW IF EXISTS `zstack`.`ImageVO`; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType FROM `zstack`.`ImageEO` WHERE deleted IS NULL; UPDATE ImageEO set actualSize = size; ALTER TABLE VolumeEO ADD actualSize bigint unsigned DEFAULT NULL; diff --git a/conf/db/upgrade/V1.7__schema.sql b/conf/db/upgrade/V1.7__schema.sql index 2eadc6e4b7d..a6fc8b56c0f 100644 --- a/conf/db/upgrade/V1.7__schema.sql +++ b/conf/db/upgrade/V1.7__schema.sql @@ -5,7 +5,7 @@ ALTER TABLE `zstack`.`ImageEO` modify column description varchar(2048) DEFAULT N ALTER TABLE `zstack`.`ImageEO` add column exportUrl varchar(2048) DEFAULT NULL COMMENT 'exported image URL'; DROP VIEW IF EXISTS `zstack`.`ImageVO`; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; ALTER TABLE `zstack`.`InstanceOfferingEO` modify column description varchar(2048) DEFAULT NULL COMMENT 'instance offering description'; ALTER TABLE `zstack`.`DiskOfferingEO` modify column description varchar(2048) DEFAULT NULL COMMENT 'disk offering description'; diff --git a/conf/db/upgrade/V2.1.0__schema.sql b/conf/db/upgrade/V2.1.0__schema.sql index edb0e637067..4938319b066 100755 --- a/conf/db/upgrade/V2.1.0__schema.sql +++ b/conf/db/upgrade/V2.1.0__schema.sql @@ -395,7 +395,7 @@ SET FOREIGN_KEY_CHECKS = 1; ALTER TABLE `zstack`.`ImageEO` ADD COLUMN exportMd5Sum varchar(255) DEFAULT NULL; DROP VIEW IF EXISTS `zstack`.`ImageVO`; -CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, exportMd5Sum, platform, type, format, url, system, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`ImageVO` AS SELECT uuid, name, description, status, state, size, actualSize, md5Sum, exportMd5Sum, platform, type, format, url, `system`, mediaType, createDate, lastOpDate, guestOsType, exportUrl FROM `zstack`.`ImageEO` WHERE deleted IS NULL; ALTER TABLE HostCapacityVO MODIFY availableCpu bigint(20) NOT NULL COMMENT 'used cpu of host in HZ'; diff --git a/conf/db/upgrade/V2.2.0__schema.sql b/conf/db/upgrade/V2.2.0__schema.sql index 624caf6dbc0..15238f7bdf9 100644 --- a/conf/db/upgrade/V2.2.0__schema.sql +++ b/conf/db/upgrade/V2.2.0__schema.sql @@ -1,7 +1,7 @@ ALTER TABLE `L3NetworkEO` ADD COLUMN `category` varchar(255) NOT NULL DEFAULT 'Private' COMMENT 'the type network used for'; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; # add network category for ZSTAC-6844 DELIMITER $$ @@ -10,7 +10,7 @@ CREATE PROCEDURE generateNetworkCategory() DECLARE l3Uuid varchar(32); DECLARE l3System tinyint(3) unsigned; DECLARE done INT DEFAULT FALSE; - DECLARE cur CURSOR FOR SELECT uuid, system FROM zstack.L3NetworkEO; + DECLARE cur CURSOR FOR SELECT uuid, `system` FROM zstack.L3NetworkEO; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP @@ -21,7 +21,7 @@ CREATE PROCEDURE generateNetworkCategory() IF l3System = 1 THEN - UPDATE zstack.L3NetworkEO SET system = 0 WHERE uuid = l3Uuid; + UPDATE zstack.L3NetworkEO SET `system` = 0 WHERE uuid = l3Uuid; UPDATE zstack.L3NetworkEO SET category = 'Public' WHERE uuid = l3Uuid; ELSE UPDATE zstack.L3NetworkEO SET category = 'Private' WHERE uuid = l3Uuid; diff --git a/conf/db/upgrade/V3.1.0__schema.sql b/conf/db/upgrade/V3.1.0__schema.sql index 40311d767f4..26df49be25c 100644 --- a/conf/db/upgrade/V3.1.0__schema.sql +++ b/conf/db/upgrade/V3.1.0__schema.sql @@ -208,7 +208,7 @@ ALTER TABLE `zstack`.`UsedIpVO` ADD CONSTRAINT fkUsedIpVOVmNicVO FOREIGN KEY (vm ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `ipVersion` int(10) unsigned DEFAULT 4; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category, ipVersion FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; ALTER TABLE `zstack`.`VmNicVO` ADD COLUMN `ipVersion` int(10) unsigned DEFAULT 4; diff --git a/conf/db/upgrade/V4.4.0__schema.sql b/conf/db/upgrade/V4.4.0__schema.sql index d6ac5c72dd4..9164cfccd75 100644 --- a/conf/db/upgrade/V4.4.0__schema.sql +++ b/conf/db/upgrade/V4.4.0__schema.sql @@ -1,3 +1,4 @@ +UPDATE `zstack`.`LicenseHistoryVO` SET `hash` = 'unknown' WHERE `hash` IS NULL; ALTER TABLE `zstack`.`LicenseHistoryVO` MODIFY COLUMN `hash` char(32) NOT NULL DEFAULT 'unknown'; ALTER TABLE `zstack`.`LicenseHistoryVO` ADD COLUMN `source` varchar(16) DEFAULT 'Legacy'; ALTER TABLE `zstack`.`LicenseHistoryVO` MODIFY COLUMN `source` varchar(16) NOT NULL; diff --git a/conf/db/upgrade/V4.5.1.2__schema.sql b/conf/db/upgrade/V4.5.1.2__schema.sql new file mode 100644 index 00000000000..19c73e40162 --- /dev/null +++ b/conf/db/upgrade/V4.5.1.2__schema.sql @@ -0,0 +1,37 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`PluginDriverVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `vendor` varchar(64) NOT NULL, + `features` varchar(1024) NOT NULL, + `optionTypes` text DEFAULT NULL, + `description` varchar(1024) DEFAULT NULL, + `deleted` BOOLEAN NOT NULL, + `license` varchar(1024) DEFAULT NULL, + `version` varchar(1024) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`SNSPluginEndpointVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `timeoutInSeconds` int NOT NULL, + `properties` varchar(1024) NOT NULL, + `pluginDriverUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkPluginEndpointVOSNSApplicationEndpointVO FOREIGN KEY (uuid) REFERENCES SNSApplicationEndpointVO (uuid) ON DELETE CASCADE, + CONSTRAINT fkPluginEndpointVOPluginDriverVO FOREIGN KEY (pluginDriverUuid) REFERENCES PluginDriverVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`PluginSecretResourcePoolVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `properties` varchar(1024) NOT NULL, + `pluginDriverUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkPluginSecretResourcePoolVOSecretResourcePoolVO FOREIGN KEY (uuid) REFERENCES SecretResourcePoolVO (uuid) ON DELETE CASCADE, + CONSTRAINT fkPluginSecretResourcePoolVOPluginDriverVO FOREIGN KEY (pluginDriverUuid) REFERENCES PluginDriverVO (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +update EventSubscriptionVO set name='Cryptographic Resource Status Abnormal' where uuid='eecc7b576c05391bb01fd956964d3ba4'; +update SystemTagVO set tag='name::cn::密码资源状态异常' where resourceUuid='eecc7b576c05391bb01fd956964d3ba4'; diff --git a/conf/db/upgrade/V4.6.21.1__schema.sql b/conf/db/upgrade/V4.6.21.1__schema.sql new file mode 100644 index 00000000000..65ec27379f2 --- /dev/null +++ b/conf/db/upgrade/V4.6.21.1__schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAppIdRefVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `licenseId` varchar(32) NOT NULL, + `appId` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/db/upgrade/V4.6.21__schema.sql b/conf/db/upgrade/V4.6.21__schema.sql index ad913515b63..b8fc01611a1 100644 --- a/conf/db/upgrade/V4.6.21__schema.sql +++ b/conf/db/upgrade/V4.6.21__schema.sql @@ -39,7 +39,7 @@ ALTER TABLE `zstack`.`UsedIpVO` MODIFY COLUMN `ipRangeUuid` varchar(32) DEFAULT ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `enableIPAM` boolean NOT NULL DEFAULT TRUE; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; ALTER TABLE `zstack`.`UsedIpVO` DROP FOREIGN KEY fkUsedIpVOVmNicVO; ALTER TABLE `zstack`.`UsedIpVO` ADD CONSTRAINT fkUsedIpVOVmNicVO FOREIGN KEY (vmNicUuid) REFERENCES VmNicVO (uuid) ON DELETE CASCADE; diff --git a/conf/db/upgrade/V4.8.0.6__schema.sql b/conf/db/upgrade/V4.8.0.6__schema.sql index 0eaeff1c46f..5546e3de871 100644 --- a/conf/db/upgrade/V4.8.0.6__schema.sql +++ b/conf/db/upgrade/V4.8.0.6__schema.sql @@ -5,4 +5,4 @@ CREATE VIEW `zstack`.`L2NetworkVO` AS SELECT uuid, name, description, type, vSwi ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `isolated` boolean NOT NULL DEFAULT FALSE AFTER `enableIPAM`; DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; -CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, system, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; \ No newline at end of file +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; \ No newline at end of file diff --git a/conf/db/upgrade/V5.1.19__schema.sql b/conf/db/upgrade/V5.1.19__schema.sql new file mode 100644 index 00000000000..44a1030ae40 --- /dev/null +++ b/conf/db/upgrade/V5.1.19__schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( + `uuid` varchar(32) not null unique, + `accessToken` text DEFAULT NULL, + `idToken` text DEFAULT NULL, + `refreshToken` text DEFAULT NULL, + `userUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/V5.1.20__schema.sql b/conf/db/upgrade/V5.1.20__schema.sql new file mode 100644 index 00000000000..a4a9aa3c531 --- /dev/null +++ b/conf/db/upgrade/V5.1.20__schema.sql @@ -0,0 +1,44 @@ +ALTER TABLE `zstack`.`ModelCenterVO` ADD COLUMN containerStorageNetwork varchar(2048) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN internalUrl varchar(2048) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN k8sResourceYaml mediumtext DEFAULT NULL; +ALTER TABLE `zstack`.`ModelServiceInstanceVO` ADD COLUMN urlMaps mediumtext DEFAULT NULL; + +DROP PROCEDURE IF EXISTS UpdateK8sResourceYaml; +DELIMITER // +CREATE PROCEDURE UpdateK8sResourceYaml() +BEGIN + -- 开始事务 + START TRANSACTION; + + UPDATE ModelServiceInstanceVO + SET k8sResourceYaml = yaml + WHERE vmInstanceUuid IS NULL AND k8sResourceYaml IS NULL AND yaml IS NOT NULL; + + -- 提交事务 + COMMIT; +END // +DELIMITER ; +CALL UpdateK8sResourceYaml(); + +CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NULL, + `modelServiceGroupUuid` varchar(32) NULL, + `modelServiceUuid` varchar(32) NULL, + `deploymentStatus` varchar(255) NOT NULL, + CONSTRAINT fkApplicationDevelopmentServiceVOModelServiceGroupVO FOREIGN KEY (modelServiceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON DELETE SET NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterCapacityVO` ( + `uuid` varchar(32) NOT NULL, + `modelUsedCapacity` bigint NULL, + `modelServiceUsedCapacity` bigint NULL, + `datasetUsedCapacity` bigint NULL, + `fineTuneUsedCapacity` bigint NULL, + `modelEvaluationUsedCapacity` bigint NULL, + `installationUsedCapacity` bigint NULL, + `temporaryUsedCapacity` bigint NULL, + `cacheUsedCapacity` bigint NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/V5.1.4__schema.sql b/conf/db/upgrade/V5.1.4__schema.sql index 9e40ddae1c2..553fd49bde3 100644 --- a/conf/db/upgrade/V5.1.4__schema.sql +++ b/conf/db/upgrade/V5.1.4__schema.sql @@ -1,3 +1,2 @@ -ALTER TABLE `zstack`.`OAuth2ClientVO` ADD COLUMN `scope` varchar(255) default 'openid'; - -ALTER TABLE `zstack`.`OAuth2ClientVO` ADD COLUMN `identityProvider` varchar(32) default 'default'; \ No newline at end of file +CALL ADD_COLUMN('OAuth2ClientVO', 'scope', 'varchar(255)', 1, 'openid'); +CALL ADD_COLUMN('OAuth2ClientVO', 'identityProvider', 'varchar(32)', 1, 'default'); \ No newline at end of file diff --git a/conf/db/upgrade/V5.1.8.1__schema.sql b/conf/db/upgrade/V5.1.8.1__schema.sql new file mode 100644 index 00000000000..175e60beae7 --- /dev/null +++ b/conf/db/upgrade/V5.1.8.1__schema.sql @@ -0,0 +1,232 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`ModelCenterVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(128) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `url` varchar(2048) DEFAULT NULL, + `parameters` varchar(128) DEFAULT NULL, + `status` varchar(255) NOT NULL, + `managementIp` varchar(128) NOT NULL, + `managementPort` int(16) not NULL, + `storageNetworkUuid` varchar(32) DEFAULT NULL, + `serviceNetworkUuid` varchar(32) DEFAULT NULL, + `containerRegistry` varchar(2048) DEFAULT NULL, + `containerNetwork` varchar(2048) DEFAULT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `modelCenterUuid` varchar(32) NOT NULL, + `parameters` mediumtext DEFAULT NULL, + `installPath` varchar(2048) DEFAULT NULL, + `introduction` mediumtext DEFAULT NULL, + `logo` mediumtext DEFAULT NULL, + `version` varchar(255) DEFAULT NULL, + `vendor` varchar(255) DEFAULT NULL, + `type` varchar(32) NOT NULL, + `size` bigint(20) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `type` varchar(32) NOT NULL, + `yaml` mediumtext NOT NULL, + `requestCpu` int(10) NOT NULL, + `requestMemory` bigint(20) NOT NULL, + `framework` varchar(255) DEFAULT 'Other', + `condaVersion` varchar(32) DEFAULT NULL, + `dockerImage` varchar(255) DEFAULT NULL, + `size` bigint(20) DEFAULT 0, + `gpuComputeCapability` varchar(32) DEFAULT NULL, + `system` tinyint(1) DEFAULT 0, + `modelCenterUuid` varchar(32) NOT NULL, + `vmImageUuid` varchar(32) DEFAULT NULL, + `installPath` varchar(512) NOT NULL, + `startCommand` varchar(1024) NOT NULL, + `pythonVersion` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelUuid` varchar(32) NOT NULL, + `modelServiceUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelRefVO FOREIGN KEY (modelUuid) REFERENCES ModelVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceRefVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `zstack`.`ModelServiceInstanceGroupVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelServiceUuid` varchar(32) DEFAULT NULL, + `modelUuid` varchar(32) DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `status` varchar(255) NOT NULL, + `modelServiceType` varchar(62) NOT NULL, + `type` varchar(128) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + CONSTRAINT fkModelServiceInstanceGroupVOModelServiceModelServiceVO FOREIGN KEY (modelServiceUuid) REFERENCES ModelServiceVO (uuid) ON DELETE SET NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceInstanceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `description` varchar(2048) DEFAULT NULL, + `yaml` mediumtext DEFAULT NULL, + `status` varchar(255) NOT NULL, + `url` varchar(2048) NOT NULL, + `modelServiceGroupUuid` varchar(32) NOT NULL, + `vmInstanceUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelServiceInstanceVOVmInstanceVO FOREIGN KEY (vmInstanceUuid) REFERENCES VmInstanceEO (uuid) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +--CREATE TABLE `zstack`.`VmModelServiceInstanceVO` ( +-- `uuid` varchar(32) NOT NULL UNIQUE, +-- `modelServiceInstanceGroupUuid` varchar(32) DEFAULT NULL, +-- PRIMARY KEY (`uuid`) +--) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`SSOServerTokenVO`( + `uuid` varchar(32) not null unique, + `accessToken` text DEFAULT NULL, + `idToken` text DEFAULT NULL, + `refreshToken` text DEFAULT NULL, + `userUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ContainerManagementVmVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `managementIp` varchar(255) DEFAULT NULL, + `vendor` varchar(64) DEFAULT NULL, + `managementPort` int unsigned DEFAULT NULL, + `vmInstanceUuid` varchar(32) NOT NULL, + `accessKeyId` VARCHAR(128) NOT NULL, + `accessKeySecret` VARCHAR(128) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`DatasetVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NULL, + `url` varchar(2048) NULL, + `code` varchar(255) DEFAULT NULL, + `installPath` varchar(2048) NULL, + `description` varchar(2048) NULL, + `modelCenterUuid` varchar(32) NOT NULL, + `system` tinyint(1) DEFAULT 0, + `size` bigint(20) DEFAULT 0, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT fkDatasetVOModelCenterVO FOREIGN KEY (modelCenterUuid) REFERENCES ModelCenterVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGroupDatasetRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `datasetUuid` varchar(32) NOT NULL, + `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkDatasetRefVO FOREIGN KEY (datasetUuid) REFERENCES DatasetVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceInstanceGroupVORefVO FOREIGN KEY (modelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGroupModelServiceRefVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, + `dependModelServiceInstanceGroupUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkModelServiceGroupModelServiceRefVOModelServicePrimary FOREIGN KEY (dependModelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkModelServiceGroupModelServiceRefVOModelServiceDepend FOREIGN KEY (modelServiceInstanceGroupUuid) REFERENCES ModelServiceInstanceGroupVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvalServiceInstanceGroupVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `temperature` FLOAT NULL, + `topK` INT NULL, + `topP` FLOAT NULL, + `maxLength` INT NULL, + `maxNewTokens` INT NULL, + `repetitionPenalty` FLOAT NULL, + `limits` INT, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `proxyType` varchar(255) NULL, + `proxyHost` varchar(255) NULL, + `proxyPort` int NULL, + `proxyUsername` varchar(255) NULL, + `proxyPassword` varchar(255) NULL, + `isEnabled` boolean NULL, + `proxyProtocolVersion` varchar(255) NULL, + `useSsl` boolean NULL, + `noProxy` varchar(255) NULL, + `createDate` timestamp NULL, + `lastOpDate` timestamp NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`UserProxyConfigResourceRefVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resourceUuid` varchar(32) NOT NULL, + `proxyUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + KEY `fkUserProxyConfigResourceRefVOResourceVO` (`resourceUuid`), + KEY `fkUserProxyConfigResourceRefVOUserProxyConfigVO` (`proxyUuid`), + CONSTRAINT `fUserProxyConfigResourceRefVO` FOREIGN KEY (`resourceUuid`) REFERENCES `ResourceVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkUserProxyConfigResourceRefVO1` FOREIGN KEY (`proxyUuid`) REFERENCES `UserProxyConfigVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelEvaluationTaskVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) DEFAULT NULL, + `description` varchar(2048) DEFAULT NULL, + `percentage` int(3) DEFAULT 0, + `status` varchar(64) NOT NULL, + `modelServiceGroupUuid` varchar(32) NOT NULL, + `evaluatedServiceGroupUuid` varchar(32) NOT NULL, + `datasetUuid` varchar(32) NOT NULL, + `limits` int(3) DEFAULT 0, + `opaque` mediumtext DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`TrainedModelRecordVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelUuid` varchar(32) NOT NULL, + `sourceModelUuid` varchar(32) DEFAULT NULL, + `modelServiceInstanceGroupUuid` varchar(32) NOT NULL, + `datasetUuid` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/V5.3.0__schema.sql b/conf/db/upgrade/V5.3.0__schema.sql new file mode 100644 index 00000000000..6877d9cca7f --- /dev/null +++ b/conf/db/upgrade/V5.3.0__schema.sql @@ -0,0 +1,53 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`HbaDeviceVO` ( + `uuid` varchar(32) not null unique, + `hostUuid` varchar(32) default null, + `name` varchar(255) default null, + `hbaType` varchar(64) default null, + `createDate` timestamp not null default '0000-00-00 00:00:00', + `lastOpDate` timestamp not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + CONSTRAINT fkHBADeviceVOHostVO FOREIGN KEY (hostUuid) REFERENCES HostEO (uuid) ON DELETE CASCADE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`FcHbaDeviceVO` ( + `uuid` varchar(32) not null unique, + `portName` varchar(255) default null, + `portState` varchar(64) default null, + `supportedSpeeds` varchar(255) default null, + `speed` varchar(255) default null, + `symbolicName` varchar(255) default null, + `supportedClasses` varchar(255) default null, + `nodeName` varchar(255) default null, + CONSTRAINT fkFcHbaDeviceVO FOREIGN KEY (uuid) REFERENCES HbaDeviceVO (uuid) ON DELETE CASCADE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and `system` = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and `system` = TRUE; +UPDATE `zstack`.`ImageEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and `system` = TRUE; + +UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.1.7' WHERE architecture = 'x86_64' and guestOsType = 'Linux' and type = 'ApplianceVm'; +UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'VyOS 1.2.0' WHERE architecture = 'aarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; +UPDATE `zstack`.`VmInstanceEO` SET guestOsType = 'Kylin 10' WHERE architecture = 'loongarch64' and guestOsType = 'Linux' and type = 'ApplianceVm'; + +CREATE TABLE IF NOT EXISTS `zstack`.`HostNetworkLabelVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `serviceType` varchar(255) NOT NULL, + `system` boolean NOT NULL DEFAULT TRUE, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'ManagementNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'StorageNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'TenantNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'BackupNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +INSERT IGNORE INTO `zstack`.`HostNetworkLabelVO` (`uuid`, `serviceType`, `system`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''),'MigrationNetwork', TRUE, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); + +CREATE INDEX idx_schedType_createDate ON `zstack`.`VmSchedHistoryVO` (schedType, createDate); \ No newline at end of file diff --git a/conf/db/upgrade/V5.3.20__schema.sql b/conf/db/upgrade/V5.3.20__schema.sql new file mode 100644 index 00000000000..081413f4b89 --- /dev/null +++ b/conf/db/upgrade/V5.3.20__schema.sql @@ -0,0 +1,186 @@ +ALTER TABLE AutoScalingRuleSchedulerJobTriggerVO DROP FOREIGN KEY fkAutoScalingRuleSchedulerJobTriggerVO; +CALL ADD_CONSTRAINT('AutoScalingRuleSchedulerJobTriggerVO', 'fkAutoScalingRuleSchedulerJobTriggerVO', 'schedulerJobUuid', 'SchedulerJobVO', 'uuid', 'CASCADE'); + +ALTER TABLE `zstack`.`ExternalPrimaryStorageVO` MODIFY COLUMN `config` TEXT DEFAULT NULL; +ALTER TABLE `zstack`.`HostNetworkInterfaceLldpRefVO` MODIFY COLUMN `systemName` VARCHAR(255) NOT NULL; + +CREATE TABLE IF NOT EXISTS `zstack`.`ExternalPrimaryStorageHostRefVO` ( + `id` BIGINT UNSIGNED UNIQUE, + `hostId` INT DEFAULT NULL, + `protocol` varchar(128) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +SET @row_number = 0; +INSERT INTO ExternalPrimaryStorageHostRefVO (id, hostId, protocol) +SELECT + p.id, + (@row_number := @row_number + 1) as hostId, + e.defaultProtocol as protocol +FROM PrimaryStorageHostRefVO p LEFT JOIN ExternalPrimaryStorageVO e ON p.primaryStorageUuid = e.uuid +ORDER BY p.id; + +-- Delete old UserTagVO of AI::Image-Generation +DELETE FROM UserTagVO WHERE uuid = 'a7ec68923efe447d9119ba7b6df2b54c'; + +DELETE ref FROM `zstack`.`VolumeSnapshotReferenceVO` ref + INNER JOIN `zstack`.`VolumeEO` vol ON vol.uuid = ref.referenceVolumeUuid +WHERE ref.referenceType = 'VolumeVO' + AND ref.referenceVolumeUuid = ref.referenceUuid + AND ref.referenceInstallUrl NOT LIKE CONCAT('%', SUBSTRING_INDEX(vol.installPath, '/', -1), '%'); + +DROP PROCEDURE IF EXISTS ModifyApplicationDevelopmentServiceVO; +DELIMITER $$ + +CREATE PROCEDURE ModifyApplicationDevelopmentServiceVO() +BEGIN + START TRANSACTION; + + CREATE TABLE IF NOT EXISTS `zstack`.`ApplicationDevelopmentServiceVO_temp` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `deploymentStatus` varchar(255) NOT NULL, + PRIMARY KEY (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + INSERT INTO `zstack`.`ApplicationDevelopmentServiceVO_temp` (uuid, deploymentStatus) + SELECT modelServiceGroupUuid, deploymentStatus + FROM `zstack`.`ApplicationDevelopmentServiceVO` + WHERE modelServiceGroupUuid IS NOT NULL; + + DROP TABLE `zstack`.`ApplicationDevelopmentServiceVO`; + + RENAME TABLE `zstack`.`ApplicationDevelopmentServiceVO_temp` TO `zstack`.`ApplicationDevelopmentServiceVO`; + + COMMIT; + SELECT CURTIME(); +END $$ + +DELIMITER ; + +CALL ModifyApplicationDevelopmentServiceVO(); + +CALL ADD_COLUMN('ModelVO', 'modelId', 'VARCHAR(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'description', 'VARCHAR(2048)', 1, NULL); +CALL ADD_COLUMN('ModelServiceVO', 'source', 'VARCHAR(32)', 1, NULL); +CALL ADD_COLUMN('ModelServiceVO', 'readme', 'TEXT', 1, NULL); + +# Delete ZStack-default-inference-template +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '97e66447fa4246649dcc41b72b412407'; +# Delete qwen chat +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0446d8fd9487403cc12e7645f5r68d04'; +# Delete xtts +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = 'e944c98c4a154f53a86f34eb0fcd093c'; +# Delete sdxl +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '80fab6f2f3d444e1a0b39702dcc62bac'; +# Delete blip image +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '2ad69dc6cebf405f9e0d750bb50e120c'; +# Delete stable video +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = 'c65d3019cb3f400f80e5e2a10dcaf861'; +# Delete yolo +DELETE FROM `zstack`.`ModelServiceVO` WHERE `uuid` = '0b714f4d8c5c43ca86c3a6caa58358a7'; + +ALTER TABLE `zstack`.`BaremetalNicVO` modify column mac varchar(255) DEFAULT NULL; + +# framework field changed to LLM frameworks not service sources +# 1. Change the origin framework value to source field +# 2. If source is Bentoml change framework to BentoML +# 3. Else change framework to Other + +UPDATE `zstack`.`ModelServiceVO` SET source = framework WHERE source is NULL + AND framework in ('HuggingFace', 'Bentoml', 'Other'); + +UPDATE `zstack`.`ModelServiceVO` SET source = 'Other' WHERE source is NULL + AND framework not in ('HuggingFace', 'Bentoml', 'Other'); + +UPDATE `zstack`.`ModelServiceVO` SET source = 'Bentoml' WHERE source = 'BentoML'; +UPDATE `zstack`.`ModelServiceVO` SET framework = 'BentoML' WHERE source = 'Bentoml' + AND framework not in ('vLLM', 'Diffusers', 'Transformers', 'sentence_transformers', 'llama.cpp', 'BentoML', 'Other', 'Ollama'); + +Update ModelServiceVO set framework = 'Other' where framework not in + ('vLLM', 'Diffusers', 'Transformers', 'sentence_transformers', 'llama.cpp', 'BentoML', 'Other', 'Ollama') + AND source != 'Bentoml'; +Update ModelServiceVO set framework = 'Other' where framework is NULL; + +DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; +DELIMITER $$ +CREATE PROCEDURE CreateResourceConfigForBindingVms() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE vmUuid VARCHAR(128); + + DECLARE vmCursor CURSOR FOR + SELECT resourceUuid + FROM SystemTagVO + WHERE resourceType = 'VmInstanceVO' + AND tag LIKE 'resourceBindings::Cluster:%'; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN vmCursor; + + read_loop: LOOP + FETCH vmCursor INTO vmUuid; + + IF done THEN + LEAVE read_loop; + END IF; + + IF NOT EXISTS ( + SELECT 1 + FROM ResourceConfigVO + WHERE resourceType = 'VmInstanceVO' + AND resourceUuid = vmUuid + AND category = 'vm' + AND name = 'vm.ha.across.clusters' + ) THEN + INSERT INTO ResourceConfigVO (uuid, name, category, value, resourceUuid, resourceType, lastOpDate, createDate) + VALUES (REPLACE(UUID(),'-',''), 'vm.ha.across.clusters', 'vm', 'false', vmUuid, 'VmInstanceVO', NOW(), NOW()); + END IF; + END LOOP; + + CLOSE vmCursor; +END $$ +DELIMITER ; +call CreateResourceConfigForBindingVms(); +DROP PROCEDURE IF EXISTS CreateResourceConfigForBindingVms; + +DELETE FROM `SSOServerTokenVO`; +ALTER TABLE `zstack`.`SSOServerTokenVO` ADD sessionUuid VARCHAR(32) DEFAULT NULL; +ALTER TABLE `zstack`.`SSOServerTokenVO` ADD CONSTRAINT `fkSSOServerTokenVOSessionVO` FOREIGN KEY (`sessionUuid`) REFERENCES `SessionVO` (`uuid`) ON DELETE CASCADE; + +CALL ADD_COLUMN('SdnControllerVO', 'status', 'VARCHAR(32)', 0, 'Connected'); +CALL ADD_COLUMN('HostNetworkInterfaceVO', 'driverType', 'VARCHAR(32)', 1, NULL); + +CREATE TABLE IF NOT EXISTS `zstack`.`SdnControllerHostRefVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `sdnControllerUuid` varchar(32) NOT NULL, + `hostUuid` varchar(32) NOT NULL, + `vSwitchType` varchar(255) NOT NULL, + `vtepIp` varchar(128) DEFAULT NULL, + `netmask` varchar(128) DEFAULT NULL, + `nicPciAddresses` varchar(1024) DEFAULT NULL, + `nicDrivers` varchar(1024) DEFAULT NULL, + `bondMode` varchar(64) DEFAULT NULL, + `lacpMode` varchar(64) DEFAULT NULL, + CONSTRAINT fkSdnControllerHostRefVOSdnControllerVO FOREIGN KEY (sdnControllerUuid) REFERENCES SdnControllerVO (uuid) ON DELETE CASCADE, + CONSTRAINT fkSdnControllerHostRefVOHostEO FOREIGN KEY (hostUuid) REFERENCES HostEO (uuid) ON DELETE CASCADE, + CONSTRAINT ukSdnControllerHostRefVO UNIQUE (`sdnControllerUuid`,`hostUuid`, `vSwitchType`), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`OvnControllerVmOfferingVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementNetworkUuid` varchar(32) NOT NULL, + `imageUuid` varchar(32) NOT NULL, + `zoneUuid` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkOvnControllerVmOfferingVOL3NetworkEO FOREIGN KEY (managementNetworkUuid) REFERENCES `zstack`.`L3NetworkEO` (uuid) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`OvnControllerVmInstanceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +UPDATE `zstack`.`L2NetworkVO` set vSwitchType='TfL2Network' where type='TfL2Network'; diff --git a/conf/db/upgrade/V5.3.22__schema.sql b/conf/db/upgrade/V5.3.22__schema.sql new file mode 100644 index 00000000000..9e8012b8158 --- /dev/null +++ b/conf/db/upgrade/V5.3.22__schema.sql @@ -0,0 +1,55 @@ +CALL ADD_COLUMN('ModelServiceInstanceVO', 'clusterId', 'INT', 1, NULL); + +CALL ADD_COLUMN('ModelServiceInstanceGroupVO', 'yaml', 'mediumtext', 1, NULL); + +DROP PROCEDURE IF EXISTS update_instance_group_yaml; + +DELIMITER $$ + +CREATE PROCEDURE update_instance_group_yaml() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE group_uuid VARCHAR(255); + DECLARE group_yaml TEXT; + DECLARE instance_yaml TEXT; + + DECLARE group_cursor CURSOR FOR + SELECT uuid, yaml FROM ModelServiceInstanceGroupVO; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN group_cursor; + + group_loop: LOOP + FETCH group_cursor INTO group_uuid, group_yaml; + + IF done THEN + LEAVE group_loop; + END IF; + + IF group_yaml IS NULL OR group_yaml = '' THEN + SELECT yaml INTO instance_yaml + FROM ModelServiceInstanceVO + WHERE modelServiceGroupUuid = group_uuid + LIMIT 1; + + IF instance_yaml IS NOT NULL AND instance_yaml != '' THEN + UPDATE ModelServiceInstanceGroupVO + SET yaml = instance_yaml + WHERE uuid = group_uuid; + + SELECT CONCAT('updated group_uuid: ', group_uuid, ' yaml'); + END IF; + ELSE + SELECT CONCAT('group_uuid: ', group_uuid, ' yaml is not null, skip'); + END IF; + END LOOP; + + CLOSE group_cursor; + + SELECT 'update_instance_group_yaml done'; +END$$ + +DELIMITER ; + +CALL update_instance_group_yaml(); \ No newline at end of file diff --git a/conf/db/upgrade/V5.3.28__schema.sql b/conf/db/upgrade/V5.3.28__schema.sql new file mode 100644 index 00000000000..171950ac050 --- /dev/null +++ b/conf/db/upgrade/V5.3.28__schema.sql @@ -0,0 +1,181 @@ +DROP PROCEDURE IF EXISTS createThickProvisionVolumeTag; +DELIMITER $$ +CREATE PROCEDURE createThickProvisionVolumeTag() +BEGIN + DECLARE volUuid VARCHAR(32); + DECLARE newTagUuid VARCHAR(32); + DECLARE done INT DEFAULT FALSE; + + DECLARE volCursor CURSOR FOR + SELECT uuid + FROM zstack.VolumeVO + WHERE type = 'Memory' + AND primaryStorageUuid IN ( + SELECT uuid + FROM zstack.PrimaryStorageVO + WHERE type = 'SharedBlock' + ) + AND uuid NOT IN ( + SELECT resourceUuid + FROM zstack.SystemTagVO + WHERE resourceType = 'VolumeVO' + AND tag = 'volumeProvisioningStrategy::ThickProvisioning' + ); + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN volCursor; + + read_loop: + LOOP + FETCH volCursor INTO volUuid; + IF done THEN + LEAVE read_loop; + END IF; + + SET newTagUuid = REPLACE(UUID(), '-', ''); + + INSERT INTO zstack.SystemTagVO (uuid, resourceUuid, resourceType, inherent, type, tag, createDate, lastOpDate) + VALUES (newTagUuid, volUuid, 'VolumeVO', 0, 'System', 'volumeProvisioningStrategy::ThickProvisioning', CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); + END LOOP; + + CLOSE volCursor; + SELECT CURTIME() AS finishTime; +END $$ +DELIMITER ; + +CALL createThickProvisionVolumeTag(); +DROP PROCEDURE IF EXISTS createThickProvisionVolumeTag; + +ALTER TABLE `zstack`.`EncryptionIntegrityVO` MODIFY COLUMN `resourceUuid` varchar(128) NOT NULL; + +ALTER TABLE `zstack`.`OAuth2ClientVO` ADD COLUMN `pluginUuid` varchar(32) DEFAULT NULL; + +CREATE TABLE `zstack`.`ObservabilityServerOfferingVO`( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementNetworkUuid` varchar(32) DEFAULT NULL, + `publicNetworkUuid` varchar(32) DEFAULT NULL, + `imageUuid` varchar(32) NOT NULL, + `zoneUuid` varchar(32) NOT NULL, + `isDefault` tinyint(1) unsigned DEFAULT 0, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOImageEO FOREIGN KEY (imageUuid) REFERENCES ImageEO (uuid) ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOInstanceOfferingEO FOREIGN KEY (uuid) REFERENCES InstanceOfferingEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOL3NetworkEO FOREIGN KEY (managementNetworkUuid) REFERENCES L3NetworkEO (uuid) ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOL3NetworkEO1 FOREIGN KEY (publicNetworkUuid) REFERENCES L3NetworkEO (uuid) ON DELETE CASCADE; +ALTER TABLE ObservabilityServerOfferingVO ADD CONSTRAINT fkObservabilityServerOfferingVOZoneEO FOREIGN KEY (zoneUuid) REFERENCES ZoneEO (uuid) ON DELETE CASCADE; + +CREATE TABLE `zstack`.`ObservabilityServerVmVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `publicNetworkUuid` varchar(32) DEFAULT NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE ObservabilityServerVmVO ADD CONSTRAINT fkObservabilityServerVmVOVmInstanceEO FOREIGN KEY (uuid) REFERENCES VmInstanceEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE; + +CREATE TABLE `zstack`.`ObservabilityServerServiceRefVO`( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `observabilityServerOfferingUuid` varchar(32) DEFAULT NULL, + `observabilityServerUuid` varchar(32) NOT NULL, + `serviceUuid` varchar(32) NOT NULL, + `serviceType` varchar(32) NOT NULL, + `observabilityServerPublicIp` varchar(32) DEFAULT NULL, + `servicePublicIp` varchar(32) DEFAULT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', +PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE ObservabilityServerServiceRefVO ADD CONSTRAINT fkObservabilityServerServiceRefVOResourceVO FOREIGN KEY (serviceUuid) REFERENCES ResourceVO (uuid) ON DELETE CASCADE; + +CREATE TABLE IF NOT EXISTS `zstack`.`CbtTaskVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `status` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`CbtTaskResourceRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `taskUuid` varchar(32) NOT NULL, + `resourceUuid` varchar(32) NOT NULL, + `resourceType` varchar(255) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `idxCbtTaskResourceRefVOtaskUuid` (`taskUuid`), + INDEX `idxCbtTaskResourceRefVOresourceUuid` (`resourceUuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +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, + `configuration` text NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('GuestVmScriptEO', 'encodingType', 'VARCHAR(32)', 1, 'PlainText'); +CALL ADD_COLUMN('GuestVmScriptExecutedRecordVO', 'encodingType', 'VARCHAR(32)', 1, 'PlainText'); +DROP VIEW IF EXISTS `zstack`.`GuestVmScriptVO`; +CREATE VIEW `zstack`.`GuestVmScriptVO` AS SELECT uuid, name, description, platform, encodingType, scriptContent, renderParams, scriptType, scriptTimeout, version, createDate, lastOpDate FROM `zstack`.`GuestVmScriptEO` WHERE deleted IS NULL; + +UPDATE `zstack`.`VolumeSnapshotTreeVO` t JOIN `zstack`.`VolumeVO` v ON t.volumeUuid = v.uuid +SET t.rootImageUuid = v.rootImageUuid +WHERE t.current = true + AND v.rootImageUuid IS NOT NULL + AND t.rootImageUuid IS NULL; + +CALL ADD_COLUMN('SecurityGroupVO', 'vSwitchType', 'VARCHAR(32)', 0, 'LinuxBridge'); + +DROP TABLE IF EXISTS HostHaStateVO; +CREATE TABLE `HostHaStateVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `hostUuid` VARCHAR(32) NOT NULL, + `primaryStorageUuid` VARCHAR(32) NOT NULL, + `state` varchar(32), + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `HostHaStateVO_HostEO_uuid_fk` FOREIGN KEY (`hostUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `HostHaStateVO_PrimaryStorageEO_uuid_fk` FOREIGN KEY (`primaryStorageUuid`) REFERENCES `PrimaryStorageEO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ZdfsVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `zoneUuid` varchar(32) NULL, + `url` varchar(255) NOT NULL, + `hostName` varchar(255) NOT NULL, + `sshPort` int(16) not NULL, + `status` varchar(32) NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ZdfsStorageVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `endPoint` varchar(255) NOT NULL, + `type` varchar(32) NOT NULL, + `accessKey` varchar(255) NULL, + `secretKey` varchar(255) NULL, + `usedCapacity` bigint(20) unsigned NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('ModelCenterVO', 'zoneUuid', 'VARCHAR(32)', 1, NULL); +CALL ADD_COLUMN('ModelCenterVO', 'zdfsUuid', 'VARCHAR(32)', 1, NULL); +ALTER TABLE ModelCenterVO ADD CONSTRAINT fkModelCenterVOZoneVO FOREIGN KEY (zoneUuid) REFERENCES ZoneEO (uuid) ON DELETE CASCADE; +ALTER TABLE ModelCenterVO ADD CONSTRAINT fkModelCenterVOZdfsVO FOREIGN KEY (zdfsUuid) REFERENCES ZdfsVO (uuid) ON DELETE SET NULL; \ No newline at end of file diff --git a/conf/db/upgrade/V5.3.36__schema.sql b/conf/db/upgrade/V5.3.36__schema.sql new file mode 100644 index 00000000000..d7a568582ea --- /dev/null +++ b/conf/db/upgrade/V5.3.36__schema.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`VolumeCbtBackupRecordVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `taskUuid` varchar(32) NOT NULL, + `volumeUuid` varchar(32) NOT NULL, + `mode` varchar(255) NOT NULL, + `target` varchar(2048) NOT NULL, + `scratchNodeName` varchar(255) NOT NULL, + `bitmapName` varchar(255) NOT NULL, + `lastBitmapName` varchar(255), + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/db/upgrade/V5.3.40__schema.sql b/conf/db/upgrade/V5.3.40__schema.sql new file mode 100644 index 00000000000..2310be14e45 --- /dev/null +++ b/conf/db/upgrade/V5.3.40__schema.sql @@ -0,0 +1,223 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceImageVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `modelServiceUuid` varchar(32) NOT NULL, + `cpuArchitecture` varchar(32) NOT NULL, + `vmImageUuid` varchar(32) NULL, + `dockerImage` varchar(255) NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + UNIQUE KEY `ukModelServiceCpuArch` (`modelServiceUuid`,`cpuArchitecture`) USING BTREE, + CONSTRAINT `fkModelServiceImageVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('ModelServiceVO', 'gpuVendors', 'varchar(255)', 1, 'NULL'); +CALL ADD_COLUMN('ModelServiceVO', 'cpuArchitectures', 'varchar(255)', 1, 'NULL'); + +DROP PROCEDURE IF EXISTS migrate_model_service_image_data; +DELIMITER $$ +CREATE PROCEDURE migrate_model_service_image_data() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE vm_image_uuid VARCHAR(32); + DECLARE docker_image VARCHAR(255); + DECLARE model_service_image_uuid VARCHAR(32); + DECLARE cpu_arch VARCHAR(32); + DECLARE existing_uuid VARCHAR(32); + + DECLARE all_services_cursor CURSOR FOR + SELECT uuid FROM ModelServiceVO; + + DECLARE vm_cursor CURSOR FOR + SELECT ms.uuid, ms.vmImageUuid + FROM ModelServiceVO ms + WHERE ms.vmImageUuid IS NOT NULL; + + DECLARE docker_cursor CURSOR FOR + SELECT ms.uuid, ms.dockerImage + FROM ModelServiceVO ms + WHERE ms.dockerImage IS NOT NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN all_services_cursor; + all_services_loop: LOOP + FETCH all_services_cursor INTO service_uuid; + IF done THEN + SET done = FALSE; + LEAVE all_services_loop; + END IF; + + IF NOT EXISTS (SELECT 1 FROM ModelServiceImageVO WHERE modelServiceUuid = service_uuid) THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, createDate, lastOpDate) + VALUES (model_service_image_uuid, service_uuid, 'x86_64', NOW(), NOW()); + END IF; + END LOOP; + CLOSE all_services_cursor; + + OPEN vm_cursor; + vm_read_loop: LOOP + FETCH vm_cursor INTO service_uuid, vm_image_uuid; + IF done THEN + SET done = FALSE; + LEAVE vm_read_loop; + END IF; + + SELECT IFNULL(img.architecture, 'x86_64') INTO cpu_arch + FROM ImageVO img + WHERE img.uuid = vm_image_uuid + LIMIT 1; + + IF cpu_arch IS NULL THEN + SET cpu_arch = 'x86_64'; + END IF; + + SELECT uuid INTO existing_uuid + FROM ModelServiceImageVO + WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch + LIMIT 1; + + IF existing_uuid IS NULL THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, vmImageUuid, createDate, lastOpDate) + VALUES (model_service_image_uuid, service_uuid, cpu_arch, vm_image_uuid, NOW(), NOW()); + ELSE + UPDATE ModelServiceImageVO + SET vmImageUuid = vm_image_uuid, lastOpDate = NOW() + WHERE uuid = existing_uuid; + END IF; + + SET existing_uuid = NULL; + END LOOP; + CLOSE vm_cursor; + + OPEN docker_cursor; + docker_read_loop: LOOP + FETCH docker_cursor INTO service_uuid, docker_image; + IF done THEN + LEAVE docker_read_loop; + END IF; + + SET cpu_arch = 'x86_64'; + + SELECT uuid INTO existing_uuid + FROM ModelServiceImageVO + WHERE modelServiceUuid = service_uuid AND cpuArchitecture = cpu_arch + LIMIT 1; + + IF existing_uuid IS NULL THEN + SET model_service_image_uuid = REPLACE(UUID(),'-',''); + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, dockerImage, createDate, lastOpDate) + VALUES (model_service_image_uuid, service_uuid, cpu_arch, docker_image, NOW(), NOW()); + ELSE + UPDATE ModelServiceImageVO + SET dockerImage = docker_image, lastOpDate = NOW() + WHERE uuid = existing_uuid; + END IF; + + SET existing_uuid = NULL; + END LOOP; + CLOSE docker_cursor; +END$$ +DELIMITER ; + +CALL migrate_model_service_image_data(); + +DROP PROCEDURE IF EXISTS ensure_model_service_image_completeness; +DELIMITER $$ +CREATE PROCEDURE ensure_model_service_image_completeness() +BEGIN + INSERT INTO ModelServiceImageVO (uuid, modelServiceUuid, cpuArchitecture, createDate, lastOpDate) + SELECT REPLACE(UUID(),'-',''), ms.uuid, 'x86_64', NOW(), NOW() + FROM ModelServiceVO ms + WHERE NOT EXISTS ( + SELECT 1 FROM ModelServiceImageVO msi WHERE msi.modelServiceUuid = ms.uuid + ); +END$$ +DELIMITER ; + +CALL ensure_model_service_image_completeness(); +DROP PROCEDURE IF EXISTS ensure_model_service_image_completeness; +DROP PROCEDURE IF EXISTS migrate_model_service_image_data; + +-- 确认数据完整后再删除字段 +CALL DROP_COLUMN('ModelServiceVO', 'vmImageUuid'); +CALL DROP_COLUMN('ModelServiceVO', 'dockerImage'); + +DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; +DELIMITER $$ +CREATE PROCEDURE update_model_service_cpu_arch() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE vm_image_uuid VARCHAR(32); + DECLARE cpu_arch VARCHAR(32); + DECLARE model_service_image_uuid VARCHAR(32); + DECLARE img_cursor CURSOR FOR + SELECT ms.uuid, msi.vmImageUuid, img.architecture + FROM ModelServiceVO ms + JOIN ModelServiceImageVO msi ON ms.uuid = msi.modelServiceUuid + JOIN ImageVO img ON msi.vmImageUuid = img.uuid + WHERE msi.vmImageUuid IS NOT NULL; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN img_cursor; + + read_loop: LOOP + FETCH img_cursor INTO service_uuid, vm_image_uuid, cpu_arch; + IF done THEN + LEAVE read_loop; + END IF; + + UPDATE ModelServiceVO + SET cpuArchitectures = cpu_arch + WHERE uuid = service_uuid; + END LOOP; + + CLOSE img_cursor; +END$$ +DELIMITER ; + +CALL update_model_service_cpu_arch(); +DROP PROCEDURE IF EXISTS update_model_service_cpu_arch; + +CREATE TABLE IF NOT EXISTS `zstack`.`ContainerBackupStorageVO` ( + `uuid` varchar(32) NOT NULL, + `endpointUuid` varchar(32) NOT NULL, + `id` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkContainerBackupStorageVOBackupStorageEO` FOREIGN KEY (`uuid`) REFERENCES `BackupStorageEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkContainerBackupStorageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceCpuArchitectureVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `modelServiceUuid` varchar(32) NOT NULL, + `architecture` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `fkModelServiceCpuArchitectureVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGpuVendorVO` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `modelServiceUuid` varchar(32) NOT NULL, + `gpuVendor` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `fkModelServiceGpuVendorVOModelServiceVO` FOREIGN KEY (`modelServiceUuid`) REFERENCES `ModelServiceVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ContainerImageVO` ( + `uuid` varchar(32) NOT NULL, + `registryUrl` varchar(255) DEFAULT NULL, + `endpointUuid` varchar(32) NOT NULL, + `imageTag` varchar(64) DEFAULT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkContainerImageVOImageEO` FOREIGN KEY (`uuid`) REFERENCES `ImageEO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkContainerImageVOContainerManagementEndpointVO` FOREIGN KEY (`endpointUuid`) REFERENCES `ContainerManagementEndpointVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/conf/db/upgrade/V5.3.46__schema.sql b/conf/db/upgrade/V5.3.46__schema.sql new file mode 100644 index 00000000000..717fc5dcf4b --- /dev/null +++ b/conf/db/upgrade/V5.3.46__schema.sql @@ -0,0 +1,80 @@ +-- Migration script to update AuditVO table from AccountId to ProjectId. +-- This script efficiently migrates data using a single JOIN operation. + +DELIMITER $$ +DROP PROCEDURE IF EXISTS changeAccountIdToProjectIdForAuditVO$$ +CREATE PROCEDURE changeAccountIdToProjectIdForAuditVO() + pro_label: BEGIN + DECLARE v_total_updated INT DEFAULT 0; + + IF (SELECT COUNT(*) FROM IAM2ProjectAccountRefVO) = 0 THEN +SELECT 'No IAM2ProjectAccountRefVO records found, skipping migration.' AS message; +LEAVE pro_label; +END IF; + +SELECT 'Starting migration of AuditsVO records from AccountUuid to ProjectUuid...' AS message; + +UPDATE AuditsVO a + JOIN IAM2ProjectAccountRefVO i +ON a.resourceUuid = i.accountUuid + SET a.resourceUuid = i.projectUuid, + a.resourceType = CASE + WHEN a.resourceType = 'AccountVO' THEN 'IAM2ProjectVO' + ELSE a.resourceType +END +WHERE a.apiName = 'org.zstack.header.identity.APIUpdateQuotaMsg'; + SET v_total_updated = ROW_COUNT(); +SELECT CONCAT('Migration completed successfully. Total records updated: ', v_total_updated) AS message; + +END$$ + +DELIMITER ; +CALL changeAccountIdToProjectIdForAuditVO(); +DROP PROCEDURE IF EXISTS changeAccountIdToProjectIdForAuditVO; + +CALL ADD_COLUMN('SdnControllerVO', 'vendorVersion', 'VARCHAR(32)', 0, 'V1'); + +CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnControllerTenantVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `sdnControllerUuid` varchar(32) NOT NULL, + `tenantUuid` varchar(255) DEFAULT NULL, + `vdsUuid` varchar(255) DEFAULT NULL, + `tenantName` varchar(255) DEFAULT NULL, + `vdsName` varchar(255) DEFAULT NULL, + `cloudDomainName` varchar(255) DEFAULT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT `fkH3cSdnControllerTenantVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`H3cSdnSubnetIpRangeRefVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `sdnControllerUuid` varchar(32) NOT NULL, + `ipRangeUuid` varchar(32) NOT NULL, + `subnetUuid` varchar(255) NOT NULL, + `l2NetworkUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + CONSTRAINT `fkH3cSdnSubnetIpRangeRefVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkH3cSdnSubnetIpRangeRefVOIpRangeVO` FOREIGN KEY (`ipRangeUuid`) REFERENCES `IpRangeEO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DELETE FROM UserTagVO WHERE uuid = 'a4de80903e57422699fb05bd367a3cb4'; + +CALL ADD_COLUMN('PciDeviceSpecVO', 'allowResourceConfigWithMultipleDevices', 'tinyint(1)', 0, '1'); + +CALL ADD_COLUMN('GpuDeviceVO', 'opaque', 'MEDIUMTEXT', 1, NULL); + +CALL ADD_COLUMN('ModelServiceInstanceVO', 'nodeRank', 'int', 1, 0); + +CREATE TABLE IF NOT EXISTS `zstack`.`GpuDeviceSpecVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `memory` bigint unsigned NULL DEFAULT 0, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkGpuDeviceSpecVOPciDeviceSpecVO` FOREIGN KEY (`uuid`) REFERENCES `PciDeviceSpecVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('ModelServiceVO', 'supportDistributed', 'tinyint(1)', 0, 0); diff --git a/conf/db/upgrade/V5.3.52__schema.sql b/conf/db/upgrade/V5.3.52__schema.sql new file mode 100644 index 00000000000..919a97c0afe --- /dev/null +++ b/conf/db/upgrade/V5.3.52__schema.sql @@ -0,0 +1,79 @@ +CALL ADD_COLUMN('ModelServiceInstanceVO', 'name', 'VARCHAR(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceInstanceVO', 'namespace', 'VARCHAR(255)', 1, NULL); + +-- Delete old vm records for pod and resync will be done after node started +DELETE FROM `ResourceVO` where resourceType = 'VmInstanceVO' and uuid in (SELECT uuid FROM `VmInstanceEO` where hypervisorType = 'Native'); +DELETE FROM `VmInstanceEO` where hypervisorType = 'Native'; + +CREATE TABLE `zstack`.`PodVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `status` varchar(64) NOT NULL, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('GpuDeviceVO', 'gpuType', 'VARCHAR(255)', 1, NULL); +CALL ADD_COLUMN('GpuDeviceSpecVO', 'gpuType', 'VARCHAR(255)', 1, NULL); + +DROP PROCEDURE IF EXISTS update_gpu_type_from_pci; + +DELIMITER $$ + +CREATE PROCEDURE update_gpu_type_from_pci() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE pci_uuid_val VARCHAR(32); + DECLARE pci_host_uuid_val VARCHAR(32); + DECLARE pci_description_val VARCHAR(2048); + DECLARE kvm_host_count INT; + + DECLARE cur CURSOR FOR + SELECT pd.uuid, pd.hostUuid, pd.description + FROM PciDeviceVO pd + INNER JOIN GpuDeviceVO gd ON pd.uuid = gd.uuid; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO pci_uuid_val, pci_host_uuid_val, pci_description_val; + + IF done THEN + LEAVE read_loop; + END IF; + + SELECT COUNT(*) INTO kvm_host_count FROM KVMHostVO WHERE uuid = pci_host_uuid_val; + + IF kvm_host_count > 0 THEN + UPDATE GpuDeviceVO + SET gpuType = pci_description_val + WHERE uuid = pci_uuid_val; + END IF; + + END LOOP; + + SELECT CURTIME(); + + CLOSE cur; +END$$ + +DELIMITER ; + +CALL update_gpu_type_from_pci(); + +UPDATE ModelCenterVO m +LEFT JOIN L3NetworkEO l ON m.storageNetworkUuid = l.uuid +SET m.storageNetworkUuid = NULL +WHERE m.storageNetworkUuid IS NOT NULL AND l.uuid IS NULL; + +UPDATE ModelCenterVO m +LEFT JOIN L3NetworkEO l ON m.serviceNetworkUuid = l.uuid +SET m.serviceNetworkUuid = NULL +WHERE m.serviceNetworkUuid IS NOT NULL AND l.uuid IS NULL; + +ALTER TABLE ModelCenterVO + MODIFY COLUMN storageNetworkUuid VARCHAR(32) NULL, + MODIFY COLUMN serviceNetworkUuid VARCHAR(32) NULL; + +CALL ADD_CONSTRAINT('ModelCenterVO', 'fkModelCenterVOStorageNetworkUuid', 'storageNetworkUuid', 'L3NetworkEO', 'uuid', 'SET NULL'); +CALL ADD_CONSTRAINT('ModelCenterVO', 'fkModelCenterVOServiceNetworkUuid', 'serviceNetworkUuid', 'L3NetworkEO', 'uuid', 'SET NULL'); diff --git a/conf/db/upgrade/V5.3.6__schema.sql b/conf/db/upgrade/V5.3.6__schema.sql new file mode 100644 index 00000000000..4f19bb82cda --- /dev/null +++ b/conf/db/upgrade/V5.3.6__schema.sql @@ -0,0 +1,65 @@ +CREATE TABLE IF NOT EXISTS `zstack`.`KoAlSecretResourcePoolVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `managementIp` varchar(32) NOT NULL, + `port` int unsigned NOT NULL, + `secretKey` varchar(255) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkKoAlSecretResourcePoolVOSecretResourcePoolVO FOREIGN KEY (uuid) REFERENCES SecretResourcePoolVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD taskRequestInJson VARCHAR(8192) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` ADD type VARCHAR(32) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY `evaluatedServiceGroupUuid` varchar(32) DEFAULT NULL; +ALTER TABLE `zstack`.`ModelEvaluationTaskVO` MODIFY datasetUuid VARCHAR(32) DEFAULT NULL; + +INSERT INTO SystemTagVO +(`uuid`, `resourceUuid`, `resourceType`, `inherent`, `type`, `tag`, `createDate`, `lastOpDate`) +SELECT + REPLACE(UUID(), '-', ''), -- 生成不含连字符的uuid + uuid, -- 使用DatasetVO的uuid作为resourceUuid + 'DatasetVO', -- resourceType + 1, -- inherent + 'System', -- type + 'dataset::usage::scenarios::ModelEval', -- tag + CURRENT_TIMESTAMP(), -- createDate + CURRENT_TIMESTAMP() -- lastOpDate +FROM DatasetVO +WHERE `system` = true; + +INSERT INTO SystemTagVO +(`uuid`, `resourceUuid`, `resourceType`, `inherent`, `type`, `tag`, `createDate`, `lastOpDate`) +SELECT + REPLACE(UUID(), '-', ''), -- 生成不含连字符的uuid + uuid, -- 使用DatasetVO的uuid作为resourceUuid + 'DatasetVO', -- resourceType + 1, -- inherent + 'System', -- type + 'dataset::datatype::Text', -- tag + CURRENT_TIMESTAMP(), -- createDate + CURRENT_TIMESTAMP() -- lastOpDate +FROM DatasetVO +WHERE `system` = true; + +CALL RENAME_TABLE('ContainerManagementVmVO', 'ContainerManagementEndpointVO'); + +CALL DROP_COLUMN('ContainerManagementEndpointVO', 'vmInstanceUuid'); + +CREATE TABLE IF NOT EXISTS `zstack`.`NativeClusterVO` ( + `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'native cluster uuid', + `endpointUuid` varchar(32) NOT NULL COMMENT 'container endpoint uuid', + `bizUrl` varchar(255) DEFAULT NULL COMMENT 'business network url', + `masterUrl` varchar(255) DEFAULT NULL COMMENT 'management network url', + `kubeConfig` text COMMENT 'kubernetes configuration', + `id` bigint(20) DEFAULT NULL COMMENT 'kubernetes cluster id', + `prometheusURL` varchar(255) DEFAULT NULL COMMENT 'prometheus monitoring url', + `version` varchar(64) DEFAULT NULL COMMENT 'kubernetes version', + `nodeCount` int DEFAULT NULL COMMENT 'number of nodes', + `createType` varchar(32) DEFAULT NULL COMMENT 'cluster creation type', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`NativeHostVO` ( + `uuid` varchar(32) NOT NULL UNIQUE COMMENT 'host uuid', + `endpointUuid` varchar(32) NOT NULL COMMENT 'container endpoint uuid', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/db/upgrade/V5.4.0__schema.sql b/conf/db/upgrade/V5.4.0__schema.sql new file mode 100644 index 00000000000..f9f877d98f4 --- /dev/null +++ b/conf/db/upgrade/V5.4.0__schema.sql @@ -0,0 +1,221 @@ +CREATE TABLE IF NOT EXISTS `SSOClientAttributeVO` ( + `uuid` VARCHAR(32) NOT NULL, + `name` TEXT NOT NULL, + `value` TEXT DEFAULT NULL, + `type` VARCHAR(32) NOT NULL, + `purpose` VARCHAR(32) NOT NULL, + `ssoClientUuid` VARCHAR(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`), + CONSTRAINT `fkSSOClientAttributeVOSSOClientVO` FOREIGN KEY (`ssoClientUuid`) REFERENCES SSOClientVO (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedNodeVO` ( + `uuid` char(32) NOT NULL UNIQUE, + `appId` char(32) NOT NULL, + `ip` varchar(255) NOT NULL, + `lastSyncDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + `status` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizedCapacityVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nodeUuid` char(32) NOT NULL, + `resourceUuid` char(32) DEFAULT NULL, + `quotaType` varchar(64) NOT NULL, + `quota` bigint unsigned DEFAULT 0, + `licenseType` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59' ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`id`), + CONSTRAINT `fkLicenseAuthorizedCapacityLicenseAuthorizedNode` FOREIGN KEY (`nodeUuid`) REFERENCES `LicenseAuthorizedNodeVO` (`uuid`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`LicenseAuthorizeHistoryVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `nodeUuid` char(32) NOT NULL, + `resourceUuid` char(32) DEFAULT NULL, + `quotaType` varchar(64) NOT NULL, + `usageFrom` bigint unsigned DEFAULT 0, + `usageTo` bigint unsigned DEFAULT NULL, + `quota` bigint unsigned DEFAULT 0, + `licenseType` varchar(64) NOT NULL, + `type` varchar(64) NOT NULL, + `action` varchar(255) NOT NULL, + `result` varchar(64) DEFAULT NULL, + `error` text DEFAULT NULL, + `requestUuid` char(32) NOT NULL, + `createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `zstack`.`LicenseHistoryVO` ADD COLUMN `quotaType` varchar(64) DEFAULT 'None'; +ALTER TABLE HostCapacityVO ADD cpuCoreNum int unsigned NOT NULL DEFAULT 0; + +CREATE TABLE `zstack`.`L3NetworkSequenceNumberVO` ( + `id` int unsigned NOT NULL UNIQUE AUTO_INCREMENT, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `zstack`.`L3NetworkEO` ADD COLUMN `internalId` INT(32) unsigned DEFAULT 0; +DROP VIEW IF EXISTS `zstack`.`L3NetworkVO`; +CREATE VIEW `zstack`.`L3NetworkVO` AS SELECT uuid, name, internalId, description, state, type, zoneUuid, l2NetworkUuid, `system`, dnsDomain, createDate, lastOpDate, category, ipVersion, enableIPAM, isolated FROM `zstack`.`L3NetworkEO` WHERE deleted IS NULL; + +CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupVO` ( + `uuid` VARCHAR(32) NOT NULL UNIQUE, + `name` VARCHAR(255) NOT NULL, + `status` varchar(32) NOT NULL, + `description` VARCHAR(2048) DEFAULT NULL, + `imageCount` int unsigned NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`ImageGroupRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `imageUuid` VARCHAR(32) NOT NULL, + `imageGroupUuid` VARCHAR(32) NOT NULL, + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `dstPortRange` varchar(1024) DEFAULT NULL; +ALTER TABLE SecurityGroupRuleVO MODIFY COLUMN `srcPortRange` varchar(1024) DEFAULT NULL; + +# Delete data with blank lines at the end (Reconnect host added again) +DELETE FROM `zstack`.`HostNetworkInterfaceVO` WHERE `pciDeviceAddress` LIKE '%\n'; + +CREATE TABLE IF NOT EXISTS `zstack`.`SAML2ClientVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `idpMetadataBase64` TEXT, + `spX509Certificate` TEXT, + `spPrivateKey` TEXT, + `spMetadataUrl` varchar(256) DEFAULT NULL, + `state` varchar(32) NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkSAMLClientVOSSOClientVO` FOREIGN KEY (`uuid`) REFERENCES `SSOClientVO` (`uuid`) ON UPDATE RESTRICT ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`PhysicalSwitchVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `ip` varchar(64) NOT NULL, + `mac` varchar(32) NOT NULL, + `mode` varchar(128) NOT NULL, + `softwareVersion` varchar(128) NOT NULL, + `sdnControllerUuid` varchar(32) DEFAULT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`PhysicalSwitchPortVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `ethTrunkName` varchar(255) DEFAULT NULL, + `portType` varchar(64) NOT NULL, + `peerInterfaceUuid` varchar(32) DEFAULT NULL, + `switchUuid` varchar(32) NOT NULL, + `sdnControllerUuid` varchar(32) DEFAULT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkPhysicalSwitchPortVOHostNetworkInterfaceVO` FOREIGN KEY (`peerInterfaceUuid`) REFERENCES `HostNetworkInterfaceVO` (`uuid`) ON DELETE SET NULL, + CONSTRAINT `fkPhysicalSwitchPortVOPhysicalSwitchVO` FOREIGN KEY (`switchUuid`) REFERENCES `PhysicalSwitchVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterFabricVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterFabricVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterTenantVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterTenantVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterVpcVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `tenantId` varchar(32) NOT NULL, + `fabricId` varchar(2048) NOT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `isVpcDeployed` BOOLEAN NOT NULL DEFAULT TRUE, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterVpcVOTenantVO` FOREIGN KEY (`tenantId`) REFERENCES `HuaweiIMasterTenantVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVpcVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterVRouterVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(255) NOT NULL, + `description` varchar(2048) DEFAULT NULL, + `logicalNetworkId` varchar(32) NOT NULL, + `tenantId` varchar(32) NOT NULL, + `fabricUuid` varchar(32) NOT NULL, + `sdnControllerUuid` varchar(32) NOT NULL, + `state` varchar(32) NOT NULL DEFAULT "Enabled", + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkHuaweiIMasterVRouterVOLogicalNetworkVO` FOREIGN KEY (`logicalNetworkId`) REFERENCES `HuaweiIMasterVpcVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVRouterVOTenantVO` FOREIGN KEY (`tenantId`) REFERENCES `HuaweiIMasterTenantVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVRouterVOHuaweiIMasterFabricVO` FOREIGN KEY (`fabricUuid`) REFERENCES `HuaweiIMasterFabricVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkHuaweiIMasterVRouterVOSdnControllerVO` FOREIGN KEY (`sdnControllerUuid`) REFERENCES `SdnControllerVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HardwareL2VxlanNetworkVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `vlan` int unsigned NOT NULL, + PRIMARY KEY (`uuid`), + CONSTRAINT fkHardwareL2VxlanNetworkVOL2NetworkEO FOREIGN KEY (uuid) REFERENCES L2NetworkEO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterSdnControllerVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + PRIMARY KEY (`uuid`), + CONSTRAINT fkHuaweiIMasterSdnControllerVOSdnControllerVO FOREIGN KEY (uuid) REFERENCES SdnControllerVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `zstack`.`HuaweiIMasterTenantFabricRefVO` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `tenantUuid` varchar(32) NOT NULL, + `fabricUuid` varchar(32) NOT NULL, + `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP, + `createDate` timestamp, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_fabric` (`tenantUuid`, `fabricUuid`), + CONSTRAINT fkHuaweiIMasterTenantFabricRefVOHuaweiIMasterFabricVO FOREIGN KEY (fabricUuid) REFERENCES HuaweiIMasterFabricVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE, + CONSTRAINT fkHuaweiIMasterTenantFabricRefVOHuaweiIMasterTenantVO FOREIGN KEY (tenantUuid) REFERENCES HuaweiIMasterTenantVO (uuid) ON UPDATE RESTRICT ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('HardwareL2VxlanNetworkPoolVO', 'startVlan', 'int unsigned', 1, NULL); +CALL ADD_COLUMN('HardwareL2VxlanNetworkPoolVO', 'endVlan', 'int unsigned', 1, NULL); \ No newline at end of file diff --git a/conf/db/upgrade/V5.4.2__schema.sql b/conf/db/upgrade/V5.4.2__schema.sql new file mode 100644 index 00000000000..476304fd72d --- /dev/null +++ b/conf/db/upgrade/V5.4.2__schema.sql @@ -0,0 +1,267 @@ +ALTER TABLE `zstack`.`MdevDeviceSpecVO` modify column name varchar(128) NOT NULL; +ALTER TABLE `zstack`.`MdevDeviceVO` modify column name varchar(128) NOT NULL; + +CALL ADD_COLUMN('ModelVO', 'framework', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'versionSemver', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'isLatestVersion', 'tinyint(1)', 1, '0'); +CALL ADD_COLUMN('ModelVO', 'artifactChecksum', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'artifactSizeBytes', 'bigint', 1, '0'); +CALL ADD_COLUMN('ModelVO', 'architectureType', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'frameworkVersion', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'requiredAccelerator', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'quantizationType', 'varchar(255)', 1, NULL); + +CALL RENAME_TABLE('ModelServiceImageVO', 'ModelServiceTemplateVO'); + +CALL ADD_COLUMN('ModelServiceTemplateVO', 'pythonVersionSemver', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'cudaVersion', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'cannVersion', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'frameworkVersionSemver', 'varchar(255)', 1, NULL); +CALL ADD_COLUMN('ModelServiceTemplateVO', 'gpuVendor', 'varchar(255)', 1, NULL); + +CALL ADD_COLUMN('PodVO', 'namespace', 'varchar(64)', 1, NULL); + +CREATE TABLE IF NOT EXISTS `zstack`.`KubernetesServiceVO` ( + `uuid` varchar(32) NOT NULL UNIQUE, + `name` varchar(64) NOT NULL, + `description` varchar(255) DEFAULT NULL, + `namespace` varchar(64) NOT NULL, + `type` varchar(20) NOT NULL, + `clusterIp` varchar(64) DEFAULT NULL, + `externalIp` varchar(64) DEFAULT NULL, + `ports` text, + `endpointUuid` varchar(32) NOT NULL, + `clusterId` INT DEFAULT NULL, + `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL ADD_COLUMN('PodVO', 'clusterId', 'INT', 1, NULL); + +DELETE FROM `AccountResourceRefVO` +WHERE `concreteResourceType` = 'org.zstack.header.vm.VmInstanceVO' + AND `resourceUuid` NOT IN (SELECT `uuid` FROM `VmInstanceVO`); + +CALL DROP_COLUMN('ModelCenterCapacityVO', 'installationUsedCapacity'); +CALL ADD_COLUMN('NativeClusterVO', 'status', 'varchar(32)', 1, NULL); + +UPDATE `NativeClusterVO` SET `status` = 'Status_Cluster_Running' WHERE `status` IS NULL; + +CREATE TABLE IF NOT EXISTS `zstack`.`ModelServiceGpuVendorSpecRefVO` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `refUuid` bigint UNSIGNED NOT NULL, + `specUuid` varchar(32) NOT NULL, + CONSTRAINT `pkModelServiceGpuVendorSpecRef` PRIMARY KEY (`id`), + CONSTRAINT `ukModelServiceGpuVendorSpecRefRefSpec` UNIQUE (`refUuid`, `specUuid`), + CONSTRAINT `fkModelServiceGpuVendorSpecRefRefUuid` FOREIGN KEY (`refUuid`) + REFERENCES `ModelServiceGpuVendorVO`(`id`) + ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE OR REPLACE VIEW PodGpuStatsVO AS +SELECT + p.uuid AS podUuid, + COUNT(g.uuid) AS gpuCount, + COALESCE(CAST(ROUND(AVG(g.memory)) AS SIGNED), 0) AS avgAllocatedMb, + COALESCE(CAST(SUM(g.memory) AS SIGNED), 0) AS totalGpuMemMb +FROM PodVO p + LEFT JOIN PciDeviceVO pci ON pci.vmInstanceUuid = p.uuid + LEFT JOIN GpuDeviceVO g ON g.uuid = pci.uuid +GROUP BY p.uuid; + +CALL ADD_COLUMN('GpuDeviceVO', 'allocateStatus', 'varchar(32)', 1, NULL); + +-- Upgrade GpuDeviceVO.allocateStatus based vmInstanceUuid +UPDATE GpuDeviceVO gpuDevice +JOIN PciDeviceVO pciDevice ON gpuDevice.uuid = pciDevice.uuid +SET gpuDevice.allocateStatus = + CASE + WHEN pciDevice.vmInstanceUuid IS NOT NULL THEN 'Allocated' + ELSE 'Unallocated' + END; + +DELIMITER $$ +CREATE PROCEDURE update_system_model_service_gpu_vendors() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE model_name VARCHAR(255); + DECLARE gpu_vendor_name VARCHAR(32); + + -- Cursor to iterate over the models + DECLARE models_cursor CURSOR FOR + SELECT name, vendor FROM system_models_to_update; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + -- Temporary table to hold the data + CREATE TEMPORARY TABLE IF NOT EXISTS system_models_to_update ( + name VARCHAR(255), + vendor VARCHAR(32) + ); + + -- Populate the temporary table + INSERT INTO system_models_to_update (name, vendor) VALUES + ('vLLM-0.7.2', 'NVIDIA'), + ('vLLM-0.8.5', 'NVIDIA'), + ('vLLM-0.9.2', 'NVIDIA'), + ('vLLM-0.11.0', 'NVIDIA'), + ('SGLang-0.4.9.post1', 'NVIDIA'), + ('SGLang-0.5.2', 'NVIDIA'), + ('Transformers-4.48.3', 'NVIDIA'), + ('Transformers-4.56.2', 'NVIDIA'), + ('sentence_transformers-3.1.1', 'NVIDIA'), + ('Diffusers-0.30.0', 'NVIDIA'), + ('Diffusers-0.35.1', 'NVIDIA'), + ('MindIE-2.0.RC1-910B', 'HUAWEI'), + ('MindIE-2.1.RC1-910B', 'HUAWEI'), + ('MindIE-1.0.0-310P', 'HUAWEI'), + ('vLLM-Ascend-0.11.0.rc0', 'HUAWEI'), + ('vLLM-0.5.0-HYGON-Z100L', 'HAIGUANG'), + ('vLLM-0.8.5-HYGON-K100-AI', 'HAIGUANG'), + ('vLLM-0.9.2-HYGON-K100-AI', 'HAIGUANG'), + ('vLLM-0.7.2-HYGON-K100-AI', 'HAIGUANG'), + ('MinerU2.5-2509', 'NVIDIA'); + + OPEN models_cursor; + update_loop: LOOP + FETCH models_cursor INTO model_name, gpu_vendor_name; + IF done THEN + LEAVE update_loop; + END IF; + + -- Find the model service uuid, only for system services + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + IF @cnt > 0 THEN + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + ELSE + SET service_uuid = NULL; + END IF; + + -- If the model service exists, ensure the GPU vendor is associated + IF service_uuid IS NOT NULL THEN + SELECT CONCAT('INFO: Processing model=', model_name, ', service_uuid=', service_uuid, ', desired_vendor=', gpu_vendor_name) AS msg; + -- delete different gpu vendors + DELETE FROM `zstack`.`ModelServiceGpuVendorVO` + WHERE modelServiceUuid = service_uuid + AND gpuVendor <> gpu_vendor_name; + SELECT CONCAT('INFO: Deleted different GPU vendors for service_uuid=', service_uuid, ', deleted_rows=', ROW_COUNT()) AS msg; + IF NOT EXISTS (SELECT 1 FROM `zstack`.`ModelServiceGpuVendorVO` WHERE modelServiceUuid = service_uuid AND gpuVendor = gpu_vendor_name) THEN + INSERT INTO `zstack`.`ModelServiceGpuVendorVO` (modelServiceUuid, gpuVendor, createDate, lastOpDate) + VALUES (service_uuid, gpu_vendor_name, NOW(), NOW()); + SELECT CONCAT('INFO: Inserted GPU vendor=', gpu_vendor_name, ' for service_uuid=', service_uuid, ', inserted_rows=', ROW_COUNT()) AS msg; + ELSE + SELECT CONCAT('INFO: GPU vendor=', gpu_vendor_name, ' already exists for service_uuid=', service_uuid) AS msg; + END IF; + ELSE + SELECT CONCAT('WARN: Service not found for model=', model_name) AS msg; + END IF; + + SET service_uuid = NULL; + + END LOOP; + CLOSE models_cursor; + + -- Clean up + DROP TEMPORARY TABLE system_models_to_update; + +END $$ +DELIMITER ; + +CALL update_system_model_service_gpu_vendors(); +DROP PROCEDURE IF EXISTS update_system_model_service_gpu_vendors; + +DELIMITER $$ +CREATE PROCEDURE update_system_model_service_templates() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE service_uuid VARCHAR(32); + DECLARE model_name VARCHAR(255); + DECLARE gpu_vendor_name VARCHAR(32); + DECLARE py_version VARCHAR(255); + DECLARE cuda_version VARCHAR(255); + DECLARE cann_version VARCHAR(255); + DECLARE fw_version VARCHAR(255); + + DECLARE templates_cursor CURSOR FOR + SELECT name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion FROM system_models_templates_to_update; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + CREATE TEMPORARY TABLE IF NOT EXISTS system_models_templates_to_update ( + name VARCHAR(255), + vendor VARCHAR(32), + pythonVersion VARCHAR(255), + cudaVersion VARCHAR(255), + cannVersion VARCHAR(255), + frameworkVersion VARCHAR(255) + ); + + INSERT INTO system_models_templates_to_update (name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion) VALUES + ('vLLM-0.7.2', 'NVIDIA', '3.10', '12.5', NULL, '0.7.2'), + ('vLLM-0.8.5', 'NVIDIA', '3.10', '12.5', NULL, '0.8.5'), + ('vLLM-0.9.2', 'NVIDIA', '3.10', '12.5', NULL, '0.9.2'), + ('vLLM-0.11.0', 'NVIDIA', '3.10', '12.5', NULL, '0.11.0'), + ('SGLang-0.4.9.post1', 'NVIDIA', '3.10', '12.5', NULL, '0.4.9.post1'), + ('SGLang-0.5.2', 'NVIDIA', '3.10', '12.5', NULL, '0.5.2'), + ('Transformers-4.48.3', 'NVIDIA', '3.10', '12.5', NULL, '4.48.3'), + ('Transformers-4.56.2', 'NVIDIA', '3.10', '12.5', NULL, '4.56.2'), + ('sentence_transformers-3.1.1', 'NVIDIA', '3.10', '12.5', NULL, '3.1.1'), + ('Diffusers-0.30.0', 'NVIDIA', '3.10', '12.5', NULL, '0.30.0'), + ('Diffusers-0.35.1', 'NVIDIA', '3.10', '12.5', NULL, '0.35.1'), + ('MindIE-2.0.RC1-910B', 'HUAWEI', '3.9', NULL, '8.0', '2.0.RC1'), + ('MindIE-2.1.RC1-910B', 'HUAWEI', '3.9', NULL, '8.0', '2.1.RC1'), + ('MindIE-1.0.0-310P', 'HUAWEI', '3.9', NULL, '7.0', '1.0.0'), + ('vLLM-Ascend-0.11.0.rc0', 'HUAWEI', '3.9', NULL, '8.0', '0.11.0.rc0'), + ('vLLM-0.5.0-HYGON-Z100L', 'HAIGUANG', '3.10', NULL, NULL, '0.5.0'), + ('vLLM-0.8.5-HYGON-K100-AI', 'HAIGUANG', '3.10', NULL, NULL, '0.8.5'), + ('vLLM-0.9.2-HYGON-K100-AI', 'HAIGUANG', '3.10', NULL, NULL, '0.9.2'), + ('vLLM-0.7.2-HYGON-K100-AI', 'HAIGUANG', '3.10', NULL, NULL, '0.7.2'), + ('MinerU2.5-2509', 'NVIDIA', '3.10', '12.5', NULL, '2.5'); + + OPEN templates_cursor; + update_template_loop: LOOP + FETCH templates_cursor INTO model_name, gpu_vendor_name, py_version, cuda_version, cann_version, fw_version; + IF done THEN + LEAVE update_template_loop; + END IF; + + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + IF @cnt > 0 THEN + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + ELSE + SET service_uuid = NULL; + END IF; + + IF service_uuid IS NOT NULL THEN + UPDATE `zstack`.`ModelServiceTemplateVO` + SET + `pythonVersionSemver` = py_version, + `cudaVersion` = cuda_version, + `cannVersion` = cann_version, + `frameworkVersionSemver` = fw_version, + `gpuVendor` = gpu_vendor_name + WHERE `modelServiceUuid` = service_uuid; + SELECT CONCAT('INFO: Updated ModelServiceTemplateVO for service_uuid=', service_uuid, ', updated_rows=', ROW_COUNT()) AS msg; + ELSE + SELECT CONCAT('WARN: Service not found for model=', model_name, ', skipping template update.') AS msg; + END IF; + + SET service_uuid = NULL; + END LOOP; + CLOSE templates_cursor; + + DROP TEMPORARY TABLE system_models_templates_to_update; +END $$ +DELIMITER ; + +CALL update_system_model_service_templates(); +DROP PROCEDURE IF EXISTS update_system_model_service_templates; + +-- Delete unexpected ModelServiceTemplateVO entries of MindIE-1.0.0-310P +DELETE FROM `zstack`.`ModelServiceTemplateVO` +WHERE `modelServiceUuid` = 'fe4ed042ac074c55ba1e76921b175ba5' and `cpuArchitecture` = 'x86_64'; + +DELETE FROM `zstack`.`ModelServiceCpuArchitectureVO` +WHERE `modelServiceUuid` = 'fe4ed042ac074c55ba1e76921b175ba5' and `architecture` = 'x86_64'; diff --git a/conf/db/upgrade/V5.4.6__schema.sql b/conf/db/upgrade/V5.4.6__schema.sql new file mode 100644 index 00000000000..17bc4ae92bf --- /dev/null +++ b/conf/db/upgrade/V5.4.6__schema.sql @@ -0,0 +1,353 @@ +-- Fix UsedIpVO gateway and netmask from empty strings +DROP PROCEDURE IF EXISTS fixUsedIpGatewayAndNetmask; + +DELIMITER $$ + +CREATE PROCEDURE fixUsedIpGatewayAndNetmask() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_usedIpUuid VARCHAR(32); + DECLARE v_ipRangeUuid VARCHAR(32); + DECLARE v_gateway VARCHAR(64); + DECLARE v_netmask VARCHAR(64); + + -- Cursor for UsedIpVO records with empty gateway or netmask + DECLARE cur CURSOR FOR + SELECT uuid, ipRangeUuid + FROM UsedIpVO + WHERE (gateway = '' OR netmask = '' OR gateway IS NULL OR netmask IS NULL) + AND ipRangeUuid IS NOT NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO v_usedIpUuid, v_ipRangeUuid; + + IF done THEN + LEAVE read_loop; + END IF; + + -- Get gateway and netmask from IpRangeVO + SELECT gateway, netmask + INTO v_gateway, v_netmask + FROM IpRangeVO + WHERE uuid = v_ipRangeUuid; + + -- Update UsedIpVO with correct gateway and netmask + IF v_gateway IS NOT NULL AND v_netmask IS NOT NULL THEN + UPDATE UsedIpVO + SET gateway = v_gateway, netmask = v_netmask + WHERE uuid = v_usedIpUuid; + END IF; + + END LOOP; + + CLOSE cur; + +END$$ + +DELIMITER ; + +-- Execute the procedure +CALL fixUsedIpGatewayAndNetmask(); + +-- Drop the procedure after use +DROP PROCEDURE IF EXISTS fixUsedIpGatewayAndNetmask; + + +-- Update ModelServiceVO framework values +DROP PROCEDURE IF EXISTS updateModelServiceFramework; + +DELIMITER $$ + +CREATE PROCEDURE updateModelServiceFramework() +BEGIN + DECLARE v_table_exists INT DEFAULT 0; + + -- Check if ModelServiceVO table and framework column exist + SELECT COUNT(*) INTO v_table_exists + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'ModelServiceVO' + AND COLUMN_NAME = 'framework'; + + IF v_table_exists > 0 THEN + -- Update llama.cpp to LlamaCpp + UPDATE ModelServiceVO + SET framework = 'LlamaCpp' + WHERE framework = 'llama.cpp'; + + -- Update sentence_transformers to SentenceTransformers + UPDATE ModelServiceVO + SET framework = 'SentenceTransformers' + WHERE framework = 'sentence_transformers'; + END IF; +END$$ + +DELIMITER ; + +-- Execute the procedure +CALL updateModelServiceFramework(); + +-- Drop the procedure after use +DROP PROCEDURE IF EXISTS updateModelServiceFramework; + +UPDATE ModelVO SET architectureType = 'xtts-v2' WHERE uuid = '39280569b4e0490fb581f6ab98e76400'; +UPDATE ModelVO SET architectureType = 'sdxl-turbo' WHERE uuid = '6a720c01935f4f9ea09f81bde722ee42'; + +CALL ADD_COLUMN('ModelServiceVO', 'containerArgs', 'TEXT', 1, NULL); +CALL ADD_COLUMN('ModelServiceVO', 'containerCommand', 'TEXT', 1, NULL); + +-- Upgrade gpuVendor field in ModelServiceGpuVendorVO +Update ModelServiceGpuVendorVO set gpuVendor = 'Huawei' where gpuVendor = 'HUAWEI'; +Update ModelServiceGpuVendorVO set gpuVendor = 'Haiguang' where gpuVendor = 'HAIGUANG'; +Update ModelServiceGpuVendorVO set gpuVendor = 'TianShu' where gpuVendor = 'TIANSHU'; +Update ModelServiceGpuVendorVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; + +CALL ADD_COLUMN('GpuDeviceVO', 'isolated', 'TINYINT(1)', 1, NULL); +CALL ADD_COLUMN('GpuDeviceSpecVO', 'isolated', 'TINYINT(1)', 1, NULL); + +DELIMITER $$ + +DROP PROCEDURE IF EXISTS fix_missing_architecture_records$$ + +CREATE PROCEDURE fix_missing_architecture_records() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_model_service_uuid VARCHAR(32); + DECLARE v_architecture VARCHAR(32); + DECLARE v_exists INT; + + -- Cursor to find all model services that have templates but missing architecture records + DECLARE service_cursor CURSOR FOR + SELECT DISTINCT mst.modelServiceUuid, mst.cpuArchitecture + FROM ModelServiceTemplateVO mst + WHERE NOT EXISTS ( + SELECT 1 + FROM ModelServiceCpuArchitectureVO msca + WHERE msca.modelServiceUuid = mst.modelServiceUuid + AND msca.architecture = mst.cpuArchitecture + ) + ORDER BY mst.modelServiceUuid, mst.cpuArchitecture; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + -- Start transaction + START TRANSACTION; + + -- Create a temporary table to store statistics + CREATE TEMPORARY TABLE IF NOT EXISTS fix_stats ( + total_services INT DEFAULT 0, + total_records_added INT DEFAULT 0 + ); + + INSERT INTO fix_stats VALUES (0, 0); + + -- Open cursor and process each missing architecture record + OPEN service_cursor; + + read_loop: LOOP + FETCH service_cursor INTO v_model_service_uuid, v_architecture; + + IF done THEN + LEAVE read_loop; + END IF; + + -- Double check if the record doesn't exist (to avoid duplicates) + SELECT COUNT(*) INTO v_exists + FROM ModelServiceCpuArchitectureVO + WHERE modelServiceUuid = v_model_service_uuid + AND architecture = v_architecture; + + IF v_exists = 0 THEN + -- Insert the missing architecture record + INSERT INTO ModelServiceCpuArchitectureVO (modelServiceUuid, architecture, lastOpDate, createDate) + VALUES ( + v_model_service_uuid, + v_architecture, + CURRENT_TIMESTAMP(3), + CURRENT_TIMESTAMP(3) + ); + + -- Update statistics + UPDATE fix_stats SET total_records_added = total_records_added + 1; + + -- Log the fix + SELECT CONCAT('Fixed: Added architecture record [', v_architecture, '] for model service [', v_model_service_uuid, ']') AS log_message; + END IF; + + END LOOP; + + CLOSE service_cursor; + + -- Count total affected services + UPDATE fix_stats SET total_services = ( + SELECT COUNT(DISTINCT modelServiceUuid) + FROM ModelServiceCpuArchitectureVO + WHERE createDate >= (SELECT MIN(createDate) FROM (SELECT createDate FROM ModelServiceCpuArchitectureVO ORDER BY createDate DESC LIMIT 1000) AS recent) + ); + + -- Display summary + SELECT + total_records_added AS 'Total Architecture Records Added', + (SELECT COUNT(DISTINCT modelServiceUuid) FROM ModelServiceTemplateVO) AS 'Total Model Services with Templates', + (SELECT COUNT(DISTINCT modelServiceUuid) FROM ModelServiceCpuArchitectureVO) AS 'Total Model Services with Architecture Records' + FROM fix_stats; + + -- Cleanup + DROP TEMPORARY TABLE IF EXISTS fix_stats; + + -- Commit transaction + COMMIT; + + SELECT 'Fix completed successfully!' AS status; +END$$ + +DELIMITER ; + +CALL fix_missing_architecture_records(); + +-- Add new gpu constraint fields +CALL ADD_COLUMN('ModelVO', 'recommendedGpuNum', 'VARCHAR(256)', 1, NULL); +CALL ADD_COLUMN('ModelVO', 'gpuConstraintDescription', 'VARCHAR(512)', 1, NULL); + +DELIMITER $$ + +CREATE PROCEDURE update_system_model_service_templates() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE model_name VARCHAR(255); + DECLARE gpu_vendor_name VARCHAR(32); + DECLARE py_version VARCHAR(255); + DECLARE cuda_version VARCHAR(255); + DECLARE cann_version VARCHAR(255); + DECLARE fw_version VARCHAR(255); + DECLARE service_uuid VARCHAR(32); + + DECLARE templates_cursor CURSOR FOR + SELECT name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion FROM system_models_templates_to_update; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + CREATE TEMPORARY TABLE IF NOT EXISTS system_models_templates_to_update ( + name VARCHAR(255), + vendor VARCHAR(32), + pythonVersion VARCHAR(255), + cudaVersion VARCHAR(255), + cannVersion VARCHAR(255), + frameworkVersion VARCHAR(255) + ); + + INSERT INTO system_models_templates_to_update (name, vendor, pythonVersion, cudaVersion, cannVersion, frameworkVersion) VALUES + ('vLLM-0.7.2', 'NVIDIA', '3.10', '12.5', NULL, '0.7.2'), + ('vLLM-0.8.5', 'NVIDIA', '3.10', '12.5', NULL, '0.8.5'), + ('vLLM-0.9.2', 'NVIDIA', '3.10', '12.5', NULL, '0.9.2'), + ('vLLM-0.11.0', 'NVIDIA', '3.10', '12.5', NULL, '0.11.0'), + ('SGLang-0.4.9.post1', 'NVIDIA', '3.10', '12.5', NULL, '0.4.9.post1'), + ('SGLang-0.5.2', 'NVIDIA', '3.10', '12.5', NULL, '0.5.2'), + ('SGLang-0.5.4', 'NVIDIA', '3.10', '12.5', NULL, '0.5.4'), + ('Transformers-4.48.3', 'NVIDIA', '3.10', '12.5', NULL, '4.48.3'), + ('Transformers-4.57.1', 'NVIDIA', '3.10', '12.5', NULL, '4.57.1'), + ('Transformers-4.56.2', 'NVIDIA', '3.10', '12.5', NULL, '4.56.2'), + ('sentence_transformers-3.1.1', 'NVIDIA', '3.10', '12.5', NULL, '3.1.1'), + ('Diffusers-0.30.0', 'NVIDIA', '3.10', '12.5', NULL, '0.30.0'), + ('Diffusers-0.35.1', 'NVIDIA', '3.10', '12.5', NULL, '0.35.1'), + ('MindIE-2.0.RC1-910B', 'Huawei', '3.9', NULL, '8.0', '2.0.RC1'), + ('MindIE-2.1.RC1-910B', 'Huawei', '3.9', NULL, '8.0', '2.1.RC1'), + ('MindIE-2.1.RC2-910B', 'Huawei', '3.9', NULL, '8.0', '2.1.RC2'), + ('MindIE-1.0.0-310P', 'Huawei', '3.9', NULL, '7.0', '1.0.0'), + ('vLLM-Ascend-0.11.0.rc0', 'Huawei', '3.9', NULL, '8.0', '0.11.0.rc0'), + ('vLLM-0.5.0-HYGON-Z100L', 'Haiguang', '3.10', NULL, NULL, '0.5.0'), + ('vLLM-0.8.5-HYGON-K100-AI', 'Haiguang', '3.10', NULL, NULL, '0.8.5'), + ('vLLM-0.9.2-HYGON-K100-AI', 'Haiguang', '3.10', NULL, NULL, '0.9.2'), + ('vLLM-0.7.2-HYGON-K100-AI', 'Haiguang', '3.10', NULL, NULL, '0.7.2'), + ('MinerU2.5-2509', 'NVIDIA', '3.10', '12.5', NULL, '2.5'); + + OPEN templates_cursor; + update_template_loop: LOOP + FETCH templates_cursor INTO model_name, gpu_vendor_name, py_version, cuda_version, cann_version, fw_version; + IF done THEN + LEAVE update_template_loop; + END IF; + + SELECT COUNT(*) INTO @cnt FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1; + IF @cnt > 0 THEN + SELECT uuid INTO service_uuid FROM `zstack`.`ModelServiceVO` WHERE name = model_name AND system = 1 LIMIT 1; + ELSE + SET service_uuid = NULL; + END IF; + + IF service_uuid IS NOT NULL THEN + SELECT COUNT(*) INTO @tmpl_cnt FROM `zstack`.`ModelServiceTemplateVO` WHERE `modelServiceUuid` = service_uuid; + IF @tmpl_cnt > 0 THEN + UPDATE `zstack`.`ModelServiceTemplateVO` SET + `pythonVersionSemver` = py_version, + `cudaVersion` = cuda_version, + `cannVersion` = cann_version, + `frameworkVersionSemver` = fw_version, + `gpuVendor` = gpu_vendor_name + WHERE `modelServiceUuid` = service_uuid; + SELECT CONCAT('INFO: Updated ModelServiceTemplateVO for service_uuid=', service_uuid, ', updated_rows=', ROW_COUNT()) AS msg; + ELSE + INSERT INTO `zstack`.`ModelServiceTemplateVO` (`uuid`, `modelServiceUuid`, `cpuArchitecture`, `pythonVersionSemver`, `cudaVersion`, `cannVersion`, `frameworkVersionSemver`, `gpuVendor`, `createDate`, `lastOpDate`) + VALUES (REPLACE(UUID(),'-',''), service_uuid, 'x86_64', py_version, cuda_version, cann_version, fw_version, gpu_vendor_name, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); + SELECT CONCAT('INFO: Inserted ModelServiceTemplateVO for service_uuid=', service_uuid, ', inserted_rows=', ROW_COUNT()) AS msg; + END IF; + + -- Ensure ModelServiceGpuVendorVO record exists with the corresponding gpuVendor for this modelServiceUuid + SELECT COUNT(*) INTO @gv_cnt FROM `zstack`.`ModelServiceGpuVendorVO` + WHERE `modelServiceUuid` = service_uuid AND `gpuVendor` = gpu_vendor_name; + IF @gv_cnt = 0 THEN + INSERT INTO `zstack`.`ModelServiceGpuVendorVO` (`modelServiceUuid`, `gpuVendor`) + VALUES (service_uuid, gpu_vendor_name); + SELECT CONCAT('INFO: Inserted ModelServiceGpuVendorVO for service_uuid=', service_uuid, ', gpuVendor=', gpu_vendor_name) AS msg; + ELSE + SELECT CONCAT('INFO: ModelServiceGpuVendorVO exists for service_uuid=', service_uuid, ', gpuVendor=', gpu_vendor_name) AS msg; + END IF; + ELSE + SELECT CONCAT('WARN: Service not found for model=', model_name, ', skipping template and gpuVendor update.') AS msg; + END IF; + + SET service_uuid = NULL; + END LOOP; + CLOSE templates_cursor; + + DROP TEMPORARY TABLE IF EXISTS system_models_templates_to_update; +END $$ +DELIMITER ; + +CALL update_system_model_service_templates(); +DROP PROCEDURE IF EXISTS update_system_model_service_templates; + +Update ModelServiceTemplateVO set gpuVendor = 'Huawei' where gpuVendor = 'HUAWEI'; +Update ModelServiceTemplateVO set gpuVendor = 'Haiguang' where gpuVendor = 'HAIGUANG'; +Update ModelServiceTemplateVO set gpuVendor = 'TianShu' where gpuVendor = 'TIANSHU'; +Update ModelServiceTemplateVO set gpuVendor = 'Intel' where gpuVendor = 'INTEL'; + +CALL ADD_COLUMN('GpuDeviceVO', 'gpuStatus', 'varchar(16)', 1, NULL); + +UPDATE `zstack`.`GpuDeviceVO` SET `gpuStatus`='NOMINAL' WHERE `gpuStatus` IS NULL; + +-- Add supportMetrics column to ModelServiceInstanceGroupVO +DROP PROCEDURE IF EXISTS addModelServiceInstanceGroupSupportMetricsColumn; +DELIMITER $$ +CREATE PROCEDURE addModelServiceInstanceGroupSupportMetricsColumn() +BEGIN + DECLARE columnExists BOOLEAN DEFAULT FALSE; + + SELECT COUNT(*) INTO columnExists + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = 'ModelServiceInstanceGroupVO' + AND COLUMN_NAME = 'supportMetrics' + AND TABLE_SCHEMA = 'zstack'; + + IF columnExists = FALSE THEN + ALTER TABLE `zstack`.`ModelServiceInstanceGroupVO` ADD COLUMN `supportMetrics` TEXT DEFAULT NULL; + END IF; +END $$ +DELIMITER ; + +CALL addModelServiceInstanceGroupSupportMetricsColumn(); +DROP PROCEDURE IF EXISTS addModelServiceInstanceGroupSupportMetricsColumn; diff --git a/conf/db/upgrade/V5.4.7__schema.sql b/conf/db/upgrade/V5.4.7__schema.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/conf/db/upgrade/V5.4.8__schema.sql b/conf/db/upgrade/V5.4.8__schema.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/conf/db/upgrade/beforeMigrate.sql b/conf/db/upgrade/beforeMigrate.sql index b032eeab203..d53d98d8646 100755 --- a/conf/db/upgrade/beforeMigrate.sql +++ b/conf/db/upgrade/beforeMigrate.sql @@ -235,3 +235,26 @@ BEGIN SELECT CURTIME(); END$$ DELIMITER ; + +DROP PROCEDURE IF EXISTS `RENAME_TABLE`; +DELIMITER $$ +CREATE PROCEDURE `RENAME_TABLE`( + IN old_name VARCHAR(64), + IN new_name VARCHAR(64) +) +BEGIN + DECLARE alter_sql VARCHAR(1000); + IF EXISTS( SELECT NULL + FROM INFORMATION_SCHEMA.TABLES + WHERE table_name = old_name + AND table_schema = 'zstack') THEN + SET @alter_sql = CONCAT('RENAME TABLE zstack.', old_name, ' TO ', new_name); + SELECT @alter_sql; + PREPARE stmt FROM @alter_sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; + + SELECT CURTIME(); +END$$ +DELIMITER ; \ No newline at end of file diff --git a/conf/db/upgrade/beforeValidate.sql b/conf/db/upgrade/beforeValidate.sql index 020abd278e3..1ecbf9febdc 100644 --- a/conf/db/upgrade/beforeValidate.sql +++ b/conf/db/upgrade/beforeValidate.sql @@ -27,6 +27,21 @@ BEGIN update `zstack`.`schema_version` set `checksum`=-540021638 where `script`='V4.4.6__schema.sql' and `checksum` <> -540021638; update `zstack`.`schema_version` set `checksum`=-698734653 where `script`='V4.5.11__schema.sql' and `checksum` <> -698734653; update `zstack`.`schema_version` set `checksum`=-2137714083 where `script`='V4.7.0__schema.sql' and `checksum` <> -2137714083; + update `zstack`.`schema_version` set `checksum`=-1493191986 where `script`='V0.6__schema.sql' and `checksum` <> -1493191986; + update `zstack`.`schema_version` set `checksum`=286222955 where `script`='V1.3__schema.sql' and `checksum` <> 286222955; + update `zstack`.`schema_version` set `checksum`=390362109 where `script`='V1.7__schema.sql' and `checksum` <> 390362109; + update `zstack`.`schema_version` set `checksum`=-1453565511 where `script`='V2.1.0__schema.sql' and `checksum` <> -1453565511; + update `zstack`.`schema_version` set `checksum`=672814727 where `script`='V2.2.0__schema.sql' and `checksum` <> 672814727; + update `zstack`.`schema_version` set `checksum`=271601676 where `script`='V3.1.0__schema.sql' and `checksum` <> 271601676; + update `zstack`.`schema_version` set `checksum`=-294520100 where `script`='V4.6.21__schema.sql' and `checksum` <> -294520100; + update `zstack`.`schema_version` set `checksum`=1170348213 where `script`='V4.8.0.6__schema.sql' and `checksum` <> 1170348213; + update `zstack`.`schema_version` set `checksum`=1298863127 where `script`='V5.3.0__schema.sql' and `checksum` <> 1298863127; + update `zstack`.`schema_version` set `checksum`=613548663 where `script`='V5.3.6__schema.sql' and `checksum` <> 613548663; + update `zstack`.`schema_version` set `checksum`=1489363540 where `script`='V5.3.22__schema.sql' and `checksum` <> 1489363540; + update `zstack`.`schema_version` set `checksum`=1648524318 where `script`='V4.4.0__schema.sql' and `checksum` <> 1648524318; + update `zstack`.`schema_version` set `checksum`=-3265430 where `script`='V5.4.6__schema.sql' and `checksum` <> -3265430; + update `zstack`.`schema_version` set `checksum`=-1455020895 where `script`='V5.1.4__schema.sql' and `checksum` <> -1455020895; + update `zstack`.`schema_version` set `checksum`=569762641 where `script`='V5.4.0__schema.sql' and `checksum` <> 569762641; END IF; END $$ diff --git a/conf/deploydb.sh b/conf/deploydb.sh index a9f8dd90673..033da079954 100755 --- a/conf/deploydb.sh +++ b/conf/deploydb.sh @@ -22,20 +22,44 @@ if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then MYSQL='sudo mysql' fi +if command -v greatdb &> /dev/null; then + MYSQL='greatdb' + if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo greatdb' + fi +fi + mysql_run() { $MYSQL --user=$user --password=$password --host=$host --port=$port "$@" } -mysql_run << EOF -DROP DATABASE IF EXISTS zstack; -CREATE DATABASE zstack; -DROP DATABASE IF EXISTS zstack_rest; -CREATE DATABASE zstack_rest; -grant all privileges on zstack.* to root@'%' identified by "$password"; -grant all privileges on zstack_rest.* to root@'%' identified by "$password"; -grant all privileges on zstack.* to root@'localhost' identified by "$password"; -grant all privileges on zstack_rest.* to root@'localhost' identified by "$password"; +if command -v greatdb &> /dev/null; then + mysql_run << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY "${password}"; + CREATE USER IF NOT EXISTS 'root'@'127.0.0.1' IDENTIFIED BY "${password}"; + grant all privileges on zstack.* to root@'%'; + grant all privileges on zstack_rest.* to root@'%'; + grant all privileges on zstack.* to root@'127.0.0.1'; + grant all privileges on zstack_rest.* to root@'127.0.0.1'; +EOF +else + mysql_run << EOF + set global log_bin_trust_function_creators=1; + DROP DATABASE IF EXISTS zstack; + CREATE DATABASE zstack; + DROP DATABASE IF EXISTS zstack_rest; + CREATE DATABASE zstack_rest; + grant all privileges on zstack.* to root@'%' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'%' identified by "${password}"; + grant all privileges on zstack.* to root@'127.0.0.1' identified by "${password}"; + grant all privileges on zstack_rest.* to root@'127.0.0.1' identified by "${password}"; EOF +fi rm -rf $flyway_sql mkdir -p $flyway_sql @@ -67,32 +91,50 @@ hostname=`hostname` [ -z $zstack_user_password ] && zstack_user_password='' -db_version=`mysql --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` -if [ $db_version -ge 10 ];then - mysql --user=$user --password=$password --host=$host --port=$port << EOF -drop user if exists zstack; -drop user if exists zstack_rest; -create user 'zstack' identified by "$zstack_user_password"; -create user 'zstack_rest' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; -flush privileges; +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack; + drop user if exists zstack_rest; + create user if not exists 'zstack'@'localhost' identified by "$zstack_user_password"; + create user if not exists 'zstack'@'%' identified by "$zstack_user_password"; + create user if not exists 'zstack_rest'@'localhost' identified by "$zstack_user_password"; + create user if not exists 'zstack_rest'@'%' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'localhost'; + grant all privileges on zstack.* to zstack@'%'; + grant system_user on *.* to zstack@'localhost'; + grant system_user on *.* to zstack@'%'; + grant all privileges on zstack_rest.* to zstack@'localhost'; + grant all privileges on zstack_rest.* to zstack@'%'; + flush privileges; EOF else - mysql --user=$user --password=$password --host=$host --port=$port << EOF -grant usage on *.* to 'zstack'@'localhost'; -grant usage on *.* to 'zstack'@'%'; -drop user zstack; -create user 'zstack' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; -grant all privileges on zstack.* to zstack@"$hostname" identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@"$hostname" identified by "$zstack_user_password"; -grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; -flush privileges; + db_version=`$MYSQL --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` + if [ $db_version -ge 10 ];then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack; + drop user if exists zstack_rest; + create user 'zstack' identified by "$zstack_user_password"; + create user 'zstack_rest' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; + flush privileges; +EOF + else + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'zstack'@'localhost'; + grant usage on *.* to 'zstack'@'%'; + drop user zstack; + create user 'zstack' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@'%' identified by "$zstack_user_password"; + grant all privileges on zstack.* to zstack@"$hostname" identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'localhost' identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@"$hostname" identified by "$zstack_user_password"; + grant all privileges on zstack_rest.* to zstack@'%' identified by "$zstack_user_password"; + flush privileges; EOF + fi fi diff --git a/conf/deployuidb.sh b/conf/deployuidb.sh index 0c7862bab5c..16a7e659576 100755 --- a/conf/deployuidb.sh +++ b/conf/deployuidb.sh @@ -7,24 +7,59 @@ host="$3" port="$4" zstack_ui_db_password="$5" +MYSQL='mysql' + +if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo mysql' +fi + +if command -v greatdb &> /dev/null; then + MYSQL='greatdb' + if [[ `id -u` -ne 0 ]] && [[ x"$user" = x"root" ]]; then + MYSQL='sudo greatdb' + fi +fi + base=`dirname $0` flyway="$base/tools/flyway-3.2.1/flyway" flyway_sql="$base/tools/flyway-3.2.1/sql/" # give grant option to the new management ip after `zstack-ctl change_ip` -mysql --user=$user --password=$password --port=$port << EOF -grant all privileges on *.* to root@"$host" identified by "$password" with grant option; +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --port=$port << EOF + grant all privileges on *.* to 'root'@"$host" with grant option; + FLUSH PRIVILEGES; +EOF +else + $MYSQL --user=$user --password=$password --port=$port << EOF + grant all privileges on *.* to 'root'@"$host" identified by "$password" with grant option; + FLUSH PRIVILEGES; EOF +fi -mysql --user=$user --password=$password --host=$host --port=$port << EOF -grant usage on *.* to 'root'@'localhost'; -grant usage on *.* to 'root'@'%'; -DROP DATABASE IF EXISTS zstack_ui; -CREATE DATABASE zstack_ui; -grant all privileges on zstack_ui.* to root@'%' identified by "$password"; -grant all privileges on zstack_ui.* to root@'localhost' identified by "$password"; -flush privileges; +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'root'@'localhost'; + grant usage on *.* to 'root'@'%'; + DROP DATABASE IF EXISTS zstack_ui; + CREATE DATABASE zstack_ui; + create user if not exists 'root'@'%' identified by "$password"; + create user if not exists 'root'@'localhost' identified by "$password"; + grant all privileges on zstack_ui.* to 'root'@'%'; + grant all privileges on zstack_ui.* to 'root'@'localhost'; + flush privileges; +EOF +else + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'root'@'localhost'; + grant usage on *.* to 'root'@'%'; + DROP DATABASE IF EXISTS zstack_ui; + CREATE DATABASE zstack_ui; + grant all privileges on zstack_ui.* to 'root'@'%' identified by "$password"; + grant all privileges on zstack_ui.* to 'root'@'localhost' identified by "$password"; + flush privileges; EOF +fi rm -rf $flyway_sql mkdir -p $flyway_sql @@ -39,24 +74,37 @@ if [ -d $ui_schema_path ]; then fi hostname=`hostname` -db_version=`mysql --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` -if [ $db_version -ge 10 ];then - mysql --user=$user --password=$password --host=$host --port=$port << EOF -drop user if exists zstack_ui; -create user 'zstack_ui' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; -flush privileges; + +if command -v greatdb &> /dev/null; then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack_ui; + create user 'zstack_ui' identified by "$zstack_ui_db_password"; + create user if not exists 'zstack_ui'@'localhost' identified by "$zstack_ui_db_password"; + create user if not exists 'zstack_ui'@'%' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'localhost'; + grant all privileges on zstack_ui.* to zstack_ui@'%'; + flush privileges; EOF else - mysql --user=$user --password=$password --host=$host --port=$port << EOF -grant usage on *.* to 'zstack_ui'@'localhost'; -grant usage on *.* to 'zstack_ui'@'%'; -drop user zstack_ui; -create user 'zstack_ui' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; -grant all privileges on zstack_ui.* to zstack_ui@"$hostname" identified by "$zstack_ui_db_password"; -flush privileges; + db_version=`$MYSQL --version | awk '/Distrib/{print $5}' |awk -F'.' '{print $1}'` + if [ $db_version -ge 10 ];then + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + drop user if exists zstack_ui; + create user 'zstack_ui' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; + flush privileges; +EOF + else + $MYSQL --user=$user --password=$password --host=$host --port=$port << EOF + grant usage on *.* to 'zstack_ui'@'localhost'; + grant usage on *.* to 'zstack_ui'@'%'; + drop user zstack_ui; + create user 'zstack_ui' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'localhost' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@'%' identified by "$zstack_ui_db_password"; + grant all privileges on zstack_ui.* to zstack_ui@"$hostname" identified by "$zstack_ui_db_password"; + flush privileges; EOF + fi fi diff --git a/conf/errorCodes/license.xml b/conf/errorCodes/license.xml index f7177169f13..fa1db7d837a 100755 --- a/conf/errorCodes/license.xml +++ b/conf/errorCodes/license.xml @@ -45,5 +45,95 @@ 1008 The current Primary License does not allow using Addon licenses to add plus services + + + 2000 + Generic license component error + + + + 2001 + Missing license request code + + + + 3000 + Generic license server error + + + + 3002 + Unsupported license key-store type + + + + 3003 + License key-store error + + + + 3004 + License public key error + + + + 3100 + License server generic error + + + + 3101 + Missing license server file + + + + 3102 + Connect to license client error + + + + 3104 + License server call license client API error + + + + 3111 + Invalid license capacity application + + + + 3112 + License quota exceeded + + + + 3200 + License client generic error + + + + 3201 + Missing license client file + + + + 3202 + Connect to license server error + + + + 3203 + Log in license server error + + + + 3204 + License client call license server API error + + + + 3205 + Invalid license capacity response from license server + diff --git a/conf/errorCodes/lun.xml b/conf/errorCodes/lun.xml new file mode 100644 index 00000000000..a8cb629c553 --- /dev/null +++ b/conf/errorCodes/lun.xml @@ -0,0 +1,13 @@ + + LUN + + + 1000 + lun has been created + + + + 1001 + lun cannot be found + + diff --git a/conf/errorElaborations/Elaboration.json b/conf/errorElaborations/Elaboration.json index ad3a89fd84c..ec236629bbe 100644 --- a/conf/errorElaborations/Elaboration.json +++ b/conf/errorElaborations/Elaboration.json @@ -1710,5 +1710,13 @@ "regex": "the vm scheduling group has already had a vms antiaffinity from hosts scheduling rule attached. the number of hosts available for the vm in the scheduling group to run is less than that of the vm in the group. you cannot attach a vm antiaffinity from Each Other scheduling rule to the group", "message_cn": "该云主机调度组已绑定云主机互斥物理机调度策略,若再绑定互斥云主机调度策略,当前可供组内云主机运行的物理机数量将少于云主机数量,导致部分云主机无法分配物理机。请按需调整物理机/云主机数量后重试。", "message_en": "The VM scheduling group has already had a VMs Exclusive from Hosts scheduling policy attached. The number of hosts available for the VM instances in the scheduling group to run is less than that of the VM instances in the group. You cannot attach a VM Exclusive from Each Other scheduling policy to the group." + }, + { + "category": "logServer", + "code": "1001", + "method": "regex", + "regex": "The creation of the log server failed, incorrect newly passed configuration parameters may have caused the Fluent Bit service to be in an inactive state. Please double-check the configuration for accuracy", + "message_cn": "创建日志服务器失败,新传入配置参数有误会导致fluent-bit服务处于非活跃状态,请再次检查配置是否正确。", + "message_en": "The creation of the log server failed, incorrect newly passed configuration parameters may have caused the Fluent Bit service to be in an inactive state. Please double-check the configuration for accuracy" } ] diff --git a/conf/globalConfig/ceph.xml b/conf/globalConfig/ceph.xml index be1993a594f..ccde2ee2806 100755 --- a/conf/globalConfig/ceph.xml +++ b/conf/globalConfig/ceph.xml @@ -107,7 +107,7 @@ sds.admin.password the password of ceph admin user - password + Admin@123 ceph java.lang.String diff --git a/conf/globalConfig/host.xml b/conf/globalConfig/host.xml index 795d8535866..ac15a50e580 100755 --- a/conf/globalConfig/host.xml +++ b/conf/globalConfig/host.xml @@ -123,7 +123,7 @@ host host.power.refresh.interval The interval to refresh host power status, in seconds - 30 + 60 java.lang.Integer diff --git a/conf/globalConfig/kvm.xml b/conf/globalConfig/kvm.xml index 771709113ce..76d53a5453a 100755 --- a/conf/globalConfig/kvm.xml +++ b/conf/globalConfig/kvm.xml @@ -28,7 +28,7 @@ kvm reservedCpu The CPU capacity reserved on all KVM hosts. ZStack KVM agent is a python web server that needs some CPU capacity to run, this value reserve a portion of CPU for the agent as well as other host applications. The value can be overriden by system tag on individual host, cluster and zone level - 512 + 0 @@ -257,4 +257,20 @@ 1800 java.lang.Integer + + + kvm + kvmagent.physicalmemory.usage.alarm.threshold + The threshold for the physical memory usage of the kvmagent process, exceeding which an alarm will be triggered. + 2147483648 + java.lang.Long + + + + kvm + kvmagent.physicalmemory.usage.hardlimit + The hard limit for the physical memory usage of the kvmagent process, exceeding this value will trigger a kvmagent restart. + 10737418240 + java.lang.Long + diff --git a/conf/globalConfig/l2Network.xml b/conf/globalConfig/l2Network.xml index c7b50ecd470..f6032411257 100644 --- a/conf/globalConfig/l2Network.xml +++ b/conf/globalConfig/l2Network.xml @@ -14,4 +14,18 @@ l2Network java.lang.Boolean + + igmp.version + igmp version used for linux bridge igmp snooping, 0 means does not change host OS value + 0 + l2Network + java.lang.Integer + + + mld.version + mld version used for linux bridge igmp snooping, 0 means does not change host OS value + 0 + l2Network + java.lang.Integer + \ No newline at end of file diff --git a/conf/globalConfig/lb.xml b/conf/globalConfig/lb.xml index 88a235ef253..5b3a9e3f5d9 100755 --- a/conf/globalConfig/lb.xml +++ b/conf/globalConfig/lb.xml @@ -81,7 +81,7 @@ loadBalancer httpMode - When mode http is turned on, HAProxy processes HTTP protocol for each request and response passing through. to choose from http-keep-alive,http-server-close,http-tunnel,httpclose,forceclose + When mode http is turned on, HAProxy processes HTTP protocol for each request and response passing through. to choose from http-keep-alive,http-server-close,httpclose http-server-close java.lang.String diff --git a/conf/globalConfig/snapshot.xml b/conf/globalConfig/snapshot.xml index fcfc393178c..d0a9ada1bc6 100755 --- a/conf/globalConfig/snapshot.xml +++ b/conf/globalConfig/snapshot.xml @@ -40,4 +40,19 @@ java.lang.Boolean + + volumeSnapshot + enable.fast.revert + Enable fast revert for volume snapshot + false + java.lang.Boolean + + + + volumeSnapshot + snapshot.group.revert.concurrency + The maximum number of snapshots that are permitted to revert concurrently. + 1 + java.lang.Integer + \ No newline at end of file diff --git a/conf/globalConfig/vm.xml b/conf/globalConfig/vm.xml index 66535580dc3..0d4a1744e1d 100755 --- a/conf/globalConfig/vm.xml +++ b/conf/globalConfig/vm.xml @@ -233,7 +233,7 @@ resourceBinding.Scene Scenarios supported by resource binding - All + Auto vm java.lang.String diff --git a/conf/globalConfig/vyos.xml b/conf/globalConfig/vyos.xml index e6345177f14..6d341d58a50 100755 --- a/conf/globalConfig/vyos.xml +++ b/conf/globalConfig/vyos.xml @@ -35,6 +35,13 @@ java.lang.Boolean false + + vyos + enable.loadbalancer.stats.log + open haproxy stats log + java.lang.Boolean + false + vyos enable.vyos.cmd diff --git a/conf/guestOs/guestOsCategory.xml b/conf/guestOs/guestOsCategory.xml index 704bd58f523..b444d32cecc 100644 --- a/conf/guestOs/guestOsCategory.xml +++ b/conf/guestOs/guestOsCategory.xml @@ -24,6 +24,18 @@ 8 CentOS 8 + + Linux + CentOS Stream + 9 + CentOS Stream 9 + + + Linux + CentOS Stream + 10 + CentOS Stream 10 + Linux RedHat @@ -54,6 +66,12 @@ 9 RHEL 9 + + Linux + RedHat + 10 + RHEL 10 + Linux Ubuntu @@ -78,6 +96,12 @@ 22 Ubuntu 22 + + Linux + Ubuntu + 24 + Ubuntu 24 + Linux Debian @@ -102,12 +126,36 @@ 10 Debian 10 + + Linux + Debian + 11 + Debian 11 + + + Linux + Debian + 12 + Debian 12 + + + Linux + Debian + 13 + Debian 13 + Linux Fedora Fedora + + Linux + Fedora + 42 + Fedora 42 + Linux Kylin @@ -126,6 +174,12 @@ 10 Kylin 10 + + Linux + Kylin + 11 + Kylin 11 + Linux UOS @@ -144,6 +198,24 @@ 22.03 openEuler 22.03 + + Linux + openEuler + 24.03 + openEuler 24.03 + + + Linux + VyOS + 1.1.7 + VyOS 1.1.7 + + + Linux + VyOS + 1.2.0 + VyOS 1.2.0 + Linux SUSE @@ -168,6 +240,48 @@ 7 Oracle Linux 7 + + Linux + Oracle + 8 + Oracle Linux 8 + + + Linux + Oracle + 9 + Oracle Linux 9 + + + Linux + Rocky Linux + 8 + Rocky Linux 8 + + + Linux + Rocky Linux + 9 + Rocky Linux 9 + + + Linux + Rocky Linux + 10 + Rocky Linux 10 + + + Linux + AlmaLinux + 9 + AlmaLinux 9 + + + Linux + AnolisOS + 8 + AnolisOS 8 + Linux Linux @@ -217,6 +331,12 @@ 2022 WindowsServer 2022 + + Windows + Windows + 2025 + WindowsServer 2025 + Windows Windows diff --git a/conf/guestOs/guestOsCharacter.xml b/conf/guestOs/guestOsCharacter.xml index db657bed244..2714496712c 100644 --- a/conf/guestOs/guestOsCharacter.xml +++ b/conf/guestOs/guestOsCharacter.xml @@ -43,6 +43,16 @@ Linux CentOS 8 + + x86_64 + Linux + CentOS Stream 9 + + + x86_64 + Linux + CentOS Stream 10 + x86_64 Linux @@ -68,6 +78,11 @@ Linux RHEL 9 + + x86_64 + Linux + RHEL 10 + x86_64 Linux @@ -88,6 +103,11 @@ Linux Ubuntu 22 + + x86_64 + Linux + Ubuntu 24 + x86_64 Linux @@ -108,11 +128,31 @@ Linux Debian 10 + + x86_64 + Linux + Debian 11 + + + x86_64 + Linux + Debian 12 + + + x86_64 + Linux + Debian 13 + x86_64 Linux Fedora + + x86_64 + Linux + Fedora 42 + x86_64 Linux @@ -128,6 +168,11 @@ Linux Kylin 10 + + x86_64 + Linux + Kylin 11 + x86_64 Linux @@ -143,11 +188,71 @@ Linux openEuler 22.03 + + x86_64 + Linux + openEuler 24.03 + + + x86_64 + Linux + VyOS 1.1.7 + + + x86_64 + Linux + VyOS 1.2.0 + x86_64 Linux Oracle Linux 7 + + x86_64 + Linux + Oracle Linux 8 + + + x86_64 + Linux + Oracle Linux 9 + + + x86_64 + Linux + SUSE Linux 12 + + + x86_64 + Linux + SUSE Linux 15 + + + x86_64 + Linux + Rocky Linux 8 + + + x86_64 + Linux + Rocky Linux 9 + + + x86_64 + Linux + Rocky Linux 10 + + + x86_64 + Linux + AlmaLinux 9 + + + x86_64 + Linux + AnolisOS 8 + x86_64 Linux @@ -192,6 +297,12 @@ WindowsServer 2022 false + + x86_64 + Windows + WindowsServer 2025 + false + x86_64 Windows diff --git a/conf/persistence.xml b/conf/persistence.xml index f7ab2d1d00c..33f4326f407 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -14,6 +14,7 @@ org.zstack.core.job.JobQueueEntryVO org.zstack.core.config.GlobalConfigVO org.zstack.core.eventlog.EventLogVO + org.zstack.core.plugin.PluginDriverVO org.zstack.resourceconfig.ResourceConfigVO org.zstack.header.managementnode.ManagementNodeVO org.zstack.header.managementnode.ManagementNodeContextVO @@ -23,6 +24,7 @@ org.zstack.header.cluster.ClusterEO org.zstack.header.host.HostVO org.zstack.header.host.HostEO + org.zstack.header.host.HostNetworkLabelVO org.zstack.header.host.CpuFeaturesHistoryVO org.zstack.header.storage.primary.PrimaryStorageVO org.zstack.header.storage.primary.PrimaryStorageEO @@ -34,6 +36,8 @@ org.zstack.header.storage.backup.BackupStorageZoneRefVO org.zstack.header.image.ImageVO org.zstack.header.image.ImageEO + org.zstack.header.image.ImageGroupVO + org.zstack.header.image.ImageGroupRefVO org.zstack.header.image.GuestOsCategoryVO org.zstack.header.image.ImageBackupStorageRefVO org.zstack.header.allocator.HostCapacityVO @@ -136,6 +140,7 @@ org.zstack.storage.primary.local.LocalStorageHostRefVO org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO org.zstack.header.storage.addon.primary.PrimaryStorageOutputProtocolRefVO + org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO org.zstack.storage.ceph.backup.CephBackupStorageVO org.zstack.storage.ceph.backup.CephBackupStorageMonVO org.zstack.storage.ceph.primary.CephPrimaryStorageMonVO @@ -189,10 +194,14 @@ org.zstack.header.vm.devices.VmInstanceDeviceAddressGroupVO org.zstack.header.core.encrypt.EncryptEntityMetadataVO org.zstack.storage.ceph.primary.CephOsdGroupVO - org.zstack.sdnController.header.SdnControllerVO + org.zstack.header.network.sdncontroller.SdnControllerVO + org.zstack.header.network.sdncontroller.SdnControllerHostRefVO org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO + org.zstack.sdnController.header.HardwareL2VxlanNetworkVO org.zstack.sdnController.header.VxlanHostMappingVO org.zstack.sdnController.header.VxlanClusterMappingVO + org.zstack.sdnController.header.H3cSdnControllerTenantVO + org.zstack.sdnController.header.H3cSdnSubnetIpRangeRefVO org.zstack.header.volume.VolumeHostRefVO org.zstack.directory.DirectoryVO org.zstack.directory.ResourceDirectoryRefVO @@ -209,5 +218,9 @@ org.zstack.header.host.HostHwMonitorStatusVO org.zstack.kvm.xmlhook.XmlHookVO org.zstack.kvm.xmlhook.XmlHookVmInstanceRefVO + org.zstack.log.server.LogServerVO + org.zstack.header.network.l3.L3NetworkSequenceNumberVO + org.zstack.network.hostNetworkInterface.PhysicalSwitchVO + org.zstack.network.hostNetworkInterface.PhysicalSwitchPortVO diff --git a/conf/roleDefinitions/roleDefinition.json b/conf/roleDefinitions/roleDefinition.json index 095e783d66e..e4be8f0c369 100644 --- a/conf/roleDefinitions/roleDefinition.json +++ b/conf/roleDefinitions/roleDefinition.json @@ -2,7 +2,7 @@ { "name": "ORGANIZATION_OPERATOR_ROLE", "uuid": "ff46f380a9b745f490f7edbe0f2c72b9", - "description": "\u90e8\u95e8\u8fd0\u8425\u7ba1\u7406\u5458", + "description": "ORGANIZATION_OPERATOR_ROLE", "statements": [ { diff --git a/conf/scripts/generate-saml-cert.sh b/conf/scripts/generate-saml-cert.sh new file mode 100644 index 00000000000..53079e9ce68 --- /dev/null +++ b/conf/scripts/generate-saml-cert.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -euo pipefail + +OUTDIR=./ +TMP="$(mktemp -t saml_cert.XXXXXX)" +trap 'rm -f "${TMP}"* 2>/dev/null' EXIT + +# Do not overwrite existing certificates +test -s ${OUTDIR}/saml_privkey.pem && \ + { echo "SAML certificates already generated"; exit 0; } + +# Generate private key (PKCS#1) +openssl genrsa -out ${OUTDIR}/saml_privkey.pem 2048 + +# Convert private key to PKCS#8 format +openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt \ + -in ${OUTDIR}/saml_privkey.pem \ + -out ${OUTDIR}/saml_privkey_pkcs8.pem + +chmod 400 ${OUTDIR}/saml_privkey.pem +chmod 400 ${OUTDIR}/saml_privkey_pkcs8.pem + +# Generate self-signed SAML certificate +openssl req -x509 -new -nodes \ + -key ${OUTDIR}/saml_privkey.pem \ + -days 1095 \ + -out ${OUTDIR}/saml_cert.pem \ + -subj "/CN=SAML Certificate" + +exit 0 \ No newline at end of file diff --git a/conf/searchConfig/indexConfig.xml b/conf/searchConfig/indexConfig.xml index 450086a6734..a8a6439a059 100644 --- a/conf/searchConfig/indexConfig.xml +++ b/conf/searchConfig/indexConfig.xml @@ -131,7 +131,7 @@ - + diff --git a/conf/serviceConfig/acl.xml b/conf/serviceConfig/acl.xml index 9c789a6b1b0..ac0ed59c777 100644 --- a/conf/serviceConfig/acl.xml +++ b/conf/serviceConfig/acl.xml @@ -7,6 +7,10 @@ org.zstack.header.acl.APICreateAccessControlListMsg + + org.zstack.header.acl.APIUpdateAccessControlListMsg + + org.zstack.header.acl.APIDeleteAccessControlListMsg diff --git a/conf/serviceConfig/host.xml b/conf/serviceConfig/host.xml index dc7ab269c8f..bb076932f7e 100755 --- a/conf/serviceConfig/host.xml +++ b/conf/serviceConfig/host.xml @@ -60,4 +60,16 @@ org.zstack.header.host.APIGetHostPowerStatusMsg + + + org.zstack.header.host.APICreateHostNetworkServiceTypeMsg + + + + org.zstack.header.host.APIDeleteHostNetworkServiceTypeMsg + + + + org.zstack.header.host.APIUpdateHostNetworkServiceTypeMsg + diff --git a/conf/serviceConfig/image.xml b/conf/serviceConfig/image.xml index f4712e2a01b..b93b17d9516 100755 --- a/conf/serviceConfig/image.xml +++ b/conf/serviceConfig/image.xml @@ -11,11 +11,25 @@ org.zstack.header.image.APIDeleteImageMsg + + org.zstack.header.image.APICloneImageMsg + + org.zstack.header.image.APIQueryImageMsg query + + org.zstack.header.image.APIQueryImageGroupMsg + query + + + + org.zstack.header.image.APIQueryImageGroupRefMsg + query + + org.zstack.header.image.APIGetUploadImageJobDetailsMsg @@ -48,6 +62,10 @@ org.zstack.header.image.APIExpungeImageMsg + + org.zstack.header.image.APIExpungeImageGroupMsg + + org.zstack.header.image.APIRecoverImageMsg @@ -63,4 +81,16 @@ org.zstack.header.image.APICalculateImageHashMsg + + + org.zstack.header.image.APICreateImageGroupFromVmInstanceMsg + + + + org.zstack.header.image.APICreateImageGroupFromImageMsg + + + + org.zstack.header.image.APICreateImageGroupFromSnapshotMsg + diff --git a/conf/serviceConfig/plugin.xml b/conf/serviceConfig/plugin.xml new file mode 100644 index 00000000000..366d4d10b1b --- /dev/null +++ b/conf/serviceConfig/plugin.xml @@ -0,0 +1,18 @@ + + + external.plugin + PluginApiInterceptor + + + org.zstack.header.core.external.plugin.APIQueryPluginDriversMsg + query + + + + org.zstack.header.core.external.plugin.APIRefreshPluginDriversMsg + + + + org.zstack.header.core.external.plugin.APIDeletePluginDriversMsg + + \ No newline at end of file diff --git a/conf/serviceConfig/sdnController.xml b/conf/serviceConfig/sdnController.xml index 3aa5bc13998..41521e0803c 100644 --- a/conf/serviceConfig/sdnController.xml +++ b/conf/serviceConfig/sdnController.xml @@ -15,8 +15,38 @@ org.zstack.sdnController.header.APIUpdateSdnControllerMsg + + org.zstack.sdnController.header.APISdnControllerAddHostMsg + + + + org.zstack.sdnController.header.APISdnControllerChangeHostMsg + + + + org.zstack.sdnController.header.APISdnControllerRemoveHostMsg + + + + org.zstack.sdnController.header.APIChangeSdnControllerMsg + + + + org.zstack.sdnController.header.APIReconnectSdnControllerMsg + + org.zstack.sdnController.header.APIQuerySdnControllerMsg query + + + org.zstack.sdnController.header.APIPullSdnControllerTenantMsg + query + + + + org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchMsg + query + \ No newline at end of file diff --git a/conf/springConfigXml/ApiMediator.xml b/conf/springConfigXml/ApiMediator.xml index 65490622818..1a4d1b1e6ee 100755 --- a/conf/springConfigXml/ApiMediator.xml +++ b/conf/springConfigXml/ApiMediator.xml @@ -1,8 +1,8 @@ - + default-init-method="init" default-destroy-method="destroy"> + - + + - - + + + + + serviceConfig - + - + - + diff --git a/conf/springConfigXml/DatabaseFacade.xml b/conf/springConfigXml/DatabaseFacade.xml index 108ba0fdfd0..0e32b390993 100755 --- a/conf/springConfigXml/DatabaseFacade.xml +++ b/conf/springConfigXml/DatabaseFacade.xml @@ -87,6 +87,7 @@ sync + true diff --git a/conf/springConfigXml/ExternalPrimaryStorage.xml b/conf/springConfigXml/ExternalPrimaryStorage.xml index bcae2574039..55450dca7b7 100644 --- a/conf/springConfigXml/ExternalPrimaryStorage.xml +++ b/conf/springConfigXml/ExternalPrimaryStorage.xml @@ -18,7 +18,7 @@ - + @@ -27,6 +27,10 @@ + + + + @@ -50,5 +54,4 @@ - diff --git a/conf/springConfigXml/HostAllocatorManager.xml b/conf/springConfigXml/HostAllocatorManager.xml index 3cd1245e8af..6370d63ea00 100755 --- a/conf/springConfigXml/HostAllocatorManager.xml +++ b/conf/springConfigXml/HostAllocatorManager.xml @@ -173,6 +173,7 @@ org.zstack.compute.allocator.HostStateAndHypervisorAllocatorFlow org.zstack.compute.allocator.ImageBackupStorageAllocatorFlow org.zstack.compute.allocator.HostCapacityAllocatorFlow + org.zstack.compute.allocator.AttachedVolumePrimaryStorageAllocatorFlow org.zstack.compute.allocator.HostPrimaryStorageAllocatorFlow org.zstack.compute.allocator.AvoidHostAllocatorFlow org.zstack.compute.allocator.TagAllocatorFlow diff --git a/conf/springConfigXml/HostNetworkManager.xml b/conf/springConfigXml/HostNetworkManager.xml index 2b0169e91e9..7a4641713e8 100644 --- a/conf/springConfigXml/HostNetworkManager.xml +++ b/conf/springConfigXml/HostNetworkManager.xml @@ -24,6 +24,7 @@ + diff --git a/conf/springConfigXml/NetworkManager.xml b/conf/springConfigXml/NetworkManager.xml index d0babe3093a..1b964387eb4 100755 --- a/conf/springConfigXml/NetworkManager.xml +++ b/conf/springConfigXml/NetworkManager.xml @@ -142,6 +142,12 @@ + + + + + + diff --git a/conf/springConfigXml/PrimaryStorageManager.xml b/conf/springConfigXml/PrimaryStorageManager.xml index 94d73fc46b3..b458d4dd29a 100755 --- a/conf/springConfigXml/PrimaryStorageManager.xml +++ b/conf/springConfigXml/PrimaryStorageManager.xml @@ -24,6 +24,7 @@ + @@ -39,6 +40,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow @@ -63,6 +65,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow @@ -87,6 +90,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow @@ -111,6 +115,7 @@ org.zstack.storage.primary.PrimaryStorageMainAllocatorFlow org.zstack.storage.primary.PrimaryStorageAvoidAllocatorFlow + org.zstack.storage.primary.PrimaryStorageFeatureAllocatorFlow org.zstack.storage.primary.PrimaryStorageTagAllocatorFlow org.zstack.storage.primary.PrimaryStorageReservedCapacityAllocatorFlow diff --git a/conf/springConfigXml/SecurityGroupManager.xml b/conf/springConfigXml/SecurityGroupManager.xml index 6cbc6bab713..923a01f5d3e 100755 --- a/conf/springConfigXml/SecurityGroupManager.xml +++ b/conf/springConfigXml/SecurityGroupManager.xml @@ -21,6 +21,7 @@ + diff --git a/conf/springConfigXml/VirtualRouter.xml b/conf/springConfigXml/VirtualRouter.xml index c2c1a44facb..1f60d286f95 100755 --- a/conf/springConfigXml/VirtualRouter.xml +++ b/conf/springConfigXml/VirtualRouter.xml @@ -124,6 +124,9 @@ + + + @@ -176,6 +179,7 @@ + @@ -217,6 +221,7 @@ + diff --git a/conf/springConfigXml/plugin.xml b/conf/springConfigXml/plugin.xml new file mode 100644 index 00000000000..743bca51ec0 --- /dev/null +++ b/conf/springConfigXml/plugin.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/conf/springConfigXml/sdnController.xml b/conf/springConfigXml/sdnController.xml index 260fd1dbe67..a9be9ec8795 100644 --- a/conf/springConfigXml/sdnController.xml +++ b/conf/springConfigXml/sdnController.xml @@ -24,6 +24,16 @@ + + + + + + + + + + @@ -58,12 +68,6 @@ - - - - - - @@ -83,4 +87,14 @@ + + + + + + + + + + diff --git a/conf/springConfigXml/vyos.xml b/conf/springConfigXml/vyos.xml index 07446e0e701..0793d44131a 100755 --- a/conf/springConfigXml/vyos.xml +++ b/conf/springConfigXml/vyos.xml @@ -106,6 +106,7 @@ org.zstack.network.service.virtualrouter.vyos.VyosDeployAgentFlow org.zstack.network.service.virtualrouter.vyos.VyosConnectFlow org.zstack.network.service.virtualrouter.vyos.VyosConfigSshFlow + org.zstack.network.service.virtualrouter.ha.VirtualRouterHaSyncConfigToBackendFlow org.zstack.network.service.virtualrouter.vyos.VyosChangePrivateL3FirewallDefaultActionFlow org.zstack.network.service.virtualrouter.dns.VirtualRouterSyncDnsOnStartFlow org.zstack.network.service.virtualrouter.vyos.VyosRefreshDchpServerFlow @@ -124,6 +125,7 @@ + diff --git a/conf/springConfigXml/zbs.xml b/conf/springConfigXml/zbs.xml index 921d444c18d..2e0234ddc1d 100644 --- a/conf/springConfigXml/zbs.xml +++ b/conf/springConfigXml/zbs.xml @@ -13,8 +13,14 @@ default-init-method="init" default-destroy-method="destroy"> + + + ImageStoreBackupStorage + + + diff --git a/conf/zstack.xml b/conf/zstack.xml index 906279c8e8f..ed752bf46ba 100755 --- a/conf/zstack.xml +++ b/conf/zstack.xml @@ -119,4 +119,5 @@ + diff --git a/configuration/pom.xml b/configuration/pom.xml index fe3b81a9412..8ce34186f80 100755 --- a/configuration/pom.xml +++ b/configuration/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. configuration diff --git a/console/pom.xml b/console/pom.xml index 1774eddca65..47806cb4219 100755 --- a/console/pom.xml +++ b/console/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java index f9aa476e31f..418f30ba433 100644 --- a/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java +++ b/console/src/main/java/org/zstack/console/ConsoleGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class ConsoleGlobalProperty { - @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.2.0.tar.gz") + @GlobalProperty(name="ConsoleProxy.agentPackageName", defaultValue = "consoleproxy-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="MN.network.", defaultValue = "") public static List MN_NETWORKS; diff --git a/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java b/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java index 36b20f540d4..a7b989662a5 100755 --- a/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java +++ b/console/src/main/java/org/zstack/console/ConsoleProxyAgentTracker.java @@ -4,7 +4,7 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.header.console.ConsoleBackend; import org.zstack.header.console.PingConsoleProxyAgentMsg; import org.zstack.header.console.PingConsoleProxyAgentReply; diff --git a/console/src/main/java/org/zstack/console/ConsoleProxyBase.java b/console/src/main/java/org/zstack/console/ConsoleProxyBase.java index 18a23c6d079..4af9bbacbdb 100755 --- a/console/src/main/java/org/zstack/console/ConsoleProxyBase.java +++ b/console/src/main/java/org/zstack/console/ConsoleProxyBase.java @@ -79,7 +79,7 @@ private void doEstablishConsoleProxyConnection(ConsoleUrl consoleUrl, final Retu cmd.setTargetHostname(targetHostname); cmd.setTargetPort(targetPort); cmd.setProxyHostname("0.0.0.0"); - if (ConsoleConstants.HTTP_SCHEMA.equals(self.getTargetSchema())) { + if (ConsoleConstants.HTTP_SCHEMA.equals(targetSchema)) { cmd.setProxyPort(CoreGlobalProperty.HTTP_CONSOLE_PROXY_PORT); } else { cmd.setProxyPort(CoreGlobalProperty.CONSOLE_PROXY_PORT); diff --git a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java index 664d2a127fa..5a84fbca1ea 100755 --- a/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java +++ b/console/src/main/java/org/zstack/console/ManagementServerConsoleProxyBackend.java @@ -480,11 +480,40 @@ private void handle(UpdateConsoleProxyAgentMsg msg) { ConsoleProxyAgentVO vo; String oldProxyIp; int oldProxyPort; - int newProxyPort = msg.getConsoleProxyPort() == 0 ? CoreGlobalProperty.CONSOLE_PROXY_PORT : msg.getConsoleProxyPort(); + int newProxyPort = msg.getConsoleProxyPort() == null ? CoreGlobalProperty.CONSOLE_PROXY_PORT : msg.getConsoleProxyPort(); @Override public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "verify-console-proxy-port"; + @Override + public void run(FlowTrigger trigger, Map data) { + if (msg.getConsoleProxyPort() == null) { + trigger.next(); + return; + } + + vo = dbf.findByUuid(msg.getUuid(), ConsoleProxyAgentVO.class); + if ((int)msg.getConsoleProxyPort() == vo.getConsoleProxyPort()) { + trigger.next(); + return; + } + + ShellUtils.ShellRunner runner = new ShellUtils.ShellRunner(); + runner.setCommand(String.format("netstat -nltp | grep -E ':%d\\s+'", msg.getConsoleProxyPort())); + runner.setVerbose(false); + runner.setWithSudo(true); + runner.setSuppressTraceLog(true); + ShellResult res = runner.run(); + String stdout = res.getStdout(); + if (res.getRetCode() == 0) { + trigger.fail(argerr("there is other process using the port: %s", stdout)); + } else { + trigger.next(); + } + } + }); flow(new Flow() { String __name__ = "update-console-proxy-agent-vo"; @Override diff --git a/core/pom.xml b/core/pom.xml index f2dd73b2205..2f9c5be27f1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.zstack - 5.2.0 + 5.4.0 .. zstack @@ -24,7 +24,7 @@ org.quartz-scheduler quartz - 2.3.2 + 2.4.0 javax.servlet diff --git a/core/src/main/java/org/zstack/core/CoreGlobalProperty.java b/core/src/main/java/org/zstack/core/CoreGlobalProperty.java index ff1759b1cb1..393face30d3 100755 --- a/core/src/main/java/org/zstack/core/CoreGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/CoreGlobalProperty.java @@ -61,11 +61,11 @@ public class CoreGlobalProperty { public static boolean IS_UPGRADE_START; @GlobalProperty(name = "shadowEntityOn", defaultValue = "false") public static boolean SHADOW_ENTITY_ON; - @NumberRange({1024, 49151}) + @NumberRange({1, 65535}) @GlobalProperty(name = "consoleProxyPort", defaultValue = "4900") public static int CONSOLE_PROXY_PORT; // for vnc @GlobalProperty(name = "httpConsoleProxyPort", defaultValue = "4901") - @NumberRange({1024, 49151}) + @NumberRange({1, 65535}) public static int HTTP_CONSOLE_PROXY_PORT; // for terminal @GlobalProperty(name = "consoleProxyCertFile", defaultValue = "") public static String CONSOLE_PROXY_CERT_FILE; diff --git a/core/src/main/java/org/zstack/core/CoreManagerImpl.java b/core/src/main/java/org/zstack/core/CoreManagerImpl.java index 25a4c050298..dd8fd8a394d 100644 --- a/core/src/main/java/org/zstack/core/CoreManagerImpl.java +++ b/core/src/main/java/org/zstack/core/CoreManagerImpl.java @@ -22,6 +22,7 @@ import org.zstack.utils.logging.CLogger; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -136,6 +137,9 @@ private void handle(GetLocalTaskMsg msg) { GetLocalTaskReply reply = new GetLocalTaskReply(); Map results = msg.getSyncSignatures().stream() .collect(Collectors.toMap(Function.identity(), thdf::getChainTaskInfo)); + if (msg.isOnlyRunningTask()) { + results.values().forEach(c -> c.getPendingTask().clear()); + } reply.setResults(results); bus.reply(msg, reply); } diff --git a/core/src/main/java/org/zstack/core/Platform.java b/core/src/main/java/org/zstack/core/Platform.java index 2645bb75b09..a8d8ae191ed 100755 --- a/core/src/main/java/org/zstack/core/Platform.java +++ b/core/src/main/java/org/zstack/core/Platform.java @@ -20,6 +20,7 @@ import org.zstack.core.search.SearchGlobalProperty; import org.zstack.core.statemachine.StateMachine; import org.zstack.core.statemachine.StateMachineImpl; +import org.zstack.core.thread.ThreadFacade; import org.zstack.header.Component; import org.zstack.header.core.StaticInit; import org.zstack.header.core.encrypt.ENCRYPT; @@ -33,6 +34,7 @@ import org.zstack.utils.data.StringTemplate; import org.zstack.utils.logging.CLogger; import org.zstack.utils.logging.CLoggerImpl; +import org.zstack.utils.network.IPv6NetworkUtils; import org.zstack.utils.network.NetworkUtils; import org.zstack.utils.path.PathUtil; import org.zstack.utils.string.ErrorCodeElaboration; @@ -49,9 +51,11 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.net.UnknownHostException; import java.sql.Timestamp; import java.util.*; import java.util.concurrent.TimeUnit; @@ -665,6 +669,11 @@ public static ComponentLoader createComponentLoaderFromWebApplicationContext(Web ((Component)gcf).start(); } + ThreadFacade thdf = loader.getComponent(ThreadFacade.class); + if (thdf != null) { + thdf.start(); + } + bus = loader.getComponentNoExceptionWhenNotExisting(CloudBus.class); if (bus != null) { bus.start(); @@ -723,6 +732,21 @@ public static String getManagementServerVip() { return ZSha2Helper.getInfo(false).getDbvip(); } + public static String getManagementServerVipBaseUrl() { + String ipAddress = getManagementServerVip(); + int port = getManagementNodeServicePort(); + String formattedIp; + + + if (IPv6NetworkUtils.isIpv6Address(ipAddress)) { + formattedIp = String.format("[%s]", ipAddress); + } else { + formattedIp = ipAddress; + } + + return String.format("http://%s:%d", formattedIp, port); + } + public static String getCanonicalServerIp() { if (!ZSha2Helper.isMNHaEnvironment()) { return getManagementServerIp(); @@ -820,9 +844,14 @@ private static String getManagementServerIpInternal() { for (NetworkInterface iface : Collections.list(nets)) { String name = iface.getName(); if (defaultLine.contains(name)) { - InetAddress ia = iface.getInetAddresses().nextElement(); - ip = ia.getHostAddress(); - break; + for (InetAddress ia : Collections.list(iface.getInetAddresses())) { + ip = ia.getHostAddress(); + if (ia instanceof Inet4Address) { + // we prefer IPv4 address + ip = ia.getHostAddress(); + break; + } + } } } } catch (SocketException e) { @@ -1018,11 +1047,11 @@ private static void generateElaboration(Enum errCode, ErrorCode result, String f // error from other component directly, so we need to check if the args is // matched with the regex at first if (args != null && args.length == 1 && StringSimilarity.isRegexMatched(ela.getRegex(), String.valueOf(args[0]))) { - result.setMessages(new ErrorCodeElaboration(ela)); + result.setMessages(new ErrorCodeElaboration(ela, locale)); String formatError = String.format(prefix, args[0]); result.setElaboration(StringSimilarity.formatElaboration(formatError)); } else { - result.setMessages(new ErrorCodeElaboration(ela, args)); + result.setMessages(new ErrorCodeElaboration(ela, locale, args)); result.setElaboration(StringSimilarity.formatElaboration(String.format(prefix, msg), args)); } diff --git a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java index 365b556c9ab..0dfc6c0d2da 100755 --- a/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java +++ b/core/src/main/java/org/zstack/core/ansible/AnsibleGlobalProperty.java @@ -9,7 +9,7 @@ public class AnsibleGlobalProperty { @GlobalProperty(name = "Ansible.executable", defaultValue = "python") public static String EXECUTABLE; - @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.2.0.tar.gz") + @GlobalProperty(name = "Ansible.zstacklibPackageName", defaultValue = "zstacklib-5.4.0.tar.gz") public static String ZSTACKLIB_PACKAGE_NAME; @GlobalProperty(name = "Ansible.zstackRoot", defaultValue = "/var/lib/zstack") public static String ZSTACK_ROOT; diff --git a/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj b/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj index 144fe8161bd..700bf48a38b 100755 --- a/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj +++ b/core/src/main/java/org/zstack/core/aspect/AsyncBackupAspect.aj @@ -3,14 +3,14 @@ package org.zstack.core.aspect; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.errorcode.ErrorFacade; -import org.zstack.header.core.workflow.FlowRollback; -import org.zstack.header.errorcode.ErrorCodeList; -import org.zstack.header.errorcode.OperationFailureException; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; -import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.core.*; +import org.zstack.header.core.workflow.FlowRollback; +import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.message.Message; import org.zstack.utils.DebugUtils; @@ -247,4 +247,13 @@ public aspect AsyncBackupAspect { backup(completion.getBackups(), t); } } + + boolean around(org.zstack.header.core.AbstractCompletion completion) : this(completion) && execution(boolean org.zstack.core.thread.CancelablePeriodicTask+.run()) { + try { + return proceed(completion); + } catch (Throwable t) { + backup(completion.getBackups(), t); + return true; + } + } } diff --git a/core/src/main/java/org/zstack/core/aspect/BackAspect.aj b/core/src/main/java/org/zstack/core/aspect/BackAspect.aj index 2f6cf54e83c..bf5d05d4b21 100644 --- a/core/src/main/java/org/zstack/core/aspect/BackAspect.aj +++ b/core/src/main/java/org/zstack/core/aspect/BackAspect.aj @@ -21,7 +21,7 @@ public aspect BackAspect { private void setMsgDeadline() { if (TaskContext.containsTaskContext("__messagedeadline__")) { long deadline = Long.parseLong((String) TaskContext.getTaskContext().get("__messagedeadline__")); - if (deadline < System.currentTimeMillis()) { + if (deadline < System.currentTimeMillis() + 1000) { TaskContext.getTaskContext().put("__messagedeadline__", String.valueOf(deadline + TimeUtils.parseTimeInMillis("30m"))); TaskContext.getTaskContext().put("__messagetimeout__", String.valueOf(TimeUtils.parseTimeInMillis("30m"))); } diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java index efe579df429..2ae626dcebf 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBus.java @@ -3,6 +3,7 @@ import org.springframework.http.HttpEntity; import org.zstack.header.Component; import org.zstack.header.Service; +import org.zstack.header.core.FutureCompletion; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.exception.CloudConfigureFailException; import org.zstack.header.message.*; @@ -12,14 +13,19 @@ import java.util.function.Consumer; public interface CloudBus extends Component { - void send(Message msg); + /** + * submit a message sending task into the queue. + * @return {@link FutureCompletion} which can be used to check whether the message was successfully sent or not. + */ + + FutureCompletion send(Message msg); void send(List msgs); @Deprecated void send(APIMessage msg, Consumer consumer); - void send(NeedReplyMessage msg, CloudBusCallBack callback); + FutureCompletion send(NeedReplyMessage msg, CloudBusCallBack callback); @Deprecated void send(List msgs, CloudBusListCallBack callBack); diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java index a00a6718513..579a78e4860 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl2.java @@ -19,6 +19,7 @@ import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.Constants; import org.zstack.header.Service; +import org.zstack.header.core.FutureCompletion; import org.zstack.header.log.NoLogging; import org.zstack.header.apimediator.APIIsReadyToGoMsg; import org.zstack.header.apimediator.APIIsReadyToGoReply; @@ -105,6 +106,11 @@ public class CloudBusImpl2 implements CloudBus, CloudBusIN, ManagementNodeChange private final String AMQP_PROPERTY_HEADER__COMPRESSED = "compressed"; private String SERVICE_ID = makeLocalServiceId("cloudbus"); + public static final FutureCompletion SEND_CONFIRMED = new FutureCompletion(null); + + static { + SEND_CONFIRMED.success(); + } public void setDEFAULT_MESSAGE_TIMEOUT(long timeout) { this.DEFAULT_MESSAGE_TIMEOUT = timeout; @@ -1327,8 +1333,9 @@ private void send(Message msg, Boolean noNeedReply) { } @Override - public void send(Message msg) { + public FutureCompletion send(Message msg) { send(msg, true); + return SEND_CONFIRMED; } @Override @@ -1358,7 +1365,7 @@ private void evaluateMessageTimeout(NeedReplyMessage msg) { } @Override - public void send(final NeedReplyMessage msg, final CloudBusCallBack callback) { + public FutureCompletion send(final NeedReplyMessage msg, final CloudBusCallBack callback) { evaluateMessageTimeout(msg); Envelope e = new Envelope() { @@ -1409,6 +1416,7 @@ List getRequests() { envelopes.put(msg.getId(), e); send(msg, false); + return SEND_CONFIRMED; } private MessageReply createTimeoutReply(NeedReplyMessage m) { diff --git a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java index 0d83683708a..1a228ef7af7 100755 --- a/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java +++ b/core/src/main/java/org/zstack/core/cloudbus/CloudBusImpl3.java @@ -101,6 +101,7 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { private final static TimeoutRestTemplate http = RESTFacade.createRestTemplate(CoreGlobalProperty.REST_FACADE_READ_TIMEOUT, CoreGlobalProperty.REST_FACADE_CONNECT_TIMEOUT); public static final String HTTP_BASE_URL = "/cloudbus"; + public static final FutureCompletion SEND_CONFIRMED = new FutureCompletion(null); { if (CloudBusGlobalProperty.MESSAGE_LOG != null) { @@ -114,6 +115,8 @@ public class CloudBusImpl3 implements CloudBus, CloudBusIN { CloudBusGlobalProperty.HTTP_CONTEXT_PATH = ""; CloudBusGlobalProperty.HTTP_PORT = 8989; } + + SEND_CONFIRMED.success(); } public static String getManagementNodeUUIDFromServiceID(String serviceID) { @@ -125,6 +128,12 @@ public static String getManagementNodeUUIDFromServiceID(String serviceID) { return ss[0]; } + private FutureCompletion sendFail(ErrorCode errorCode) { + FutureCompletion c = new FutureCompletion(null); + c.fail(errorCode); + return c; + } + private abstract class Envelope { long startTime; @@ -250,8 +259,8 @@ public void deActiveService(String id) { } @Override - public void send(Message msg) { - send(msg, true); + public FutureCompletion send(Message msg) { + return send(msg, true); } @Override @@ -291,11 +300,11 @@ private MessageReply createTimeoutReply(NeedReplyMessage m) { } @Override - public void send(NeedReplyMessage msg, CloudBusCallBack callback) { + public FutureCompletion send(NeedReplyMessage msg, CloudBusCallBack callback) { evaluateMessageTimeout(msg); if (msg.getTimeout() <= 1) { callback.run(createTimeoutReply(msg)); - return; + return SEND_CONFIRMED; } Envelope e = new Envelope() { @@ -346,7 +355,7 @@ public void timeout() { envelopes.put(msg.getId(), e); msgExts.forEach(m -> m.afterAddEnvelopes(msg.getId())); - send(msg, false); + return send(msg, false); } @Override @@ -526,29 +535,36 @@ public MessageSender(Message msg) { localSend = !CloudBusGlobalProperty.HTTP_ALWAYS && managementNodeId.equals(Platform.getManagementServerId()); } - void send() { + FutureCompletion send() { try { - doSend(); + return doSend(); } catch (Throwable th) { - replyErrorIfNeeded(operr(th.getMessage())); + ErrorCode err = operr(th.getMessage()); + replyErrorIfNeeded(err); + + FutureCompletion c = new FutureCompletion(null); + c.fail(err); + return c; } } - private void doSend() { + private FutureCompletion doSend() { if (msg instanceof Event) { eventSend(); - return; + return SEND_CONFIRMED; } if (localSend) { localSend(); + return SEND_CONFIRMED; } else { - httpSend(); + return httpSend(); } } - private void httpSendInQueue(String ip) { - thdf.chainSubmit(new ChainTask(null) { + private FutureCompletion httpSendInQueue(String ip) { + FutureCompletion sendCompletion = new FutureCompletion(null); + thdf.chainSubmit(new ChainTask(sendCompletion) { @Override public String getSyncSignature() { return "http-send-in-queue"; @@ -557,6 +573,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { httpSend(ip); + sendCompletion.success(); chain.next(); } @@ -570,25 +587,29 @@ public String getName() { return getSyncSignature(); } }); + return sendCompletion; } - private void httpSend() { + private FutureCompletion httpSend() { buildSchema(msg); + String ip; try { - String ip = destMaker.getNodeInfo(managementNodeId).getNodeIP(); - httpSendInQueue(ip); + ip = destMaker.getNodeInfo(managementNodeId).getNodeIP(); } catch (ManagementNodeNotFoundException e) { - if (msg instanceof MessageReply) { - if (!deadMessageManager.handleManagementNodeNotFoundError(managementNodeId, msg, () -> { - String ip = destMaker.getNodeInfo(managementNodeId).getNodeIP(); - httpSendInQueue(ip); - })) { - throw e; - } + boolean errorHandled = msg instanceof MessageReply && + deadMessageManager.handleManagementNodeNotFoundError(managementNodeId, msg, () -> { + String otherIp = destMaker.getNodeInfo(managementNodeId).getNodeIP(); + logger.warn(String.format("resend the message[id:%s] to node[ip:%s]", msg.getId(), otherIp)); + httpSendInQueue(otherIp); + }); + if (errorHandled) { + return SEND_CONFIRMED; } else { throw e; } } + + return httpSendInQueue(ip); } private void httpSend(String ip) { @@ -680,6 +701,11 @@ public void run(MessageReply reply) { }); future.await(SYNC_CALL_TIMEOUT); + if (!future.isSuccess()) { + MessageReply reply = new MessageReply(); + reply.setError(future.getErrorCode()); + return reply; + } return future.getResult(); } @@ -696,6 +722,15 @@ public void run(List replies) { }); future.await(SYNC_CALL_TIMEOUT); + if (!future.isSuccess()) { + List replies = new ArrayList<>(msgs.size()); + msgs.forEach(msg -> { + MessageReply reply = new MessageReply(); + reply.setError(future.getErrorCode()); + replies.add(reply); + }); + return replies; + } return future.getResult(); } @@ -1194,7 +1229,7 @@ private void evalThreadContextToMessage(Message msg) { } } - private void doSendAndCallExtensions(Message msg) { + private FutureCompletion doSendAndCallExtensions(Message msg) { // for unit test finding invocation chain MessageCommandRecorder.record(msg.getClass()); @@ -1209,20 +1244,20 @@ private void doSendAndCallExtensions(Message msg) { interceptor.beforeSendMessage(msg); } - doSend(msg); + return doSend(msg); } - private void doSend(Message msg) { + private FutureCompletion doSend(Message msg) { evalThreadContextToMessage(msg); if (logger.isTraceEnabled() && islogMessage(msg)) { logger.trace(String.format("[msg send]: %s", dumpMessage(msg))); } - new MessageSender(msg).send(); + return new MessageSender(msg).send(); } - private void send(Message msg, Boolean noNeedReply) { + private FutureCompletion send(Message msg, Boolean noNeedReply) { if (msg.getServiceId() == null) { throw new IllegalArgumentException(String.format("service id cannot be null: %s", msg.getClass().getName())); } @@ -1238,7 +1273,7 @@ private void send(Message msg, Boolean noNeedReply) { msg.putHeaderEntry(NO_NEED_REPLY_MSG, noNeedReply.toString()); } - doSendAndCallExtensions(msg); + return doSendAndCallExtensions(msg); } private void restoreFromSchema(Message msg, Map raw) throws ClassNotFoundException { diff --git a/core/src/main/java/org/zstack/core/db/Q.java b/core/src/main/java/org/zstack/core/db/Q.java index 708fe20c048..8dcdcdf48fa 100755 --- a/core/src/main/java/org/zstack/core/db/Q.java +++ b/core/src/main/java/org/zstack/core/db/Q.java @@ -31,6 +31,16 @@ public Q orderBy(SingularAttribute attr, SimpleQuery.Od order) { return this; } + public Q orderByAsc(SingularAttribute attr) { + q.orderBy(attr, SimpleQuery.Od.ASC); + return this; + } + + public Q orderByDesc(SingularAttribute attr) { + q.orderBy(attr, SimpleQuery.Od.DESC); + return this; + } + public Q groupBy(SingularAttribute attr) { q.groupBy(attr); return this; @@ -116,11 +126,19 @@ public Q in(SingularAttribute attr, Collection val) { return this; } + public QueryMore in(SingularAttribute attr, Q subQuery) { + return toQueryMore().in(attr, subQuery); + } + public Q notIn(SingularAttribute attr, Collection val) { q.add(attr, SimpleQuery.Op.NOT_IN, val); return this; } + public QueryMore notIn(SingularAttribute attr, Q subQuery) { + return toQueryMore().notIn(attr, subQuery); + } + public Q isNull(SingularAttribute attr) { q.add(attr, SimpleQuery.Op.NULL); return this; @@ -164,4 +182,12 @@ public Q notLike(SingularAttribute attr, Object val) { public static Q New(Class clz) { return new Q(clz); } + + public static QueryMore New(Class clz, Class... more) { + return new QueryMore(clz, more); + } + + public QueryMore toQueryMore() { + return q.toQueryMore(); + } } diff --git a/core/src/main/java/org/zstack/core/db/QueryMore.java b/core/src/main/java/org/zstack/core/db/QueryMore.java new file mode 100644 index 00000000000..21d1441c677 --- /dev/null +++ b/core/src/main/java/org/zstack/core/db/QueryMore.java @@ -0,0 +1,473 @@ +package org.zstack.core.db; + +import org.apache.commons.collections.CollectionUtils; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.utils.DebugUtils; + +import javax.persistence.Tuple; +import javax.persistence.metamodel.SingularAttribute; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.IntFunction; + +import static org.zstack.core.db.SimpleQuery.Op.*; + +public class QueryMore { + private final Class[] tables; + private List selects = new ArrayList<>(); + private List orders = new ArrayList<>(); + private List conditions = new ArrayList<>(); + private List moreConditions = new ArrayList<>(); + private Integer limit; + private Integer start; + + private int tableIndex; + private int tableOffset; // used in sub-query + + QueryMore(Class one, Class... more) { + this.tables = new Class[more.length + 1]; + this.tables[0] = one; + + if (more.length > 0) { + System.arraycopy(more, 0, this.tables, 1, more.length); + } + } + + public class AttrInfo { + SingularAttribute attr; + String function; + int tableIndex; + + private String toSql() { + if (function != null) { + return attr == null ? + String.format("%s(t%d)", function, tableIndex + tableOffset) : + String.format("%s(t%d.%s)", function, tableIndex + tableOffset, attr.getName()); + } + + return attr == null ? + String.format("t%d", tableIndex + tableOffset) : + String.format("t%d.%s", tableIndex + tableOffset, attr.getName()); + } + } + + public class OrderInfo { + SingularAttribute attr; + SimpleQuery.Od od; + int tableIndex; + + private String toSql() { + return String.format("t%d.%s %s", tableIndex + tableOffset, attr.getName(), od.name()); + } + } + + public static class TableOption { + IntFunction function; + Consumer> attrConsumer; + + public ResultType table0(SingularAttribute attr) { + return table(0, attr); + } + + public ResultType table1(SingularAttribute attr) { + return table(1, attr); + } + + public ResultType table2(SingularAttribute attr) { + return table(2, attr); + } + + public ResultType table3(SingularAttribute attr) { + return table(3, attr); + } + + public ResultType table(int tableIndex, SingularAttribute attr) { + attrConsumer.accept(attr); + return function.apply(tableIndex); + } + } + + public class Condition { + SingularAttribute attr; + SimpleQuery.Op op; + Object value; + int tableIndex; + + private String toSql(int paramIndex) { + switch (op) { + case NULL: case NOT_NULL: + return String.format("t%d.%s %s", tableIndex + tableOffset, attr.getName(), op.toString()); + case IN: case NOT_IN: case LIKE: case NOT_LIKE: + return String.format("t%d.%s %s :p%d", tableIndex + tableOffset, attr.getName(), op.toString(), paramIndex); + } + return String.format("t%d.%s%s:p%d", tableIndex + tableOffset, attr.getName(), op.toString(), paramIndex); + } + + private boolean needParam() { + return op != NULL && op != NOT_NULL; + } + + private boolean hasSubQuery() { + return value instanceof QueryMore; + } + + private String handleSubQuery(Map params, int tableOffset) { + if (value instanceof QueryMore) { + final QueryMore q = (QueryMore) value; + q.tableOffset = tableOffset; + final String sql = q.toSqlAndFillParamMap(params); + return String.format("t%d.%s %s (%s)", + tableIndex + QueryMore.this.tableOffset, + attr.getName(), op.toString(), sql); + } + throw new CloudRuntimeException("should not be here"); + } + } + + public class ConditionBetweenTables { + int tableIndex1; + SingularAttribute attr1; + SimpleQuery.Op op; + int tableIndex2; + SingularAttribute attr2; + + private String toSql() { + return String.format("t%d.%s%st%d.%s", + tableIndex1 + tableOffset, attr1.getName(), op.toString(), + tableIndex2 + tableOffset, attr2.getName()); + } + } + + public QueryMore condition(SingularAttribute attr, SimpleQuery.Op op, Object value) { + Condition c = new Condition(); + c.attr = attr; + c.op = op; + c.value = value; + c.tableIndex = tableIndex; + conditions.add(c); + return this; + } + + public QueryMore selectThisTable() { + AttrInfo info = new AttrInfo(); + info.tableIndex = tableIndex; + selects.add(info); + return this; + } + + public QueryMore selectCountThisTable() { + AttrInfo info = new AttrInfo(); + info.tableIndex = tableIndex; + info.function = "count"; + selects.add(info); + return this; + } + + public QueryMore select(SingularAttribute... attrs) { + for (int i = 0; i < attrs.length; i++) { + AttrInfo info = new AttrInfo(); + info.attr = attrs[i]; + info.tableIndex = tableIndex; + selects.add(info); + } + return this; + } + + public QueryMore selectSum(SingularAttribute attr) { + AttrInfo info = new AttrInfo(); + info.attr = attr; + info.function = "sum"; + info.tableIndex = tableIndex; + selects.add(info); + return this; + } + + public QueryMore selectCount(SingularAttribute attr) { + AttrInfo info = new AttrInfo(); + info.attr = attr; + info.function = "count"; + info.tableIndex = tableIndex; + selects.add(info); + return this; + } + + public QueryMore eq(SingularAttribute attr, Object value) { + return condition(attr, EQ, value); + } + + // table0.uuid = table1.refUuid + public TableOption eq(SingularAttribute attr) { + ConditionBetweenTables condition = new ConditionBetweenTables(); + condition.tableIndex1 = tableIndex; + condition.attr1 = attr; + condition.op = SimpleQuery.Op.EQ; + + TableOption result = new TableOption<>(); + result.attrConsumer = (attr2) -> condition.attr2 = attr2; + result.function = (tableIndex) -> { + condition.tableIndex2 = tableIndex; + moreConditions.add(condition); + return this; + }; + return result; + } + + public QueryMore notEq(SingularAttribute attr, Object value) { + return condition(attr, NOT_EQ, value); + } + + public QueryMore in(SingularAttribute attr, Collection collection) { + DebugUtils.Assert(CollectionUtils.isNotEmpty(collection), "Op.IN value cannot be null or empty"); + return condition(attr, IN, collection); + } + + public QueryMore in(SingularAttribute attr, QueryMore subQuery) { + return condition(attr, IN, subQuery); + } + + public QueryMore in(SingularAttribute attr, Q subQuery) { + return in(attr, subQuery.toQueryMore()); + } + + public QueryMore notIn(SingularAttribute attr, Collection collection) { + return condition(attr, NOT_IN, collection); + } + + public QueryMore notIn(SingularAttribute attr, QueryMore subQuery) { + return condition(attr, NOT_IN, subQuery); + } + + public QueryMore notIn(SingularAttribute attr, Q subQuery) { + return notIn(attr, subQuery.toQueryMore()); + } + + public QueryMore isNull(SingularAttribute attr) { + return condition(attr, NULL, null); + } + + public QueryMore notNull(SingularAttribute attr) { + return condition(attr, NOT_NULL, null); + } + + public QueryMore gt(SingularAttribute attr, Object value) { + return condition(attr, GT, value); + } + + public QueryMore gte(SingularAttribute attr, Object value) { + return condition(attr, GTE, value); + } + + public QueryMore lt(SingularAttribute attr, Object value) { + return condition(attr, LT, value); + } + + public QueryMore lte(SingularAttribute attr, Object value) { + return condition(attr, LTE, value); + } + + public QueryMore like(SingularAttribute attr, Object value) { + return condition(attr, LIKE, value); + } + + public QueryMore notLike(SingularAttribute attr, Object value) { + return condition(attr, NOT_LIKE, value); + } + + public QueryMore table(int tableIndex) { + this.tableIndex = tableIndex; + return this; + } + + public QueryMore table0() { + return table(0); + } + + public QueryMore table1() { + return table(1); + } + + public QueryMore table2() { + return table(2); + } + + public QueryMore table3() { + return table(3); + } + + public QueryMore orderByAsc(SingularAttribute attr) { + OrderInfo order = new OrderInfo(); + order.tableIndex = tableIndex; + order.od = SimpleQuery.Od.ASC; + order.attr = attr; + orders.add(order); + return this; + } + + public QueryMore orderByDesc(SingularAttribute attr) { + OrderInfo order = new OrderInfo(); + order.tableIndex = tableIndex; + order.od = SimpleQuery.Od.DESC; + order.attr = attr; + orders.add(order); + return this; + } + + public QueryMore limit(int limit) { + this.limit = limit; + return this; + } + + public QueryMore start(int start) { + this.start = start; + return this; + } + + public String toSql() { + return toSqlAndFillParamMap(new HashMap<>()); + } + + private String toSqlAndFillParamMap(Map params) { + StringBuilder builder = new StringBuilder(); + + builder.append("select "); + if (!selects.isEmpty()) { + for (AttrInfo select : selects) { + builder.append(select.toSql()).append(','); + } + builder.deleteCharAt(builder.length() - 1); + } else if (tables.length == 1) { + builder.append("t0"); + } else { + builder.append('*'); + } + + builder.append(" from "); + for (int i = 0; i < tables.length; i++) { + Class table = tables[i]; + builder.append(table.getSimpleName()).append(' ').append('t').append(i + tableOffset).append(','); + } + builder.deleteCharAt(builder.length() - 1); + + if (!conditions.isEmpty() || !moreConditions.isEmpty()) { + builder.append(" where "); + List conditionScripts = new ArrayList<>(); + + for (Condition condition : conditions) { + if (condition.hasSubQuery()) { + conditionScripts.add(condition.handleSubQuery(params, tableOffset + tables.length)); + continue; + } + + int paramIndex = params.size(); + conditionScripts.add(condition.toSql(paramIndex)); + if (condition.needParam()) { + params.put("p" + paramIndex, condition.value); + } + } + + for (ConditionBetweenTables moreCondition : moreConditions) { + conditionScripts.add(moreCondition.toSql()); + } + + builder.append(String.join(" and ", conditionScripts)); + } + + if (!orders.isEmpty()) { + builder.append(" order by "); + + for (OrderInfo order : orders) { + builder.append(order.toSql()).append(','); + } + builder.deleteCharAt(builder.length() - 1); + } + + if (limit != null) { + builder.append(" limit ").append(limit); + } + if (start != null) { + builder.append(" offset ").append(start); + } + + return builder.toString(); + } + + @Override + public String toString() { + return toSql(); + } + + public SQL toSqlInstance(Class returnType) { + final Map paramMap = new HashMap<>(); + final SQL sqlInstance = SQL.New(toSqlAndFillParamMap(paramMap), returnType); + paramMap.forEach(sqlInstance::param); + return sqlInstance; + } + + public SQL toSqlInstance() { + final Map paramMap = new HashMap<>(); + final SQL sqlInstance = SQL.New(toSqlAndFillParamMap(paramMap)); + paramMap.forEach(sqlInstance::param); + return sqlInstance; + } + + public List list() { + if (this.selects.size() == 1 && this.selects.get(0).attr == null) { + int tableIndex = this.selects.get(0).tableIndex; + return toSqlInstance(tables[tableIndex]).list(); + } else if (this.selects.isEmpty() && this.tables.length == 1) { + return toSqlInstance(tables[0]).list(); + } + + return toSqlInstance().list(); + } + + public T find() { + if (this.selects.size() == 1 && this.selects.get(0).attr == null) { + int tableIndex = this.selects.get(0).tableIndex; + return toSqlInstance(tables[tableIndex]).find(); + } else if (this.selects.isEmpty() && this.tables.length == 1) { + return toSqlInstance(tables[0]).find(); + } + + return toSqlInstance().find(); + } + + public T find(Class returnType) { + return toSqlInstance(returnType).find(); + } + + public Tuple findTuple() { + return toSqlInstance(Tuple.class).find(); + } + + public List listTuple() { + return toSqlInstance(Tuple.class).list(); + } + + public Long count() { + if (selects.isEmpty()) { + AttrInfo info = new AttrInfo(); + info.tableIndex = 0; + info.function = "count"; + selects.add(info); + } else if (selects.size() == 1) { + selects.get(0).function = "count"; + } else { + throw new CloudRuntimeException("You must specify an attribute using the selectCount() method"); + } + + return toSqlInstance(Long.class).find(); + } + + public boolean isExists() { + return count() > 0; + } + + public static QueryMore New(Class clz) { + return new QueryMore(clz); + } +} diff --git a/core/src/main/java/org/zstack/core/db/SQLBatch.java b/core/src/main/java/org/zstack/core/db/SQLBatch.java index fe476e4b6f4..c23ea9ec71c 100755 --- a/core/src/main/java/org/zstack/core/db/SQLBatch.java +++ b/core/src/main/java/org/zstack/core/db/SQLBatch.java @@ -68,6 +68,10 @@ protected Q q(Class clz) { return Q.New(clz); } + protected QueryMore q(Class first, Class... more) { + return Q.New(first, more); + } + @Transactional private void _execute() { scripts(); diff --git a/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java b/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java index 18f5bebe189..9ba9b0ac494 100755 --- a/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java +++ b/core/src/main/java/org/zstack/core/db/SimpleQueryImpl.java @@ -405,4 +405,34 @@ public SimpleQuery setStart(int start) { this.start = start; return this; } + + public QueryMore toQueryMore() { + QueryMore q = new QueryMore(_entityClass); + + if (start != null) { + q.start(start); + } + if (limit != null) { + q.limit(limit); + } + + if (!_selects.isEmpty()) { + q.select(_selects.stream().map(s -> s._attr).toArray(SingularAttribute[]::new)); + } + if (!orderInfos.isEmpty()) { + for (OrderInfo orderInfo : orderInfos) { + if (orderInfo.od == Od.ASC) { + q.orderByAsc(orderInfo.attr); + } else { + q.orderByDesc(orderInfo.attr); + } + } + } + if (!_conditions.isEmpty()) { + for (Condition condition : _conditions) { + q.condition(condition._attr, condition._op, condition._val[0]); + } + } + return q; + } } diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java b/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java index f9a301d3edb..674121ca978 100644 --- a/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptDriver.java @@ -1,6 +1,7 @@ package org.zstack.core.encrypt; import org.zstack.header.errorcode.ErrorableValue; +import java.util.List; public interface EncryptDriver { String encryptError = "%s encrypt failed"; @@ -8,6 +9,11 @@ public interface EncryptDriver { EncryptDriverType getDriverType(); + default List getDriverTypes() { + return null; + } + + String encrypt(String data); String decrypt(String data); diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java index 2766b0961a6..9580f9bebb3 100644 --- a/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptFacadeImpl.java @@ -17,6 +17,7 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.utils.BeanUtils; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -249,32 +250,36 @@ private void collectAllEncryptPassword() { private void initEncryptDriver() { String driverType = EncryptGlobalConfig.ENCRYPT_DRIVER.value(); - for (EncryptDriver driver : pluginRegistry.getExtensionList(EncryptDriver.class)) { - if (!driverType.equals(driver.getDriverType().toString())) { - continue; - } - - encryptDriver = driver; - break; + EncryptDriver encryptDriver = findEncryptDriver(driverType); + if (encryptDriver != null) { + this.encryptDriver = encryptDriver; + logger.debug(String.format("New encrypt driver: %s is included by driver class: %s", driverType, encryptDriver.getClass().getCanonicalName())); + return; } - if (encryptDriver == null) { - throw new CloudRuntimeException(String.format("no matched encrypt driver[type:%s] can be found", driverType)); - } + throw new CloudRuntimeException(String.format("No matched encrypt driver[type:%s] can be found", driverType)); } - public void installGlobalConfigUpdateHooks() { - EncryptGlobalConfig.ENCRYPT_DRIVER.installUpdateExtension(new GlobalConfigUpdateExtensionPoint() { - @Override - public void updateGlobalConfig(GlobalConfig oldConfig, GlobalConfig newConfig) { - for (EncryptDriver driver : pluginRegistry.getExtensionList(EncryptDriver.class)) { - if (!newConfig.value().equals(driver.getDriverType().toString())) { - continue; - } + private EncryptDriver findEncryptDriver(String driverType) { + return pluginRegistry.getExtensionList(EncryptDriver.class).stream() + .filter(driver -> driverType.equals(driver.getDriverType().toString()) || + (driver.getDriverTypes() != null && driver.getDriverTypes().contains(driverType))) + .findFirst() + .orElseGet(() -> { + logger.error(String.format("No matched encrypt driver[type:%s] can be found", driverType)); + return null; + }); + } - encryptDriver = driver; - break; - } + public void installGlobalConfigUpdateHooks() { + EncryptGlobalConfig.ENCRYPT_DRIVER.installUpdateExtension((oldConfig, newConfig) -> { + String updatedToDriverType = newConfig.value(); + EncryptDriver encryptDriver = findEncryptDriver(updatedToDriverType); + if (encryptDriver != null) { + logger.debug(String.format("New encrypt driver: %s is included by driver class: %s", updatedToDriverType, encryptDriver.getClass().getCanonicalName())); + this.encryptDriver = encryptDriver; + } else { + logger.error(String.format("No matched encrypt driver[type:%s] can be found", updatedToDriverType)); } }); diff --git a/core/src/main/java/org/zstack/core/encrypt/EncryptResult.java b/core/src/main/java/org/zstack/core/encrypt/EncryptResult.java new file mode 100644 index 00000000000..56bb2c38dac --- /dev/null +++ b/core/src/main/java/org/zstack/core/encrypt/EncryptResult.java @@ -0,0 +1,38 @@ +package org.zstack.core.encrypt; + +import org.zstack.header.errorcode.ErrorCode; + +/** + * Created by LiangHanYu on 2021/11/14 19:16 + */ +public class EncryptResult { + T result; + ErrorCode error = null; + + public EncryptResult() { + } + + public EncryptResult(T result) { + this.result = result; + } + + public EncryptResult(ErrorCode error) { + this.error = error; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } + + public ErrorCode getError() { + return error; + } + + public void setError(ErrorCode error) { + this.error = error; + } +} \ No newline at end of file diff --git a/core/src/main/java/org/zstack/core/gc/GarbageCollector.java b/core/src/main/java/org/zstack/core/gc/GarbageCollector.java index 734818f1288..a27b2c5a073 100755 --- a/core/src/main/java/org/zstack/core/gc/GarbageCollector.java +++ b/core/src/main/java/org/zstack/core/gc/GarbageCollector.java @@ -202,8 +202,12 @@ void runTrigger() { GarbageCollector self = this; EXECUTED_TIMES++; - boolean isExisting = Q.New(GarbageCollectorVO.class).eq(GarbageCollectorVO_.uuid, getUuid()).isExists(); - if (!isExisting) { + boolean existAndNotDone = Q.New(GarbageCollectorVO.class) + .eq(GarbageCollectorVO_.uuid, getUuid()) + .notEq(GarbageCollectorVO_.status, GCStatus.Done) + .isExists(); + + if (!existAndNotDone) { canceller.run(); gcMgr.deregisterGC(self); return; diff --git a/core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy b/core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..a8758699511 --- /dev/null +++ b/core/src/main/java/org/zstack/core/jsonlabel/JsonLabelInventoryDoc_zh_cn.groovy @@ -0,0 +1,46 @@ +package org.zstack.core.jsonlabel + +import java.sql.Timestamp + +doc { + + title "JsonLabelInventory的数据结构" + + field { + name "id" + desc "唯一标识符" + type "long" + since "4.2.0" + } + field { + name "labelKey" + desc "标签键" + type "String" + since "4.2.0" + } + field { + name "labelValue" + desc "标签值" + type "String" + since "4.2.0" + } + field { + name "resourceUuid" + desc "资源UUID" + type "String" + since "4.2.0" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "4.2.0" + } + field { + name "lastOpDate" + desc "最后操作时间" + type "Timestamp" + since "4.2.0" + } +} + diff --git a/core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java b/core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java new file mode 100644 index 00000000000..41769af5596 --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginApiInterceptor.java @@ -0,0 +1,33 @@ +package org.zstack.core.plugin; + +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.ApiMessageInterceptor; +import org.zstack.header.core.external.plugin.APIDeletePluginDriversMsg; +import org.zstack.header.core.external.plugin.PluginDriversExtensionPoint; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.message.APIMessage; + +class PluginApiInterceptor implements ApiMessageInterceptor { + @Autowired + protected PluginRegistry pluginRgty; + + @Override + public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { + if (msg instanceof APIDeletePluginDriversMsg) { + validate((APIDeletePluginDriversMsg) msg); + } + + return msg; + } + + private void validate(APIDeletePluginDriversMsg msg) { + for (PluginDriversExtensionPoint ext : pluginRgty.getExtensionList(PluginDriversExtensionPoint.class)) { + ErrorCode result = ext.validateDeletePluginDrivers(msg.getUuid()); + if (result != null) { + throw new ApiMessageInterceptionException(result); + } + } + } +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java b/core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java new file mode 100644 index 00000000000..e5114f2a9fe --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginGlobalConfig.java @@ -0,0 +1,20 @@ +package org.zstack.core.plugin; + +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; +import org.zstack.core.config.GlobalConfigDefinition; +import org.zstack.core.config.GlobalConfigValidation; + +/** + * PluginGlobalConfig implementation. + */ +@GlobalConfigDefinition +public class PluginGlobalConfig { + public static final String CATEGORY = "plugin"; + + @GlobalConfigValidation + @GlobalConfigDef(type = Boolean.class, defaultValue = "true") + public static GlobalConfig ALLOW_UNKNOWN_PRODUCT_PLUGIN = + new GlobalConfig(CATEGORY, "allow.unknown.product.plugin"); + +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java new file mode 100644 index 00000000000..4e1b78c33d2 --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -0,0 +1,28 @@ +package org.zstack.core.plugin; + +import org.zstack.abstraction.PluginDriver; + +import java.util.List; + +/** + * PluginManager interface for plugin related operations. + *

+ * isFeatureSupported used for plugin capability check. + * getPlugin used for get plugin singleton. + *

+ */ +public interface PluginManager { + String SERVICE_ID = "external.plugin"; + + boolean isFeatureSupported(String pluginUuid, String capability); + + T getPlugin(String pluginUuid); + + List getPluginList(Class pluginClass); + + // check if a sub plugin class with a type exists + boolean isPluginTypeExist(Class pluginClass, String type); + + // get plugin class with type + T getPlugin(Class pluginClass, String type); +} diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java new file mode 100644 index 00000000000..823a3ea91e9 --- /dev/null +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -0,0 +1,490 @@ +package org.zstack.core.plugin; + +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; +import org.reflections.util.FilterBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.abstraction.PluginDriver; +import org.zstack.abstraction.PluginValidator; +import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.Platform; +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.AbstractService; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.external.plugin.*; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.managementnode.ManagementNodeVO; +import org.zstack.header.managementnode.ManagementNodeVO_; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.Message; +import org.zstack.header.message.MessageReply; +import org.zstack.utils.Bash; +import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.path.PathUtil; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import static org.zstack.core.Platform.operr; + +/** + * PluginManagerImpl implementation of PluginManager. + */ +public class PluginManagerImpl extends AbstractService implements PluginManager { + private static final CLogger logger = Utils.getLogger(PluginManagerImpl.class); + + @Autowired + private DatabaseFacade dbf; + @Autowired + private CloudBus bus; + @Autowired + private ThreadFacade thdf; + + private final Set> pluginMetadata = new HashSet<>(); + private final Map pluginInstances = new ConcurrentHashMap<>(); + private final Map, List> + pluginRegisters = new HashMap<>(); + private final Map, PluginValidator> + pluginValidators = new HashMap<>(); + private String fileDirPath = PathUtil.join(CoreGlobalProperty.DATA_DIR, "/plugins/"); + + public String getFileDirPath() { + return fileDirPath; + } + + public void setFileDirPath(String fileDirPath) { + this.fileDirPath = fileDirPath; + } + + private void collectPluginProtocolMetadata() { + ConfigurationBuilder builder = ConfigurationBuilder.build() + .setUrls(ClasspathHelper.forPackage("org.zstack")) + .setScanners(Scanners.SubTypes, Scanners.MethodsAnnotated, + Scanners.FieldsAnnotated, Scanners.TypesAnnotated, + Scanners.MethodsParameter) + .setExpandSuperTypes(false) + .filterInputsBy(new FilterBuilder().includePackage("org.zstack")); + Reflections reflections = new Reflections(builder); + reflections.getSubTypesOf(PluginDriver.class).forEach(clz -> { + if (!clz.getCanonicalName().contains("org.zstack.abstraction") + || !clz.isInterface()) { + return; + } + + if (pluginMetadata.contains(clz)) { + throw new CloudRuntimeException( + String.format("duplicate PluginProtocol[name: %s]", clz)); + } + + pluginMetadata.add(clz); + }); + } + + protected void registerPluginAsSingleton( + Class pluginRegisterClz, + Class pluginDriverClz) { + try { + PluginDriver pluginDriver = pluginRegisterClz + .getConstructor() + .newInstance(); + + if (pluginValidators.containsKey(pluginRegisterClz)) { + pluginValidators.get(pluginRegisterClz).validate(pluginDriver); + } + + // String format all String methods of plugin from pluginRegister to logger.debug + logger.debug(String.format("%s[class: %s, productKey: %s, version: %s," + + " capabilities: %s, description: %s, vendor: %s, url: %s," + + " license: %s]", + pluginInstances.containsKey(pluginDriver.uuid()) ? "reload plugin" : "register plugin", + pluginRegisterClz, + pluginDriver.uuid(), + pluginDriver.version(), + JSONObjectUtil.toJsonString(pluginDriver.features()), + pluginDriver.description(), + pluginDriver.vendor(), + pluginDriver.url(), + pluginDriver.license())); + + verifyPluginProduct(pluginDriver); + + pluginInstances.put(pluginDriver.uuid(), pluginDriver); + pluginRegisters.computeIfAbsent(pluginDriverClz, k -> new ArrayList<>()); + pluginRegisters.get(pluginDriverClz).add(pluginDriver); + + PluginDriverVO vo = dbf.findByUuid(pluginDriver.uuid(), PluginDriverVO.class); + if (vo == null) { + vo = new PluginDriverVO(); + vo.setUuid(pluginDriver.uuid()); + vo.setName(pluginDriver.name()); + vo.setVendor(pluginDriver.vendor()); + vo.setFeatures(JSONObjectUtil.toJsonString(pluginDriver.features())); + vo.setType(pluginDriver.type()); + vo.setDescription(pluginDriver.description()); + vo.setVersion(pluginDriver.version()); + vo.setLicense(pluginDriver.license()); + vo.setOptionTypes(JSONObjectUtil.toJsonString(pluginDriver.optionTypes())); + dbf.persist(vo); + } else { + vo.setName(pluginDriver.name()); + vo.setVendor(pluginDriver.vendor()); + vo.setFeatures(JSONObjectUtil.toJsonString(pluginDriver.features())); + vo.setType(pluginDriver.type()); + vo.setDescription(pluginDriver.description()); + vo.setVersion(pluginDriver.version()); + vo.setLicense(pluginDriver.license()); + vo.setOptionTypes(JSONObjectUtil.toJsonString(pluginDriver.optionTypes())); + dbf.update(vo); + } + } catch (Exception e) { + throw new CloudRuntimeException(e); + } + } + + private void getPluginInterfaceSingletons(Class abstractPluginClz) { + Platform.getReflections() + .getSubTypesOf(abstractPluginClz) + .forEach(pluginDriverClz -> { + if (pluginDriverClz.isInterface()) { + return; + } + + registerPluginAsSingleton(pluginDriverClz, abstractPluginClz); + }); + } + + private void loadPluginsFromMetadata() { + pluginMetadata.forEach(this::getPluginInterfaceSingletons); + + pluginRegisters.forEach((pluginClazz, instanceList) -> { + PluginValidator validator = pluginValidators.get(pluginClazz); + if (validator == null) { + return; + } + + validator.validateAllPlugins(instanceList); + }); + } + + private void verifyPluginProduct(PluginDriver pluginDriver) { + if (!PluginGlobalConfig.ALLOW_UNKNOWN_PRODUCT_PLUGIN.value(Boolean.class) + && pluginDriver.uuid() == null) { + throw new OperationFailureException(operr("unknown product plugin name: %s", + pluginDriver.name())); + } + + if (pluginDriver.name() == null + || pluginDriver.uuid() == null + || pluginDriver.vendor() == null) { + throw new OperationFailureException(operr("plugin[%s] name," + + " productKey and vendor cannot be null", + pluginDriver.getClass())); + } + + doVerification(pluginDriver.name(), pluginDriver.uuid()); + } + + private void doVerification(String productName, String productKey) { + // TODO: verify plugin driver + } + + private void collectPluginValidators(Class validatorClazz) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + PluginValidator pluginValidator = ((Class) validatorClazz).getConstructor().newInstance(); + pluginValidators.put(pluginValidator.pluginClass(), pluginValidator); + } + + @Override + public boolean start() { + if (CoreGlobalProperty.UNIT_TEST_ON) { + return true; + } + new Bash() { + @Override + protected void scripts() { + mkdirs(fileDirPath); + } + }.execute(); + scanAndLoadPlugins(fileDirPath); + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public boolean isFeatureSupported(String pluginProductKey, + String capability) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("check plugin[%s] capability[%s]", + pluginProductKey, capability)); + logger.trace(String.format("plugin features %s", + JSONObjectUtil.toJsonString(pluginInstances + .get(pluginProductKey) + .features()))); + logger.trace(String.format("plugin feature state: %s", + JSONObjectUtil.toJsonString(pluginInstances + .get(pluginProductKey) + .features().get(capability) == Boolean.TRUE))); + } + + if (pluginInstances.get(pluginProductKey) + .features() == null) { + return true; + } + + return pluginInstances.get(pluginProductKey) + .features() + .get(capability) == Boolean.TRUE; + } + + @Override + public T getPlugin(String pluginProductKey) { + if (!pluginInstances.containsKey(pluginProductKey)) { + throw new CloudRuntimeException(String.format("Unsupported plugin %s", + pluginProductKey)); + } + + return (T) pluginInstances.get(pluginProductKey); + } + + @Override + public List getPluginList(Class pluginClass) { + return (List) pluginRegisters.get(pluginClass); + } + + @Override + public boolean isPluginTypeExist(Class pluginClass, String type) { + return pluginRegisters.get(pluginClass) + .stream() + .anyMatch(plugin -> plugin.type().equals(type)); + } + + @Override + public T getPlugin(Class pluginClass, String type) { + if (pluginRegisters.get(pluginClass) + .stream() + .filter(plugin -> plugin.type().equals(type)) + .count() > 1) { + throw new CloudRuntimeException(String.format("multi plugin with same type %s", type)); + } + + return (T) pluginRegisters.get(pluginClass) + .stream() + .filter(plugin -> plugin.type().equals(type)) + .findFirst() + .orElse(null); + } + + @Override + public void handleMessage(Message msg) { + if (msg instanceof APIRefreshPluginDriversMsg) { + handle((APIRefreshPluginDriversMsg) msg); + } else if (msg instanceof APIDeletePluginDriversMsg) { + handle((APIDeletePluginDriversMsg) msg); + } else { + handleLocalMessage(msg); + } + } + + private void handleLocalMessage(Message msg) { + if (msg instanceof RefreshPluginDriversMsg) { + handle((RefreshPluginDriversMsg) msg); + } else if (msg instanceof DeletePluginDriversMsg) { + handle((DeletePluginDriversMsg) msg); + } else { + bus.dealWithUnknownMessage(msg); + } + } + + protected List getJarFiles(String dirPath) { + File dir = new File(dirPath); + List jarFiles = new ArrayList<>(); + + if (!dir.exists() || !dir.isDirectory()) { + return jarFiles; + } + + File[] files = dir.listFiles((file) -> file.isFile() && file.getName().endsWith(".jar")); + if (files != null) { + for (File file : files) { + jarFiles.add(file); + } + } + return jarFiles; + } + + protected void loadPluginsFromJar(File jarFile) { + URL jarUrl = null; + try { + jarUrl = jarFile.toURI().toURL(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + try (URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, getClass().getClassLoader())) { + try (JarFile jar = new JarFile(jarFile)) { + Enumeration entries = jar.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String entryName = entry.getName(); + if (!entryName.endsWith(".class")) { + continue; + } + + if (entryName.matches(".*\\$\\d+\\.class$")) { + // eg: org.zstack.CipherOnCloudCryptoPlugin$1.class + continue; + } + + if (entryName.contains("Test")) { + continue; + } + + String className = entryName.replace('/', '.').substring(0, entryName.length() - 6); + Class tempClazz = classLoader.loadClass(className); + if (className.contains("Validator")) { + collectPluginValidators(tempClazz); + continue; + } + + // Skip anonymous classes or inner classes (which are named with $) + // Anonymous classes or inner classes are typically not needed for plugin registration + if (entryName.contains("$")) { + continue; + } + + registerPluginAsSingleton((Class) tempClazz, (Class) tempClazz.getInterfaces()[0]); + } + } + } catch (Throwable t) { + logger.error(String.format("Error occurred while scanning and loading plugins from: %s", jarFile.getAbsolutePath()), t); + } + } + + protected void scanAndLoadPlugins(String directoryPath) { + List jarFiles = getJarFiles(directoryPath); + for (File jarFile : jarFiles) { + loadPluginsFromJar(jarFile); + } + } + + private void handle(RefreshPluginDriversMsg msg) { + RefreshPluginDriversReply reply = new RefreshPluginDriversReply(); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return getName(); + } + + @Override + public void run(SyncTaskChain chain) { + scanAndLoadPlugins(fileDirPath); + bus.reply(msg, reply); + chain.next(); + } + + @Override + public String getName() { + return String.format("refresh-%s-plugin-drivers", fileDirPath); + } + }); + } + + private void handle(DeletePluginDriversMsg msg) { + DeletePluginDriversReply reply = new DeletePluginDriversReply(); + pluginInstances.remove(msg.getUuid()); + if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { + SQL.New(PluginDriverVO.class).eq(PluginDriverVO_.uuid, msg.getUuid()).set(PluginDriverVO_.deleted, true).update(); + } else { + SQL.New(PluginDriverVO.class).eq(PluginDriverVO_.uuid, msg.getUuid()).hardDelete(); + } + bus.reply(msg, reply); + } + + private void handle(APIDeletePluginDriversMsg msg) { + APIDeletePluginDriversEvent event = new APIDeletePluginDriversEvent(msg.getId()); + new While<>(Q.New(ManagementNodeVO.class).select(ManagementNodeVO_.uuid).listValues()).step((mnUuid, com) -> { + DeletePluginDriversMsg rmsg = new DeletePluginDriversMsg(); + rmsg.setUuid(msg.getUuid()); + rmsg.setDeletionMode(msg.getDeletionMode()); + bus.makeServiceIdByManagementNodeId(rmsg, SERVICE_ID, (String) mnUuid); + bus.send(rmsg, new CloudBusCallBack(com) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + com.addError(reply.getError()); + com.allDone(); + return; + } + + com.done(); + } + }); + }, 2).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + event.setError(errorCodeList.getCauses().get(0)); + } + + bus.publish(event); + } + }); + } + + private void handle(APIRefreshPluginDriversMsg msg) { + APIRefreshPluginDriversEvent event = new APIRefreshPluginDriversEvent(msg.getId()); + new While<>(Q.New(ManagementNodeVO.class).select(ManagementNodeVO_.uuid).listValues()).step((mnUuid, com) -> { + RefreshPluginDriversMsg rmsg = new RefreshPluginDriversMsg(); + bus.makeServiceIdByManagementNodeId(rmsg, SERVICE_ID, (String) mnUuid); + bus.send(rmsg, new CloudBusCallBack(com) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + com.addError(reply.getError()); + com.allDone(); + return; + } + + com.done(); + } + }); + }, 2).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + event.setError(errorCodeList.getCauses().get(0)); + } + + bus.publish(event); + } + }); + } + + @Override + public String getId() { + return bus.makeLocalServiceId(SERVICE_ID); + } +} diff --git a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java index e715e2ee41f..4f2157deca2 100755 --- a/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/rest/RESTFacadeImpl.java @@ -300,7 +300,8 @@ public void asyncJsonGet(final String url, final String body, Map headers, HttpMethod method, final AsyncRESTCallback callback, final TimeUnit unit, final long timeout) { + @Override + public void asyncJson(final String url, final String body, Map headers, HttpMethod method, final AsyncRESTCallback callback, final TimeUnit unit, final long timeout) { synchronized (interceptors) { for (BeforeAsyncJsonPostInterceptor ic : interceptors) { ic.beforeAsyncJsonPost(url, body, unit, timeout); @@ -519,6 +520,110 @@ public T syncJsonPost(String url, Object body, Class returnClass, TimeUni return syncJsonPost(url, body == null ? null : JSONObjectUtil.toJsonString(body),null, returnClass, unit, timeout); } + public RestHttp http(Class returnClass) { + RestHttp http = new RestHttp<>(returnClass) + .withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE); + + if (CoreGlobalProperty.UNIT_TEST_ON) { + http.retryIfException(ResourceAccessException.class); + } else { + http.retryIfException(ResourceAccessException.class, HttpStatusCodeException.class); + } + + return http + .withHandler(this::syncJson) + .withErrorCodeBuilder((e, http2) -> { + if (e instanceof HttpStatusCodeException) { + final HttpStatusCodeException exception = (HttpStatusCodeException) e; + return operr("failed to %s to %s, status code: %s, response body: %s", + http2.getMethod().toString().toLowerCase(), + http2.getPath(), + exception.getStatusCode(), exception.getResponseBodyAsString()); + } else if (e instanceof ResourceAccessException) { + return operr("failed to %s to %s, IO Error: %s", + http2.getMethod().toString().toLowerCase(), + http2.getPath(), + e.getMessage()); + } + return null; + }); + } + + protected ResponseEntity syncJson(RestHttp http) { + String body = http.getBody() == null ? "" : http.getBody(); + + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.setAll(http.getHeaders()); + requestHeaders.setContentLength(body.length()); + HttpEntity req = new HttpEntity<>(body, requestHeaders); + ResponseEntity rsp = syncRawJson(req, http); + + if (logger.isTraceEnabled()) { + logger.trace(String.format("[http response(url: %s)] %s", http.getPath(), rsp.getBody())); + } + return rsp; + } + + public ResponseEntity syncRawJson(HttpEntity req, RestHttp http) { + if (logger.isTraceEnabled()) { + logger.trace(String.format("json %s[%s], %s", http.getMethod().toString().toLowerCase(), http.getPath(), req)); + } + + ResponseEntity rsp; + final String url = http.getPath(); + final HttpMethod method = http.getMethod(); + + try { + if (http.isRetry()) { + rsp = new Retry>() { + { + retryConditions.addAll(http.getRetryIfExceptionMatched()); + times = http.getRetryTimes(); + interval = http.getRetryIntervalInSeconds(); + } + + @Override + protected ResponseEntity call() { + if (http.isTimeoutEnabled()) { + return template.exchange(url, method, req, String.class); + } else { + final long millis = http.getTimeoutInMillis(); + return template.exchange(url, method, req, String.class, Platform.getUuid(), millis, millis); + } + } + }.run(); + } else { + rsp = (http.isTimeoutEnabled()) ? + template.exchange(url, method, req, String.class, + Platform.getUuid(), http.getTimeoutInMillis(), http.getTimeoutInMillis()) : + template.exchange(url, method, req, String.class); + } + } catch (Exception e) { + if (http.getErrorCodeBuilder() != null) { + ErrorCode errorCode = http.getErrorCodeBuilder().apply(e, http); + if (errorCode != null) { + throw new OperationFailureException(errorCode); + } + } + throw e; + } + + boolean valid = false; + if (method == HttpMethod.DELETE && rsp.getStatusCode() == org.springframework.http.HttpStatus.NO_CONTENT) { + valid = true; + } else if (method == HttpMethod.POST && rsp.getStatusCode() == org.springframework.http.HttpStatus.CREATED) { + valid = true; + } else if (rsp.getStatusCode() == org.springframework.http.HttpStatus.OK || rsp.getStatusCode() == org.springframework.http.HttpStatus.ACCEPTED) { + valid = true; + } + + if (!valid) { + throw new OperationFailureException(operr("failed to %s to %s, status code: %s, response body: %s", method.toString().toLowerCase(), url, rsp.getStatusCode(), rsp.getBody())); + } + + return rsp; + } + @Override public T syncJsonPost(String url, String body, Class returnClass) { return syncJsonPost(url, body, null, returnClass, null, -1); @@ -631,7 +736,9 @@ protected ResponseEntity call() { boolean valid = false; if (method == HttpMethod.DELETE && rsp.getStatusCode() == org.springframework.http.HttpStatus.NO_CONTENT) { valid = true; - } else if (method == HttpMethod.POST && rsp.getStatusCode() == org.springframework.http.HttpStatus.CREATED) { + } else if (method == HttpMethod.POST && + (rsp.getStatusCode() == org.springframework.http.HttpStatus.CREATED || + rsp.getStatusCode() == org.springframework.http.HttpStatus.NO_CONTENT)) { valid = true; } else if (rsp.getStatusCode() == org.springframework.http.HttpStatus.OK || rsp.getStatusCode() == org.springframework.http.HttpStatus.ACCEPTED) { valid = true; diff --git a/core/src/main/java/org/zstack/core/retry/Retry.java b/core/src/main/java/org/zstack/core/retry/Retry.java index 27a12d9d91a..440027b0d6a 100755 --- a/core/src/main/java/org/zstack/core/retry/Retry.java +++ b/core/src/main/java/org/zstack/core/retry/Retry.java @@ -1,5 +1,6 @@ package org.zstack.core.retry; +import org.zstack.header.Confirm; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; @@ -10,6 +11,8 @@ import static org.zstack.core.Platform.i18n; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Function; @@ -40,6 +43,7 @@ public RetryException(String message, Throwable cause, boolean enableSuppression protected int times, count = 5; protected int interval = 1; + protected final List> retryConditions = new ArrayList<>(); private static final CLogger logger = Utils.getLogger(Retry.class); diff --git a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java index 1601c47a73d..7b608783816 100755 --- a/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java +++ b/core/src/main/java/org/zstack/core/thread/DispatchQueueImpl.java @@ -8,7 +8,6 @@ import org.zstack.core.debug.DebugManager; import org.zstack.core.debug.DebugSignalHandler; import org.zstack.header.Constants; -import org.zstack.header.core.Completion; import org.zstack.header.core.ExceptionSafe; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.progress.ChainInfo; @@ -107,47 +106,33 @@ public void handleDebugSignal() { public void beforeCleanQueuedumpThread(String signatureName) { String title = "\n================= Before Clean Task Queue Dump ================"; - dumpsignatureNameThread(signatureName,title); + dumpSignatureNameThread(signatureName,title); } public void afterCleanQueuedumpThread(String signatureName) { String title = "\n================= After Clean Task Queue Dump ================"; - dumpsignatureNameThread(signatureName,title); + dumpSignatureNameThread(signatureName,title); } - public void dumpsignatureNameThread(String signatureName,String title) { + public void dumpSignatureNameThread(String signatureName, String title) { StringBuilder sb = new StringBuilder(); sb.append(title); sb.append("\nASYNC TASK QUEUE DUMP:"); sb.append(String.format("\nTASK QUEUE NUMBER: %s\n", chainTasks.size())); List asyncTasks = new ArrayList<>(); - long now = System.currentTimeMillis(); - synchronized (chainTasks) { - ChainTaskQueueWrapper w = chainTasks.get(signatureName); - if (w == null) { - sb.append(String.format("\n===== NO QUEUE SYNC SIGNATURE: %s =====", signatureName)); - sb.append(StringUtils.join(asyncTasks, "\n")); - sb.append("\n================= END TASK QUEUE DUMP ==================\n"); - _threadFacade.printThreadsAndTasks(); - logger.debug(sb.toString()); - return; - } - StringBuilder tb = new StringBuilder(String.format("\nQUEUE SYNC SIGNATURE: %s", signatureName)); - tb.append(String.format("\nRUNNING TASK NUMBER: %s", w.runningQueue.size())); - tb.append(String.format("\nPENDING TASK NUMBER: %s", w.pendingQueue.size())); - tb.append(String.format("\nASYNC LEVEL: %s", w.maxThreadNum)); - int index = 0; - for (Object obj : w.runningQueue) { - ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); - } - for (Object obj : w.pendingQueue) { - ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); - } - asyncTasks.add(tb.toString()); + ChainTaskQueueWrapper w = chainTasks.get(signatureName); + if (w == null) { + sb.append(String.format("\n===== NO QUEUE SYNC SIGNATURE: %s =====", signatureName)); + sb.append(StringUtils.join(asyncTasks, "\n")); + sb.append("\n================= END TASK QUEUE DUMP ==================\n"); + _threadFacade.printThreadsAndTasks(); + logger.debug(sb.toString()); + return; } + StringBuilder tb = new StringBuilder(String.format("\nQUEUE SYNC SIGNATURE: %s", signatureName)); + tb.append(w.getTaskQueueInfo()); + asyncTasks.add(tb.toString()); sb.append(StringUtils.join(asyncTasks, "\n")); sb.append("\n================= END TASK QUEUE DUMP ==================\n"); @@ -157,26 +142,12 @@ public void dumpsignatureNameThread(String signatureName,String title) { @Override public ChainInfo getChainTaskInfo(String signature) { - long now = System.currentTimeMillis(); - synchronized (chainTasks) { - ChainInfo info = new ChainInfo(); - ChainTaskQueueWrapper w = chainTasks.get(signature); - if (w == null) { - return info; - } - - int index = 0; - for (Object obj : w.runningQueue) { - ChainFuture cf = (ChainFuture) obj; - info.addRunningTask(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); - } - - for (Object obj : w.pendingQueue) { - ChainFuture cf = (ChainFuture) obj; - info.addPendingTask(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); - } - return info; + ChainTaskQueueWrapper w = chainTasks.get(signature); + if (w == null) { + return new ChainInfo(); } + + return w.getChainInfo(); } @Override @@ -415,7 +386,7 @@ void startThreadIfNeeded() { resetPendingQueueThreshold(); counter.incrementAndGet(); - _threadFacade.submitSyncPool(new Task() { + _threadFacade.submitTargetPool(new Task() { @Override public String getName() { return syncSignature; @@ -446,7 +417,7 @@ public Void call() { run(); return null; } - }); + }, syncSignature); } @Override @@ -782,7 +753,7 @@ protected String getTaskQueueInfo() { } private class ChainTaskQueueWrapper extends AbstractTaskQueueWrapper { - LinkedList pendingQueue = new LinkedList(); + final LinkedList pendingQueue = new LinkedList(); final Map subPendingMap = new ConcurrentHashMap<>(); final LinkedList runningQueue = new LinkedList(); AtomicInteger counter = new AtomicInteger(0); @@ -958,28 +929,31 @@ public Void call() { @Override protected String getTaskQueueInfo() { + return getChainInfo().toString(); + } + + protected ChainInfo getChainInfo() { long now = zTimer.getCurrentTimeMillis(); - StringBuilder tb = new StringBuilder(); - tb.append(String.format("\nRUNNING TASK NUMBER: %s", runningQueue.size())); - tb.append(String.format("\nPENDING TASK NUMBER: %s", pendingQueue.size())); - tb.append(String.format("\nASYNC LEVEL: %s", maxThreadNum)); + + ChainInfo info = new ChainInfo(); + info.setMaxThreadNum(maxThreadNum); int index = 0; synchronized (runningQueue) { for (Object obj : runningQueue) { ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); + info.addRunningTask(TaskInfoBuilder.buildRunningTaskInfo(cf, now, index++)); } } - synchronized (pendingQueue) { + // pendingQueue is synchronized with chainTasks, do not synchronize itself + synchronized (chainTasks) { for (Object obj : pendingQueue) { ChainFuture cf = (ChainFuture) obj; - tb.append(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); + info.addPendingTask(TaskInfoBuilder.buildPendingTaskInfo(cf, now, index++)); } } - - return tb.toString(); + return info; } } diff --git a/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java b/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java index aa4a1717a68..cb3c1040d88 100644 --- a/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java +++ b/core/src/main/java/org/zstack/core/thread/TaskInfoBuilder.java @@ -21,7 +21,7 @@ public class TaskInfoBuilder { static RunningTaskInfo buildRunningTaskInfo(AbstractTimeStatisticFuture abstractTimeStatisticFuture, long now, int index) { RunningTaskInfo info = new RunningTaskInfo(); - loadTaskInfo(info, abstractTimeStatisticFuture, index); + loadTaskInfo(info, abstractTimeStatisticFuture.getTask(), index); info.setExecutionTime(TimeUnit.MILLISECONDS.toSeconds(now - abstractTimeStatisticFuture.getStartExecutionTimeInMills())); info.setPendingTime(TimeUnit.MILLISECONDS.toSeconds(now - abstractTimeStatisticFuture.getStartPendingTimeInMills()) - info.getExecutionTime()); return info; @@ -29,23 +29,23 @@ static RunningTaskInfo buildRunningTaskInfo(AbstractTimeStatisticFuture abstract static PendingTaskInfo buildPendingTaskInfo(AbstractTimeStatisticFuture abstractTimeStatisticFuture, long now, int index) { PendingTaskInfo info = new PendingTaskInfo(); - loadTaskInfo(info, abstractTimeStatisticFuture, index); + loadTaskInfo(info, abstractTimeStatisticFuture.getTask(), index); info.setPendingTime(TimeUnit.MILLISECONDS.toSeconds(now - abstractTimeStatisticFuture.getStartPendingTimeInMills())); return info; } - static private void loadTaskInfo(TaskInfo info, AbstractTimeStatisticFuture cf, int index) { - info.setName(cf.getTask().getName()); - info.setClassName(cf.getTask().getClass().getSimpleName()); + static private void loadTaskInfo(TaskInfo info, AbstractChainTask task, int index) { + info.setName(task.getName()); + info.setClassName(task.getClass().getSimpleName()); info.setIndex(index); - Map tc = cf.getTask().getThreadContext(); + Map tc = task.getThreadContext(); if (tc != null) { info.setApiName(tc.get(Constants.THREAD_CONTEXT_TASK_NAME)); info.setApiId(tc.get(Constants.THREAD_CONTEXT_API)); } info.setContextList(new ArrayList<>()); - for (AsyncBackup backup : cf.getTask().getBackups()) { + for (AsyncBackup backup : task.getBackups()) { if (backup instanceof Message) { info.getContextList().add(JSONObjectUtil.toJsonString(backup)); } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacade.java b/core/src/main/java/org/zstack/core/thread/ThreadFacade.java index 76663e4b2de..9eca11fa0f4 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacade.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacade.java @@ -13,6 +13,8 @@ public interface ThreadFacade extends Component { Future submitSyncPool(Task task); + Future submitTargetPool(Task task, String signature); + Future syncSubmit(SyncTask task); Future chainSubmit(ChainTask task); @@ -46,5 +48,6 @@ public interface ThreadFacade extends Component { Runnable submitTimerTask(TimerTask task, TimeUnit unit, long delay); int getSyncThreadNum(int totalThreadNum); + void printThreadsAndTasks(); } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java index 2d591b36888..04a81cc84c8 100755 --- a/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java +++ b/core/src/main/java/org/zstack/core/thread/ThreadFacadeImpl.java @@ -1,10 +1,12 @@ package org.zstack.core.thread; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.jmx.JmxFacade; import org.zstack.header.core.progress.ChainInfo; import org.zstack.header.core.progress.SingleFlightChainInfo; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.logging.CLoggerImpl; @@ -12,6 +14,7 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; public class ThreadFacadeImpl implements ThreadFacade, ThreadFactory, RejectedExecutionHandler, ThreadFacadeMXBean { private static final CLogger _logger = CLoggerImpl.getLogger(ThreadFacadeImpl.class); @@ -21,11 +24,14 @@ public class ThreadFacadeImpl implements ThreadFacade, ThreadFactory, RejectedEx private static final AtomicInteger seqNum = new AtomicInteger(0); private ScheduledThreadPoolExecutorExt _pool; private ScheduledThreadPoolExecutorExt _syncpool; // for sync tasks + private ConcurrentHashMap pools = new ConcurrentHashMap<>(); private DispatchQueue dpq; private final TimerPool timerPool = new TimerPool(5); @Autowired private JmxFacade jmxf; + @Autowired + private PluginRegistry pluginRegistry; private static class TimerWrapper extends Timer { private int cancelledTimerTaskCount = 0; @@ -141,13 +147,23 @@ public void init() { jmxf.registerBean("ThreadFacade", this); } + private void initThreadPool(ThreadPool pool) { + ScheduledThreadPoolExecutorExt threadExt = new ScheduledThreadPoolExecutorExt(pool.getThreadNum(), this, this); + pools.put(pool.getSyncSignature(), threadExt); + } + public void destroy() { _pool.shutdownNow(); _syncpool.shutdown(); + pools.forEach((queueName, pool) -> { + _logger.debug(String.format("shutdown thread pool: %s", queueName)); + pool.shutdown(); + }); } @Override public Future submit(Task task) { + _logger.trace(String.format("submit task: %s", task.getName())); return _pool.submit(new Worker(task)); } @@ -155,6 +171,12 @@ public Future submitSyncPool(Task task) { return _syncpool.submit(new Worker(task)); } + @Override + public Future submitTargetPool(Task task, String signature) { + ScheduledThreadPoolExecutorExt executorExt = pools.getOrDefault(signature, _syncpool); + return executorExt.submit(new Worker<>(task)); + } + @Override public Thread newThread(@Nonnull Runnable arg0) { return new Thread(arg0, "zs-thread-" + seqNum.getAndIncrement()); @@ -310,13 +332,63 @@ public void run() { @Override public boolean start() { + int totalThreadNum = ThreadGlobalProperty.MAX_THREAD_NUM; + + List poolList = new ArrayList<>(); + for (ThreadPoolRegisterExtensionPoint ext : pluginRegistry.getExtensionList(ThreadPoolRegisterExtensionPoint.class)) { + List threadPools = ext.registerThreadPool(); + if (CollectionUtils.isEmpty(threadPools)) { + throw new CloudRuntimeException("Empty thread pool registration is not supported"); + } + + List noSignaturePools = threadPools.stream().filter(pool -> pool.getSyncSignature() == null).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(noSignaturePools)) { + throw new CloudRuntimeException("Thread pool registration do not allow empty syncSignature"); + } + + List distinctPoolNames = threadPools.stream().map(ThreadPool::getSyncSignature).distinct().collect(Collectors.toList()); + if (distinctPoolNames.size() < threadPools.size()) { + throw new CloudRuntimeException(String.format("Duplicate thread pool name detected %s", threadPools.stream().map(ThreadPool::getSyncSignature).collect(Collectors.toList()))); + } + + List nameDuplicatePool = poolList.stream().filter(pool -> threadPools.stream().anyMatch(newPool -> pool.getSyncSignature().equals(newPool.getSyncSignature()))).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(nameDuplicatePool)) { + throw new CloudRuntimeException(String.format("Duplicate thread pool name with existing pool %s", nameDuplicatePool.stream().map(ThreadPool::getSyncSignature).collect(Collectors.toList()))); + } + poolList.addAll(threadPools); + } + + _logger.debug(String.format("Load separate thread pool: %d", poolList.size())); + int separatedThreadNum = poolList.stream().mapToInt(ThreadPool::getThreadNum).sum(); + int internalThreadNum = totalThreadNum - separatedThreadNum; + if (internalThreadNum < 10) { + _logger.warn(String.format("ThreadFacade.maxThreadNum is configured to %s." + + " Remaining thread number for internal pools is %d, which is too" + + " small for running zstack. Change it to 10", + internalThreadNum, + ThreadGlobalProperty.MAX_THREAD_NUM)); + internalThreadNum = 10; + totalThreadNum = separatedThreadNum + internalThreadNum; + } + + _logger.debug(String.format("Total thread num: %s, registered thread num %s," + + " internal thread num %s", totalThreadNum, + separatedThreadNum, + internalThreadNum)); + poolList.forEach(this::initThreadPool); + return true; } @Override public boolean stop() { _pool.shutdown(); + _syncpool.shutdown(); timerPool.stop(); + pools.forEach((queueName, pool) -> { + _logger.debug(String.format("shutdown thread pool: %s", queueName)); + pool.shutdown(); + }); return true; } diff --git a/core/src/main/java/org/zstack/core/thread/ThreadPool.java b/core/src/main/java/org/zstack/core/thread/ThreadPool.java new file mode 100644 index 00000000000..f68e86f92e0 --- /dev/null +++ b/core/src/main/java/org/zstack/core/thread/ThreadPool.java @@ -0,0 +1,22 @@ +package org.zstack.core.thread; + +public class ThreadPool { + private String syncSignature; + private int threadNum; + + public String getSyncSignature() { + return syncSignature; + } + + public void setSyncSignature(String syncSignature) { + this.syncSignature = syncSignature; + } + + public int getThreadNum() { + return threadNum; + } + + public void setThreadNum(int threadNum) { + this.threadNum = threadNum; + } +} diff --git a/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java b/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java new file mode 100644 index 00000000000..88ccf644aa8 --- /dev/null +++ b/core/src/main/java/org/zstack/core/thread/ThreadPoolRegisterExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.core.thread; + +import java.util.List; + +public interface ThreadPoolRegisterExtensionPoint { + List registerThreadPool(); +} diff --git a/core/src/main/java/org/zstack/core/tracker/BatchTracker.java b/core/src/main/java/org/zstack/core/tracker/BatchTracker.java new file mode 100644 index 00000000000..51242251514 --- /dev/null +++ b/core/src/main/java/org/zstack/core/tracker/BatchTracker.java @@ -0,0 +1,171 @@ +package org.zstack.core.tracker; + +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.thread.PeriodicTask; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.Component; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; + +/** + */ +public abstract class BatchTracker implements Component { + public abstract String getResourceName(); + + public abstract long getTaskInterval(); + public abstract void executeTask(List resourceUuids); + public abstract void rescan(); + + private final static CLogger logger = Utils.getLogger(PingTracker.class); + + private final List resourceUuids = Collections.synchronizedList(new ArrayList<>()); + private Future trackerThread = null; + + @Autowired + protected CloudBus bus; + @Autowired + protected ThreadFacade thdf; + + private class Tracker implements PeriodicTask { + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.SECONDS; + } + + @Override + public long getInterval() { + return getTaskInterval(); + } + + @Override + public String getName() { + return String.format("pingTracker-for-%s-managementNode-%s", getResourceName(), Platform.getManagementServerId()); + } + + @Override + public void run() { + try { + executionHook(); + synchronized (resourceUuids) { + executeTask(resourceUuids); + } + } catch (Throwable t) { + logger.warn("unhandled throwable", t); + } + } + } + + protected void executionHook() { + + } + + protected void trackHook(String resourceUuid) { + } + + protected void untrackHook(String resourceUuid) { + } + + protected void startHook() { + } + + protected void taskIntervalChanged() { + startTracker(); + } + + public void track(String resUuid) { + synchronized (resourceUuids) { + if (!resourceUuids.contains(resUuid)) { + resourceUuids.add(resUuid); + trackHook(resUuid); + logger.debug(String.format("start tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + } + + public void untrackIf(Predicate predicate) { + synchronized (resourceUuids) { + resourceUuids.removeIf(predicate); + } + } + + public void untrackAll() { + synchronized (resourceUuids) { + resourceUuids.clear(); + logger.debug(String.format("untrack all %s", getResourceName())); + } + } + + public void untrack(String resUuid) { + synchronized (resourceUuids) { + resourceUuids.remove(resUuid); + untrackHook(resUuid); + logger.debug(String.format("stop tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + + public void track(Collection resUuids) { + synchronized (resourceUuids) { + for (String resUuid : resUuids) { + if (!resourceUuids.contains(resUuid)) { + resourceUuids.add(resUuid); + trackHook(resUuid); + logger.debug(String.format("start tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + } + } + + public void untrack(Collection resUuids) { + synchronized (resourceUuids) { + for (String resUuid : resUuids) { + resourceUuids.remove(resUuid); + untrackHook(resUuid); + logger.debug(String.format("stop tracking %s[uuid:%s]", getResourceName(), resUuid)); + } + } + } + + protected synchronized void startTracker() { + if (trackerThread != null) { + trackerThread.cancel(true); + } + + if (CoreGlobalProperty.UNIT_TEST_ON) { + trackerThread = thdf.submitPeriodicTask(new Tracker(), getTaskInterval()); + } else { + trackerThread = thdf.submitPeriodicTask(new Tracker(), (long) getTaskInterval() + new Random().nextInt(30)); + } + } + + @Override + public boolean start() { + startTracker(); + startHook(); + return true; + } + + @Override + public boolean stop() { + if (trackerThread != null) { + trackerThread.cancel(true); + } + + return true; + } + + public List getResourceUuids() { + return resourceUuids; + } +} diff --git a/core/src/main/java/org/zstack/core/tacker/PingTracker.java b/core/src/main/java/org/zstack/core/tracker/PingTracker.java similarity index 97% rename from core/src/main/java/org/zstack/core/tacker/PingTracker.java rename to core/src/main/java/org/zstack/core/tracker/PingTracker.java index e8dac988066..ffb0ec22268 100755 --- a/core/src/main/java/org/zstack/core/tacker/PingTracker.java +++ b/core/src/main/java/org/zstack/core/tracker/PingTracker.java @@ -1,4 +1,4 @@ -package org.zstack.core.tacker; +package org.zstack.core.tracker; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.CoreGlobalProperty; @@ -67,6 +67,10 @@ public void run() { } NeedReplyMessage msg = getPingMessage(resUuid); + if (msg == null) { + continue; + } + msgs.add(msg); resourceInTracking.add(resUuid); tmp.put(msg, resUuid); diff --git a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java index 01b22920781..eb6c1a76d00 100644 --- a/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java +++ b/core/src/main/java/org/zstack/core/trash/StorageRecycleImpl.java @@ -15,7 +15,7 @@ import org.zstack.core.thread.PeriodicTask; import org.zstack.core.thread.ThreadFacade; import org.zstack.header.Component; -import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.trash.InstallPathRecycleInventory; import org.zstack.header.core.trash.InstallPathRecycleVO; import org.zstack.header.core.trash.InstallPathRecycleVO_; @@ -43,6 +43,7 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import static org.zstack.core.Platform.inerr; @@ -87,6 +88,8 @@ private InstallPathRecycleInventory createRecycleFromVolume(TrashType type, bool } vo = dbf.persistAndRefresh(vo); + logger.debug(String.format("create trash for volume[uuid:%s, installPath:%s] on primary storage[uuid:%s], trashId: %s, type: %s", + vol.getUuid(), vol.getInstallPath(), vol.getPrimaryStorageUuid(), vo.getTrashId(), type)); return InstallPathRecycleInventory.valueOf(vo); } @@ -103,6 +106,8 @@ private InstallPathRecycleInventory createRecycleFromImage(TrashType type, boole vo.setSize(image.getSize()); vo = dbf.persistAndRefresh(vo); + logger.debug(String.format("create trash for image[uuid:%s, installPath:%s] on backup storage[uuid:%s], trashId: %s, type: %s", + image.getUuid(), image.getUrl(), image.getDescription(), vo.getTrashId(), type)); return InstallPathRecycleInventory.valueOf(vo); } @@ -123,6 +128,8 @@ private InstallPathRecycleInventory createRecycleFromVolumeSnapshot(TrashType ty } vo = dbf.persistAndRefresh(vo); + logger.debug(String.format("create trash for volume snapshot[uuid:%s, installPath:%s] on primary storage[uuid:%s], trashId: %s, type: %s", + snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getPrimaryStorageUuid(), vo.getTrashId(), type)); return InstallPathRecycleInventory.valueOf(vo); } @@ -179,7 +186,7 @@ private String checkImageCache(String installPath) { return null; } - private String checkCephVolumeSnapshot(String installPath) { + private String checkInnerVolumeSnapshot(String installPath) { List uuids = Q.New(VolumeSnapshotVO.class).like(VolumeSnapshotVO_.primaryStorageInstallPath, installPath + "@%").select(VolumeSnapshotVO_.uuid).listValues(); if (uuids.size() > 0) { return String.format("%s is still in using by volumesnapshot %s, cannot remove it from trash before delete them", installPath, uuids); @@ -192,7 +199,7 @@ private String checkVolumeSnapshot(String installPath) { if (uuids.size() > 0) { return String.format("%s is still in using by volumesnapshot %s, cannot remove it from trash before delete them", installPath, uuids); } - return checkCephVolumeSnapshot(installPath); + return checkInnerVolumeSnapshot(installPath); } private String checkImage(String installPath) { @@ -213,7 +220,7 @@ protected String makeSureInstallPathNotUsedByVolume(String installPath) { if (details != null) { return details; } - details = checkCephVolumeSnapshot(installPath); + details = checkInnerVolumeSnapshot(installPath); if (details != null) { return details; } @@ -295,9 +302,10 @@ public Long getTrashId(String storageUuid, String installPath) { public void removeFromDb(Long trashId) { DebugUtils.Assert(trashId != null, "trashId is not allowed null here"); UpdateQuery.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.trashId, trashId).delete(); + logger.debug(String.format("remove trash[trashId:%s] from db", trashId)); } - private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid, Completion completion) { + private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid, NoErrorCompletion completion) { List vos = Q.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.storageUuid, primaryStorageUuid).list(); List trashIds = new ArrayList<>(); for (InstallPathRecycleVO vo: vos) { @@ -309,9 +317,9 @@ private void deleteTrashForVolume(String resourceUuid, String primaryStorageUuid deleteTrashForVolume(trashIds.iterator(), primaryStorageUuid, completion); } - private void deleteTrashForVolume(final Iterator trashIds, String primaryStorageUuid, Completion completion) { + private void deleteTrashForVolume(final Iterator trashIds, String primaryStorageUuid, NoErrorCompletion completion) { if (!trashIds.hasNext()) { - completion.success(); + completion.done(); return; } Long trashId = trashIds.next(); @@ -333,15 +341,10 @@ public void run(MessageReply reply) { } @Override - public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion) { + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { deleteTrashForVolume(snapshot.getUuid(), snapshot.getPrimaryStorageUuid(), completion); } - @Override - public void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot) { - - } - @Override public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots) { } @@ -413,14 +416,11 @@ public void run() { @Override public List findTrashInstallPath(String installPath, String storageUuid) { - List trashInstallPath = new ArrayList<>(); - List vos = Q.New(InstallPathRecycleVO.class).eq(InstallPathRecycleVO_.storageUuid, storageUuid).list(); - for (InstallPathRecycleVO vo: vos) { - if (vo.getInstallPath().startsWith(installPath)) { - trashInstallPath.add(vo.getInstallPath().substring(installPath.length())); - } - } - return trashInstallPath; + List absPaths = Q.New(InstallPathRecycleVO.class).select(InstallPathRecycleVO_.installPath) + .eq(InstallPathRecycleVO_.storageUuid, storageUuid) + .like(InstallPathRecycleVO_.installPath, String.format("%s%%", installPath)) + .listValues(); + return absPaths.stream().map(it -> it.substring(installPath.length())).collect(Collectors.toList()); } @Override @@ -432,7 +432,7 @@ public boolean stop() { public void volumePreExpunge(VolumeInventory volume) {} @Override - public void volumeBeforeExpunge(VolumeInventory volume, Completion completion) { + public void volumeBeforeExpunge(VolumeInventory volume, NoErrorCompletion completion) { deleteTrashForVolume(volume.getUuid(), volume.getPrimaryStorageUuid(), completion); } diff --git a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java index d7daaadaafe..160b32b7864 100644 --- a/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java +++ b/core/src/main/java/org/zstack/core/upgrade/UpgradeChecker.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.ThreadContext; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.EventFacade; @@ -229,12 +230,21 @@ public ErrorCode checkAgentHttpParamChanges(String agentUuid, String commandName commandObj = cmd; } + logger.debug("grayscale compare agentVersionVO " + JSONObjectUtil.toJsonString(agentVersionVO)); for (Map fields : relatedFieldsVersionMap) { // check if current command has unexpected versions + logger.debug("grayscale compare fields " + JSONObjectUtil.toJsonString(fields)); VersionComparator currentVersion = new VersionComparator(agentVersionVO.getCurrentVersion()); Set> entries = fields.entrySet() .stream() - .filter(entry -> currentVersion.lessThan(entry.getValue())) + .filter(entry -> {//logger.debug(String.format("entry key: %s, value:%s", entry.getKey(), entry.getValue())); + String ver = entry.getValue(); + if (StringUtils.isEmpty(ver)) { + logger.warn("null version for field: " + entry.getKey()); + return false; + } + return currentVersion.lessThan(ver); + }) .collect(Collectors.toSet()); // do not have new version changes diff --git a/externalservice/pom.xml b/externalservice/pom.xml index bd85f726a4f..5059f579ce7 100755 --- a/externalservice/pom.xml +++ b/externalservice/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/header/pom.xml b/header/pom.xml index 0dbee719340..d31a8194b15 100755 --- a/header/pom.xml +++ b/header/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. header @@ -77,7 +77,7 @@ org.apache.avro avro - 1.11.3 + 1.11.4 org.hibernate @@ -147,5 +147,10 @@ org.apache.httpcomponents httpclient + + org.zstack + abstraction + 5.4.0 + diff --git a/header/src/main/java/org/zstack/header/Confirm.java b/header/src/main/java/org/zstack/header/Confirm.java new file mode 100644 index 00000000000..ae503815262 --- /dev/null +++ b/header/src/main/java/org/zstack/header/Confirm.java @@ -0,0 +1,5 @@ +package org.zstack.header; + +public enum Confirm { + Yes, No, Skip +} diff --git a/header/src/main/java/org/zstack/header/Constants.java b/header/src/main/java/org/zstack/header/Constants.java index c132492270d..071b394b900 100755 --- a/header/src/main/java/org/zstack/header/Constants.java +++ b/header/src/main/java/org/zstack/header/Constants.java @@ -16,4 +16,7 @@ public interface Constants { String CATEGORY_METADATA = "metadata"; String UUID_FOR_EXAMPLE = "UUID_FOR_EXAMPLE"; + + String MORPH_TRANSFORM_IAM1 = "IAM1"; + String MORPH_TRANSFORM_IAM2 = "IAM2"; } diff --git a/header/src/main/java/org/zstack/header/PackageAPIInfo.java b/header/src/main/java/org/zstack/header/PackageAPIInfo.java index 7bf7b25894b..00ab5f6db71 100755 --- a/header/src/main/java/org/zstack/header/PackageAPIInfo.java +++ b/header/src/main/java/org/zstack/header/PackageAPIInfo.java @@ -17,6 +17,7 @@ */ public static String PERMISSION_ZSV_BASIC_AVAILABLE = "zsv_basic_available"; public static String PERMISSION_ZSV_ADVANCED_AVAILABLE = "zsv_advanced_available"; + public static String PERMISSION_CLOUD_AIOS_AVAILABLE = "cloud_aios_available"; String APICategoryName() default ""; diff --git a/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java b/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java index 8fd888110f2..ca76b7234ff 100755 --- a/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java +++ b/header/src/main/java/org/zstack/header/allocator/HostCapacityInventory.java @@ -15,6 +15,7 @@ public class HostCapacityInventory { private Long totalCpu; private Integer cpuNum; private Integer cpuSockets; + private Integer cpuCoreNum; private Long availableMemory; private Long availableCpu; private Long totalPhysicalMemory; @@ -31,6 +32,7 @@ public static HostCapacityInventory valueOf(HostCapacityVO vo) { inv.setTotalPhysicalMemory(vo.getTotalPhysicalMemory()); inv.setCpuNum(vo.getCpuNum()); inv.setCpuSockets(vo.getCpuSockets()); + inv.setCpuCoreNum(vo.getCpuCoreNum()); return inv; } @@ -42,6 +44,14 @@ public static List valueOf(Collection vos return invs; } + public Integer getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(Integer cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } + public Integer getCpuSockets() { return cpuSockets; } diff --git a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java index 18a66f7af99..b6a17d1a91f 100755 --- a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java +++ b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO.java @@ -40,6 +40,9 @@ public class HostCapacityVO { @Column private int cpuSockets; + @Column + private int cpuCoreNum; + @Column @Index private long availableMemory; @@ -63,6 +66,14 @@ public int getCpuSockets() { return cpuSockets; } + public int getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(int cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } + public void setCpuSockets(int cpuSockets) { this.cpuSockets = cpuSockets; } diff --git a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java index 0e256752159..d521909ad5a 100755 --- a/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java +++ b/header/src/main/java/org/zstack/header/allocator/HostCapacityVO_.java @@ -10,6 +10,7 @@ public class HostCapacityVO_ { public static volatile SingularAttribute totalCpu; public static volatile SingularAttribute cpuNum; public static volatile SingularAttribute cpuSockets; + public static volatile SingularAttribute cpuCoreNum; public static volatile SingularAttribute availableMemory; public static volatile SingularAttribute availableCpu; public static volatile SingularAttribute totalPhysicalMemory; diff --git a/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java b/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java index 3003c0bf7c7..9aee1c4edde 100755 --- a/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java +++ b/header/src/main/java/org/zstack/header/apimediator/APIIsReadyToGoMsg.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.SuppressCredentialCheck; +import org.zstack.header.managementnode.APIManagementNodeMessage; import org.zstack.header.message.APISyncCallMessage; import org.zstack.header.rest.RestRequest; @@ -12,7 +13,7 @@ responseClass = APIIsReadyToGoReply.class, category = "other" ) -public class APIIsReadyToGoMsg extends APISyncCallMessage { +public class APIIsReadyToGoMsg extends APISyncCallMessage implements APIManagementNodeMessage { private String managementNodeId; public String getManagementNodeId() { diff --git a/header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java b/header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java new file mode 100644 index 00000000000..d45589ea08e --- /dev/null +++ b/header/src/main/java/org/zstack/header/apimediator/ApiWorkerThreadPoolStrategy.java @@ -0,0 +1,6 @@ +package org.zstack.header.apimediator; + +public enum ApiWorkerThreadPoolStrategy { + SHARED, + ISOLATED +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java b/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java index bd41d6a2cca..e2d069c6a10 100755 --- a/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java +++ b/header/src/main/java/org/zstack/header/cluster/ReportHostCapacityMessage.java @@ -10,6 +10,15 @@ public class ReportHostCapacityMessage extends NeedReplyMessage { private String hostUuid; private int cpuNum; private int cpuSockets; + private int cpuCoreNum; + + public int getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(int cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } public int getCpuSockets() { return cpuSockets; diff --git a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java index 16c44692e0f..b9f2792ea65 100755 --- a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java +++ b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsg.java @@ -18,14 +18,14 @@ public class APIUpdateConsoleProxyAgentMsg extends APIMessage implements Console private String uuid; @APIParam private String consoleProxyOverriddenIp; - @APIParam(required = false) - private int consoleProxyPort; + @APIParam(required = false, numberRange={1, 65535}) + private Integer consoleProxyPort; - public int getConsoleProxyPort() { + public Integer getConsoleProxyPort() { return consoleProxyPort; } - public void setConsoleProxyPort(int consoleProxyPort) { + public void setConsoleProxyPort(Integer consoleProxyPort) { this.consoleProxyPort = consoleProxyPort; } diff --git a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy index acaa07c57f0..914e5a128c3 100644 --- a/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/console/APIUpdateConsoleProxyAgentMsgDoc_zh_cn.groovy @@ -62,7 +62,7 @@ doc { enclosedIn "updateConsoleProxyAgent" desc "" location "body" - type "int" + type "Integer" optional true since "4.1.0" } diff --git a/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java b/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java index 9e41fd36b3b..6a7675b52ac 100644 --- a/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java +++ b/header/src/main/java/org/zstack/header/core/GetLocalTaskMsg.java @@ -6,6 +6,15 @@ public class GetLocalTaskMsg extends NeedReplyMessage { private List syncSignatures; + private boolean onlyRunningTask; + + public boolean isOnlyRunningTask() { + return onlyRunningTask; + } + + public void setOnlyRunningTask(boolean onlyRunningTask) { + this.onlyRunningTask = onlyRunningTask; + } public void setSyncSignatures(List syncSignatures) { this.syncSignatures = syncSignatures; diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java new file mode 100644 index 00000000000..f41883cc381 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEvent.java @@ -0,0 +1,17 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIDeletePluginDriversEvent extends APIEvent { + public APIDeletePluginDriversEvent() { } + + public APIDeletePluginDriversEvent(String apiId) { + super(apiId); + } + + public static APIDeletePluginDriversEvent __example__() { + return new APIDeletePluginDriversEvent(); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..c3d54078b5c --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "删除插件驱动器" + + field { + name "success" + desc "删除结果" + type "boolean" + since "5.3.20" + } + ref { + name "error" + path "org.zstack.header.core.external.plugin.APIDeletePluginDriversEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.20" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java new file mode 100644 index 00000000000..4393f927f72 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsg.java @@ -0,0 +1,31 @@ +package org.zstack.header.core.external.plugin; + +import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@RestRequest( + path = "/external/plugins/{uuid}", + responseClass = APIDeletePluginDriversEvent.class, + method = HttpMethod.DELETE +) +public class APIDeletePluginDriversMsg extends APIDeleteMessage { + @APIParam(resourceType = PluginDriverVO.class, successIfResourceNotExisting = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public static APIDeletePluginDriversMsg __example__() { + APIDeletePluginDriversMsg msg = new APIDeletePluginDriversMsg(); + msg.setUuid(uuid()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..9066b39da17 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIDeletePluginDriversMsgDoc_zh_cn.groovy @@ -0,0 +1,67 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.APIDeletePluginDriversEvent + +doc { + title "DeletePluginDrivers" + + category "external.plugin" + + desc """删除插件驱动器""" + + rest { + request { + url "DELETE /v1/external/plugins/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIDeletePluginDriversMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "deleteMode" + enclosedIn "" + desc "删除模式(Permissive / Enforcing,Permissive)" + location "body" + type "String" + optional true + since "5.3.20" + } + } + } + + response { + clz APIDeletePluginDriversEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java new file mode 100644 index 00000000000..11754d4fa3a --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsg.java @@ -0,0 +1,22 @@ +package org.zstack.header.core.external.plugin; + +import org.springframework.http.HttpMethod; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +import static java.util.Arrays.asList; + +@AutoQuery(replyClass = APIQueryPluginDriversReply.class, inventoryClass = PluginDriverInventory.class) +@RestRequest( + path = "/external/plugins", + method = HttpMethod.GET, + responseClass = APIQueryPluginDriversReply.class +) +public class APIQueryPluginDriversMsg extends APIQueryMessage { + public static List __example__() { + return asList("name=test"); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..0d77668f5f5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversMsgDoc_zh_cn.groovy @@ -0,0 +1,30 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.APIQueryPluginDriversReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryPluginDrivers" + + category "external.plugin" + + desc """查询插件驱动器""" + + rest { + request { + url "GET /v1/external/plugins" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryPluginDriversMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryPluginDriversReply.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java new file mode 100644 index 00000000000..043abb2e16a --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReply.java @@ -0,0 +1,27 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.Collections; +import java.util.List; + +@RestResponse(allTo = "inventories") +public class APIQueryPluginDriversReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryPluginDriversReply __example__() { + APIQueryPluginDriversReply reply = new APIQueryPluginDriversReply(); + PluginDriverInventory inv = new PluginDriverInventory(); + reply.setInventories(Collections.singletonList(inv)); + return reply; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..967fa11bcb7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIQueryPluginDriversReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.PluginDriverInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "查询插件驱动器" + + ref { + name "inventories" + path "org.zstack.header.core.external.plugin.APIQueryPluginDriversReply.inventories" + desc "插件驱动器列表" + type "List" + since "5.3.0" + clz PluginDriverInventory.class + } + field { + name "success" + desc "操作是否成功" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.header.core.external.plugin.APIQueryPluginDriversReply.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java new file mode 100644 index 00000000000..f3d7970e087 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEvent.java @@ -0,0 +1,17 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIRefreshPluginDriversEvent extends APIEvent { + public APIRefreshPluginDriversEvent() { } + + public APIRefreshPluginDriversEvent(String apiId) { + super(apiId); + } + + public static APIRefreshPluginDriversEvent __example__() { + return new APIRefreshPluginDriversEvent(); + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..784a83bace5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "刷新插件驱动器" + + field { + name "success" + desc "操作是否成功" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.header.core.external.plugin.APIRefreshPluginDriversEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java new file mode 100644 index 00000000000..101acd50963 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsg.java @@ -0,0 +1,32 @@ +package org.zstack.header.core.external.plugin; + +import org.springframework.http.HttpMethod; +import org.zstack.header.core.external.service.APIReloadExternalServiceMsg; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@RestRequest( + path = "/external/plugins", + isAction = true, + responseClass = APIRefreshPluginDriversEvent.class, + method = HttpMethod.PUT +) +public class APIRefreshPluginDriversMsg extends APIMessage { + @APIParam(required = false) + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static APIReloadExternalServiceMsg __example__() { + APIReloadExternalServiceMsg msg = new APIReloadExternalServiceMsg(); + msg.setName("prometheus"); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..35e4fff9888 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/APIRefreshPluginDriversMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.core.external.plugin + +import org.zstack.header.core.external.plugin.APIRefreshPluginDriversEvent + +doc { + title "RefreshPluginDrivers" + + category "external.plugin" + + desc """刷新插件驱动器""" + + rest { + request { + url "PUT /v1/external/plugins" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIRefreshPluginDriversMsg.class + + desc """""" + + params { + + column { + name "name" + enclosedIn "refreshPluginDrivers" + desc "资源名称" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APIRefreshPluginDriversEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java new file mode 100644 index 00000000000..2873496cfda --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversMsg.java @@ -0,0 +1,34 @@ +package org.zstack.header.core.external.plugin; + +import org.apache.commons.lang.StringUtils; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.NeedReplyMessage; + +public class DeletePluginDriversMsg extends NeedReplyMessage { + private String uuid; + private String deletionMode; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public void setDeletionMode(APIDeleteMessage.DeletionMode deletionMode) { + this.deletionMode = deletionMode.toString(); + } + + public APIDeleteMessage.DeletionMode getDeletionMode() { + return StringUtils.isEmpty(deletionMode) ? APIDeleteMessage.DeletionMode.Permissive : APIDeleteMessage.DeletionMode.valueOf(deletionMode); + } + + public String getDeletionModeString() { + return StringUtils.isEmpty(deletionMode) ? APIDeleteMessage.DeletionMode.Permissive.toString() : deletionMode; + } + + public void setDeletionMode(String deletionMode) { + this.deletionMode = deletionMode; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java new file mode 100644 index 00000000000..780fac1b165 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/DeletePluginDriversReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.MessageReply; + +public class DeletePluginDriversReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java new file mode 100644 index 00000000000..4cfd3f89c9f --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventory.java @@ -0,0 +1,147 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.abstraction.OptionType; +import org.zstack.header.search.Inventory; +import org.zstack.utils.gson.JSONObjectUtil; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Inventory(mappingVOClass = PluginDriverVO.class) +public class PluginDriverInventory { + private String uuid; + private String name; + private String type; + private String vendor; + private String features; + private Collection optionTypes; + private boolean deleted; + private String license; + private String version; + private String description; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static PluginDriverInventory valueOf(PluginDriverVO vo) { + PluginDriverInventory inv = new PluginDriverInventory(); + inv.setUuid(vo.getUuid()); + inv.setName(vo.getName()); + inv.setVendor(vo.getVendor()); + inv.setFeatures(vo.getFeatures()); + inv.setType(vo.getType()); + inv.setLicense(vo.getLicense()); + inv.setVersion(vo.getVersion()); + inv.setDescription(vo.getDescription()); + inv.setOptionTypes(JSONObjectUtil.toCollection(vo.getOptionTypes(), ArrayList.class, OptionType.class)); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + inv.setDeleted(vo.isDeleted()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (PluginDriverVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getFeatures() { + return features; + } + + public void setFeatures(String features) { + this.features = features; + } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Collection getOptionTypes() { + return optionTypes; + } + + public void setOptionTypes(Collection optionTypes) { + this.optionTypes = optionTypes; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..f46f532b274 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverInventoryDoc_zh_cn.groovy @@ -0,0 +1,51 @@ +package org.zstack.header.core.external.plugin + + + +doc { + + title "插件驱动器" + + field { + name "name" + desc "资源名称" + type "String" + since "5.3.0" + } + field { + name "type" + desc "资源类型" + type "String" + since "5.3.0" + } + field { + name "vendor" + desc "插件供应商" + type "String" + since "5.3.0" + } + field { + name "features" + desc "插件特性" + type "String" + since "5.3.0" + } + field { + name "license" + desc "插件许可证" + type "String" + since "5.3.0" + } + field { + name "version" + desc "插件版本" + type "String" + since "5.3.0" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.0" + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java new file mode 100644 index 00000000000..f1586aca36c --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO.java @@ -0,0 +1,163 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.vo.BaseResource; +import org.zstack.header.vo.ResourceVO; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import java.sql.Timestamp; + +@Entity +@Table +@BaseResource +public class PluginDriverVO extends ResourceVO { + @Column + private String name; + + @Column + private String type; + + @Column + private String vendor; + + @Column + private String license; + + @Column + private String version; + + @Column + private String description; + + @Column + private String features; + + @Column + private String optionTypes; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @Column + private boolean deleted = false; + + public PluginDriverVO() { + } + + public PluginDriverVO(PluginDriverVO other) { + this.uuid = other.uuid; + this.name = other.name; + this.vendor = other.vendor; + this.features = other.features; + this.license = other.license; + this.version = other.version; + this.description = other.description; + this.type = other.type; + this.optionTypes = other.optionTypes; + this.createDate = other.createDate; + this.lastOpDate = other.lastOpDate; + this.deleted = other.deleted; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + @Override + public String getUuid() { + return uuid; + } + + @Override + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getFeatures() { + return features; + } + + public void setFeatures(String features) { + this.features = features; + } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getOptionTypes() { + return optionTypes; + } + + public void setOptionTypes(String optionTypes) { + this.optionTypes = optionTypes; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java new file mode 100644 index 00000000000..c79ce6ff7d2 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriverVO_.java @@ -0,0 +1,20 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +@StaticMetamodel(PluginDriverVO.class) +public class PluginDriverVO_ extends ResourceVO_ { + public static volatile SingularAttribute name; + public static volatile SingularAttribute vendor; + public static volatile SingularAttribute version; + public static volatile SingularAttribute type; + public static volatile SingularAttribute features; + public static volatile SingularAttribute optionTypes; + public static volatile SingularAttribute deleted; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java new file mode 100644 index 00000000000..0d31571c267 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/PluginDriversExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.errorcode.ErrorCode; + +public interface PluginDriversExtensionPoint { + ErrorCode validateDeletePluginDrivers(String pluginUuid); +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java b/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java new file mode 100644 index 00000000000..117a8ae28e1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RBACInfo.java @@ -0,0 +1,35 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.identity.rbac.RBACDescription; + +public class RBACInfo implements RBACDescription { + + @Override + public void permissions() { + permissionBuilder() + .name("external-plugin") + .adminOnlyAPIs( + APIQueryPluginDriversMsg.class, + APIRefreshPluginDriversMsg.class, + APIDeletePluginDriversMsg.class + ).build(); + } + + @Override + public void contributeToRoles() { + roleContributorBuilder() + .roleName("other") + .actionsByPermissionName("external-plugin") + .build(); + } + + @Override + public void roles() { + + } + + @Override + public void globalReadableResources() { + + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java new file mode 100644 index 00000000000..d5e3b892a23 --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversMsg.java @@ -0,0 +1,15 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.NeedReplyMessage; + +public class RefreshPluginDriversMsg extends NeedReplyMessage { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java new file mode 100644 index 00000000000..eb02a336d0e --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/plugin/RefreshPluginDriversReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.core.external.plugin; + +import org.zstack.header.message.MessageReply; + +public class RefreshPluginDriversReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java b/header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java new file mode 100644 index 00000000000..b9268425c9c --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/external/service/ExporterConstant.java @@ -0,0 +1,64 @@ +package org.zstack.header.core.external.service; + +import org.zstack.utils.path.PathUtil; + +import java.io.File; +import java.util.Optional; + +/** + * @author hanyu.liang + * @date 2024/10/30 17:07 + */ +public class ExporterConstant { + public static final String SYSTEMD_SERVICE_DIR = "/lib/systemd/system/"; + public static final String LOG_DIR = "/var/log/zstack/"; + public static final String PROCESS_EXPORTER_BIN_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("tools/process_exporter")) + .map(File::getAbsolutePath) + .orElse(null); + + public static final String ZS_EXPORTER_BIN_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("tools/zstack_service_exporter")) + .map(File::getAbsolutePath) + .orElse(null); + + public static final String PROCESS_EXPORTER_SERVICE_PATH = SYSTEMD_SERVICE_DIR + "process_exporter.service"; + public static final String ZS_EXPORTER_SERVICE_PATH = SYSTEMD_SERVICE_DIR + "zstack_service_exporter.service"; + public static final String PROCESS_EXPORTER_LOG_PATH = LOG_DIR + "process_exporter.log"; + public static final String ZS_EXPORTER_LOG_PATH = LOG_DIR + "zstack_service_exporter.log"; + public static final String PROCESS_EXPORTER_CONFIG_PATH = getProcessExporterYamlPath(); + public static final String ZS_EXPORTER_CONFIG_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/zs_exporter_config.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + public static final String ZS_HOST_EXPORTER_CONFIG_PATH = Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/zs_host_exporter_config.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + + private static String getProcessExporterYamlPath() { + String arch = System.getProperty("os.arch"); + switch (arch) { + case "aarch64": + return Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/process_exporter_config_aarch64.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + default: + return Optional + .ofNullable(PathUtil.findFileOnClassPath("zsExporter/process_exporter_config.yaml")) + .map(File::getAbsolutePath) + .orElse(null); + } + } + + public static boolean isZSExporterInstalled() { + return ExporterConstant.ZS_EXPORTER_BIN_PATH != null + && ExporterConstant.ZS_EXPORTER_CONFIG_PATH != null; + } + + public static boolean isProcessExporterInstalled() { + return ExporterConstant.PROCESS_EXPORTER_BIN_PATH != null + && ExporterConstant.PROCESS_EXPORTER_CONFIG_PATH != null; + } +} diff --git a/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java b/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java index bb07ad06050..2cb11b1fbb6 100644 --- a/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java +++ b/header/src/main/java/org/zstack/header/core/progress/ChainInfo.java @@ -1,5 +1,8 @@ package org.zstack.header.core.progress; +import org.zstack.header.message.NoJsonSchema; +import org.zstack.header.rest.APINoSee; + import java.util.ArrayList; import java.util.List; @@ -9,6 +12,8 @@ public class ChainInfo { private List runningTask = new ArrayList<>(); private List pendingTask = new ArrayList<>(); + @APINoSee + private long maxThreadNum; public void setPendingTask(List pendingTask) { this.pendingTask = pendingTask; @@ -33,4 +38,25 @@ public void addRunningTask(RunningTaskInfo task) { public void addPendingTask(PendingTaskInfo pendingTask) { this.pendingTask.add(pendingTask); } + + public void setMaxThreadNum(long maxThreadNum) { + this.maxThreadNum = maxThreadNum; + } + + public long getMaxThreadNum() { + return maxThreadNum; + } + + @Override + public String toString() { + StringBuilder tb = new StringBuilder(); + tb.append(String.format("\nRUNNING TASK NUMBER: %s", runningTask.size())); + tb.append(String.format("\nPENDING TASK NUMBER: %s", pendingTask.size())); + tb.append(String.format("\nASYNC LEVEL: %s", maxThreadNum)); + + runningTask.forEach(tb::append); + pendingTask.forEach(tb::append); + + return tb.toString(); + } } diff --git a/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java b/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java index 3da94d1f9cd..0d1dbf94bba 100755 --- a/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java +++ b/header/src/main/java/org/zstack/header/errorcode/ErrorCode.java @@ -39,6 +39,11 @@ public void putToOpaque(String key, Object value) { opaque.put(key, value); } + public ErrorCode withOpaque(String key, Object value) { + putToOpaque(key,value); + return this; + } + public Object getFromOpaque(String key) { return opaque == null ? null : opaque.get(key); } diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java new file mode 100644 index 00000000000..c75b21c4ed2 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEvent.java @@ -0,0 +1,34 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 10/24/2024. + */ +@RestResponse(allTo = "inventory") +public class APICreateHostNetworkServiceTypeEvent extends APIEvent { + private HostNetworkLabelInventory inventory; + + public APICreateHostNetworkServiceTypeEvent(String apiId) { + super(apiId); + } + + public APICreateHostNetworkServiceTypeEvent() { + super(null); + } + + public HostNetworkLabelInventory getInventory() { + return inventory; + } + + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + + public static APICreateHostNetworkServiceTypeEvent __example__() { + APICreateHostNetworkServiceTypeEvent event = new APICreateHostNetworkServiceTypeEvent(); + event.setInventory(new HostNetworkLabelInventory()); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..783f174058c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.host + +import org.zstack.header.host.HostNetworkLabelInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.header.host.APICreateHostNetworkServiceTypeEvent.inventory" + desc "null" + type "HostNetworkLabelInventory" + since "5.2.1" + clz HostNetworkLabelInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.host.APICreateHostNetworkServiceTypeEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java new file mode 100644 index 00000000000..fc903f548f6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsg.java @@ -0,0 +1,63 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.other.APIAuditor; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +/** + * Created by boce.wang on 10/24/2024. + */ +@TagResourceType(HostNetworkLabelVO.class) +@Action(category = HostConstant.ACTION_CATEGORY) +@RestRequest( + path = "/hosts/service-types", + method = HttpMethod.POST, + responseClass = APICreateHostNetworkServiceTypeEvent.class, + parameterName = "params" +) +public class APICreateHostNetworkServiceTypeMsg extends APICreateMessage implements APIAuditor { + @APIParam(maxLength = 128, nonempty = true, noTrim = true) + private String serviceType; + + @APIParam(required = false, nonempty = true) + private boolean system = false; + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public boolean isSystem() { + return system; + } + + public void setSystem(boolean system) { + this.system = system; + } + + public static APICreateHostNetworkServiceTypeMsg __example__() { + APICreateHostNetworkServiceTypeMsg msg = new APICreateHostNetworkServiceTypeMsg(); + msg.setServiceType("ManagementNetwork"); + msg.setSystem(true); + return msg; + } + + @Override + public Result audit(APIMessage msg, APIEvent rsp) { + String resUuid = ""; + if (rsp.isSuccess()) { + APICreateHostNetworkServiceTypeEvent evt = (APICreateHostNetworkServiceTypeEvent) rsp; + resUuid = evt.getInventory().getUuid(); + } + return new Result(resUuid, HostNetworkLabelVO.class); + } +} diff --git a/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..91795b2339d --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APICreateHostNetworkServiceTypeMsgDoc_zh_cn.groovy @@ -0,0 +1,85 @@ +package org.zstack.header.host + +import org.zstack.header.host.APICreateHostNetworkServiceTypeEvent + +doc { + title "CreateHostNetworkServiceType" + + category "host" + + desc """在这里填写API描述""" + + rest { + request { + url "POST /v1/hosts/service-types" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateHostNetworkServiceTypeMsg.class + + desc """""" + + params { + + column { + name "serviceType" + enclosedIn "params" + desc "" + location "body" + type "String" + optional false + since "5.2.1" + } + column { + name "system" + enclosedIn "params" + desc "" + location "body" + type "boolean" + optional true + since "5.2.1" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.2.1" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.2.1" + } + } + } + + response { + clz APICreateHostNetworkServiceTypeEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java new file mode 100644 index 00000000000..c402bd45b62 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEvent.java @@ -0,0 +1,23 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 10/25/2024. + */ +@RestResponse +public class APIDeleteHostNetworkServiceTypeEvent extends APIEvent { + + public APIDeleteHostNetworkServiceTypeEvent() { + } + + public APIDeleteHostNetworkServiceTypeEvent(String apiId) { + super(apiId); + } + public static APIDeleteHostNetworkServiceTypeEvent __example__() { + APIDeleteHostNetworkServiceTypeEvent event = new APIDeleteHostNetworkServiceTypeEvent(); + event.setSuccess(true); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..5a1598bd7a4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.host + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.host.APIDeleteHostNetworkServiceTypeEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java new file mode 100644 index 00000000000..896222cf1f3 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsg.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 10/25/2024. + */ +@Action(category = HostConstant.ACTION_CATEGORY) +@RestRequest( + path = "/hosts/service-types/{uuid}", + method = HttpMethod.DELETE, + responseClass = APIDeleteHostNetworkServiceTypeEvent.class +) +public class APIDeleteHostNetworkServiceTypeMsg extends APIDeleteMessage { + @APIParam(resourceType = HostNetworkLabelVO.class, successIfResourceNotExisting = true, operationTarget = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public static APIDeleteHostNetworkServiceTypeMsg __example__() { + APIDeleteHostNetworkServiceTypeMsg msg = new APIDeleteHostNetworkServiceTypeMsg(); + msg.setUuid(uuid()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..715f9294c35 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIDeleteHostNetworkServiceTypeMsgDoc_zh_cn.groovy @@ -0,0 +1,67 @@ +package org.zstack.header.host + +import org.zstack.header.host.APIDeleteHostNetworkServiceTypeEvent + +doc { + title "DeleteHostNetworkServiceType" + + category "host" + + desc """在这里填写API描述""" + + rest { + request { + url "DELETE /v1/hosts/service-types/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIDeleteHostNetworkServiceTypeMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.2.1" + } + column { + name "deleteMode" + enclosedIn "" + desc "删除模式(Permissive / Enforcing,Permissive)" + location "body" + type "String" + optional true + since "5.2.1" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.2.1" + } + } + } + + response { + clz APIDeleteHostNetworkServiceTypeEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java new file mode 100644 index 00000000000..1d9adb75607 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEvent.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 10/25/2024. + */ +@RestResponse(allTo = "inventory") +public class APIUpdateHostNetworkServiceTypeEvent extends APIEvent { + private HostNetworkLabelInventory inventory; + + public APIUpdateHostNetworkServiceTypeEvent() { + + } + + public APIUpdateHostNetworkServiceTypeEvent(String apiId) { + super(apiId); + } + + public HostNetworkLabelInventory getInventory() { + return inventory; + } + + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + + public static APIUpdateHostNetworkServiceTypeEvent __example__() { + APIUpdateHostNetworkServiceTypeEvent event = new APIUpdateHostNetworkServiceTypeEvent(); + event.setInventory(new HostNetworkLabelInventory()); + event.setSuccess(true); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..f445f88f073 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.host + +import org.zstack.header.host.HostNetworkLabelInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "inventory" + path "org.zstack.header.host.APIUpdateHostNetworkServiceTypeEvent.inventory" + desc "null" + type "HostNetworkLabelInventory" + since "5.2.1" + clz HostNetworkLabelInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.host.APIUpdateHostNetworkServiceTypeEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java new file mode 100644 index 00000000000..973d51961a6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsg.java @@ -0,0 +1,60 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 10/25/2024. + */ +@RestRequest( + path = "/hosts/service-types/{uuid}/actions", + method = HttpMethod.PUT, + isAction = true, + responseClass = APIUpdateHostNetworkServiceTypeEvent.class + +) +public class APIUpdateHostNetworkServiceTypeMsg extends APIMessage { + + @APIParam(resourceType = HostNetworkLabelVO.class) + private String uuid; + + @APIParam(maxLength = 128, nonempty = true, noTrim = true) + private String serviceType; + + @APIParam(required = false, nonempty = true) + private boolean system = false; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public boolean isSystem() { + return system; + } + + public void setSystem(boolean system) { + this.system = system; + } + + public static APIUpdateHostNetworkServiceTypeMsg __example__() { + APIUpdateHostNetworkServiceTypeMsg msg = new APIUpdateHostNetworkServiceTypeMsg(); + msg.setUuid(uuid()); + msg.setServiceType("ManagementNetwork"); + msg.setSystem(true); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..35c3c9e091c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIUpdateHostNetworkServiceTypeMsgDoc_zh_cn.groovy @@ -0,0 +1,76 @@ +package org.zstack.header.host + +import org.zstack.header.host.APIUpdateHostNetworkServiceTypeEvent + +doc { + title "UpdateHostNetworkServiceType" + + category "host" + + desc """在这里填写API描述""" + + rest { + request { + url "PUT /v1/hosts/service-types/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIUpdateHostNetworkServiceTypeMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "updateHostNetworkServiceType" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.2.1" + } + column { + name "serviceType" + enclosedIn "updateHostNetworkServiceType" + desc "" + location "body" + type "String" + optional false + since "5.2.1" + } + column { + name "system" + enclosedIn "updateHostNetworkServiceType" + desc "" + location "body" + type "boolean" + optional true + since "5.2.1" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.2.1" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.2.1" + } + } + } + + response { + clz APIUpdateHostNetworkServiceTypeEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java deleted file mode 100644 index c5bbbbc5a1a..00000000000 --- a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorMsg.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.zstack.header.host; - -import org.zstack.header.message.NeedReplyMessage; -import org.zstack.header.volume.VolumeInventory; - -public class CommitVolumeOnHypervisorMsg extends NeedReplyMessage implements HostMessage { - private String hostUuid; - private String vmUuid; - private VolumeInventory volume; - private String srcPath; - private String dstPath; - - public VolumeInventory getVolume() { - return volume; - } - - public void setVolume(VolumeInventory volume) { - this.volume = volume; - } - - @Override - public String getHostUuid() { - return hostUuid; - } - - public void setHostUuid(String hostUuid) { - this.hostUuid = hostUuid; - } - - public String getVmUuid() { - return vmUuid; - } - - public void setVmUuid(String vmUuid) { - this.vmUuid = vmUuid; - } - - public String getSrcPath() { - return srcPath; - } - - public void setSrcPath(String srcPath) { - this.srcPath = srcPath; - } - - public String getDstPath() { - return dstPath; - } - - public void setDstPath(String dstPath) { - this.dstPath = dstPath; - } -} diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java b/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java deleted file mode 100644 index 7776e04b02d..00000000000 --- a/header/src/main/java/org/zstack/header/host/CommitVolumeOnHypervisorReply.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.zstack.header.host; - -import org.zstack.header.message.MessageReply; - -public class CommitVolumeOnHypervisorReply extends MessageReply { - private String newVolumeInstallPath; - private long size; - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public String getNewVolumeInstallPath() { - return newVolumeInstallPath; - } - - public void setNewVolumeInstallPath(String newVolumeInstallPath) { - this.newVolumeInstallPath = newVolumeInstallPath; - } -} diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java new file mode 100644 index 00000000000..4ceb022eab0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorMsg.java @@ -0,0 +1,57 @@ +package org.zstack.header.host; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +import java.util.ArrayList; +import java.util.List; + +public class CommitVolumeSnapshotOnHypervisorMsg extends NeedReplyMessage implements HostMessage { + private String hostUuid; + private VolumeInventory volume; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + private List srcChildrenInstallPathInDb = new ArrayList<>(); + + @Override + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + public List getSrcChildrenInstallPathInDb() { + return srcChildrenInstallPathInDb; + } + + public void setSrcChildrenInstallPathInDb(List srcChildrenInstallPathInDb) { + this.srcChildrenInstallPathInDb = srcChildrenInstallPathInDb; + } +} diff --git a/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java new file mode 100644 index 00000000000..38475ee85f1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/CommitVolumeSnapshotOnHypervisorReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.host; + +import org.zstack.header.message.MessageReply; + +public class CommitVolumeSnapshotOnHypervisorReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java b/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java index 73f3fe8946e..402fa684bbb 100644 --- a/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java +++ b/header/src/main/java/org/zstack/header/host/CompareCpuFunctionOnHostReply.java @@ -6,4 +6,22 @@ * Created by LiangHanYu on 2021/8/13 16:32 */ public class CompareCpuFunctionOnHostReply extends MessageReply { + private boolean match; + private String compareError; + + public boolean isMatch() { + return match; + } + + public void setMatch(boolean match) { + this.match = match; + } + + public String getCompareError() { + return compareError; + } + + public void setCompareError(String compareError) { + this.compareError = compareError; + } } diff --git a/header/src/main/java/org/zstack/header/host/CpuArchitecture.java b/header/src/main/java/org/zstack/header/host/CpuArchitecture.java index f5260e1ce6e..2119bdeec27 100644 --- a/header/src/main/java/org/zstack/header/host/CpuArchitecture.java +++ b/header/src/main/java/org/zstack/header/host/CpuArchitecture.java @@ -1,5 +1,8 @@ package org.zstack.header.host; +import org.zstack.header.rest.SDK; + +@SDK public enum CpuArchitecture { x86_64, aarch64, diff --git a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java index 0a6ba8f2a70..cca0e26567d 100755 --- a/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/host/HostCanonicalEvents.java @@ -4,9 +4,6 @@ import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.message.NeedJsonSchema; -import java.util.HashMap; -import java.util.Map; - /** * Created by xing5 on 2016/3/22. */ @@ -31,7 +28,61 @@ public class HostCanonicalEvents { public static final String HOST_PHYSICAL_GPU_STATUS_ABNORMAL = "/host/physicalGpu/status/abnormal"; public static final String HOST_PHYSICAL_VGPU_STATUS_ABNORMAL = "/host/physicalVGpu/status/abnormal"; public static final String HOST_PHYSICAL_RAID_STATUS_ABNORMAL = "/host/physicalRaid/status/abnormal"; + public static final String HOST_PHYSICAL_HBA_STATE_ABNORMAL = "/host/physicalHBA/state/abnormal"; + public static final String HOST_PHYSICAL_VOLUME_STATE_ABNORMAL = "/host/physicalVolume/state/abnormal"; + public static final String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL = "/host/process/physicalMemory/usage/abnormal"; + public static final String HOST_PING_SKIP = "/host/ping/skip"; + public static final String HOST_PING_CANCEL_SKIP = "/host/ping/cancel/skip"; + public static final String HOST_MULTIPATH_CONFIG_CHANGED = "/host/multipathConfig/changed"; + + @NeedJsonSchema + public static class HostPhysicalHbaPortStateAbnormalData { + private String hostUuid; + private String name; + private String portName; + private String newPortState; + private String oldPortState; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPortName() { + return portName; + } + public void setPortName(String portName) { + this.portName = portName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNewPortState() { + return newPortState; + } + + public void setNewPortState(String newPortState) { + this.newPortState = newPortState; + } + + public String getOldPortState() { + return oldPortState; + } + + public void setOldPortState(String oldPortState) { + this.oldPortState = oldPortState; + } + } @NeedJsonSchema public static class HostPhysicalGpuRemoveTriggeredData { @@ -371,6 +422,55 @@ public void setSlotNumber(String slotNumber) { } } + @NeedJsonSchema + public static class HostPhysicalVolumeStateAbnormalData { + private String hostUuid; + private String diskName; + private String diskUuids; // example: scsi-360014058e50754920324473a4c85c767;wwn-0x60014058e50754920324473a4c85c767 + private String state; + private String vgName; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getDiskName() { + return diskName; + } + + public void setDiskName(String diskName) { + this.diskName = diskName; + } + + public String getDiskUuids() { + return diskUuids; + } + + public void setDiskUuids(String diskUuids) { + this.diskUuids = diskUuids; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getVgName() { + return vgName; + } + + public void setVgName(String vgName) { + this.vgName = vgName; + } + } + @NeedJsonSchema public static class HostPhysicalMemoryEccErrorData { private String hostUuid; @@ -564,4 +664,88 @@ public void setInterfaceStatus(String interfaceStatus) { this.interfaceStatus = interfaceStatus; } } + + @NeedJsonSchema + public static class MultipathConfigChangedData { + private String hostUuid; + private String details; + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + } + + @NeedJsonSchema + public static class HostProcessPhysicalMemoryUsageAlarmData { + private String hostUuid; + private String pid; + private String processName; + private String memoryUsage; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getProcessName() { + return processName; + } + + public void setProcessName(String processName) { + this.processName = processName; + } + + public String getMemoryUsage() { + return memoryUsage; + } + + public void setMemoryUsage(String memoryUsage) { + this.memoryUsage = memoryUsage; + } + } + + @NeedJsonSchema + public static class HostPingSkipData { + private String hostUuid; + private int skipTimeInSec; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public int getSkipTimeInSec() { + return skipTimeInSec; + } + + public void setSkipTimeInSec(int skipTimeInSec) { + this.skipTimeInSec = skipTimeInSec; + } + } } diff --git a/header/src/main/java/org/zstack/header/host/HostHardware.java b/header/src/main/java/org/zstack/header/host/HostHardware.java index 2ed54c8c575..7b5464eb26a 100644 --- a/header/src/main/java/org/zstack/header/host/HostHardware.java +++ b/header/src/main/java/org/zstack/header/host/HostHardware.java @@ -12,6 +12,7 @@ public enum HostHardware { POWERSUPPLY, FAN, RAID, + PHYSICAL_VOLUME, UNKNOWN; public static HostHardware fromString(String name) { diff --git a/header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java b/header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java new file mode 100644 index 00000000000..c39ab6bffae --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostHugepageExtensionPoint.java @@ -0,0 +1,8 @@ +package org.zstack.header.host; + +/** + * Created by boce.wang on 01/24/2025. + */ +public interface HostHugepageExtensionPoint { + boolean checkHugepageSupport(HostInventory host); +} diff --git a/header/src/main/java/org/zstack/header/host/HostInventory.java b/header/src/main/java/org/zstack/header/host/HostInventory.java index c4f51dca027..35958b05003 100755 --- a/header/src/main/java/org/zstack/header/host/HostInventory.java +++ b/header/src/main/java/org/zstack/header/host/HostInventory.java @@ -225,7 +225,7 @@ protected HostInventory(HostVO vo) { if (vo.getHwMonitorStatus() != null) { this.setCpuStatus(vo.getHwMonitorStatus().getCpuStatus()); this.setMemoryStatus(vo.getHwMonitorStatus().getMemoryStatus()); - this.setDiskStatus(vo.getHwMonitorStatus().getMemoryStatus()); + this.setDiskStatus(vo.getHwMonitorStatus().getDiskStatus()); this.setFanStatus(vo.getHwMonitorStatus().getFanStatus()); this.setPowerSupplyStatus(vo.getHwMonitorStatus().getPowerSupplyStatus()); this.setRaidStatus(vo.getHwMonitorStatus().getRaidStatus()); diff --git a/header/src/main/java/org/zstack/header/host/HostNUMANode.java b/header/src/main/java/org/zstack/header/host/HostNUMANode.java index 58d484538bd..733a90cc828 100644 --- a/header/src/main/java/org/zstack/header/host/HostNUMANode.java +++ b/header/src/main/java/org/zstack/header/host/HostNUMANode.java @@ -2,6 +2,8 @@ import java.util.List; +import static org.zstack.utils.CollectionDSL.list; + public class HostNUMANode { public List distance; public List cpus; @@ -57,4 +59,15 @@ public List getVMsUuid() { public void setVMsUuid(List VMsUuid) { this.VMsUuid = VMsUuid; } + + public static HostNUMANode __example__() { + HostNUMANode node = new HostNUMANode(); + node.setNodeID("1"); + node.setDistance(list("0", "1")); + node.setCpus(list("0", "1")); + node.setFree(1L); + node.setSize(2L); + node.setVMsUuid(list("vm-1", "vm-2")); + return node; + } } diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java new file mode 100644 index 00000000000..90f4d45184c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelExtensionPoint.java @@ -0,0 +1,12 @@ +package org.zstack.header.host; + +import org.zstack.header.core.Completion; + +/** + * Created by boce.wang on 10/25/2024. + */ +public interface HostNetworkLabelExtensionPoint { + void deleteHostNetworkLabel(HostNetworkLabelInventory hostNetworkLabel, Completion completion); + + void updateHostNetworkLabel(HostNetworkLabelInventory hostNetworkLabel, String newLabel, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java new file mode 100644 index 00000000000..d00fd7bee33 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventory.java @@ -0,0 +1,96 @@ +package org.zstack.header.host; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by boce.wang on 10/24/2024. + */ +@PythonClassInventory +@Inventory(mappingVOClass = HostNetworkLabelVO.class) +public class HostNetworkLabelInventory implements Serializable { + + private String uuid; + + private String serviceType; + + private Boolean system; + + private Timestamp createDate; + + private Timestamp lastOpDate; + + protected HostNetworkLabelInventory(HostNetworkLabelVO vo) { + this.setUuid(vo.getUuid()); + this.setServiceType(vo.getServiceType()); + this.setSystem(vo.getSystem()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + } + + public HostNetworkLabelInventory() { + } + + public static HostNetworkLabelInventory valueOf(HostNetworkLabelVO vo) { + return new HostNetworkLabelInventory(vo); + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(vos.size()); + for (HostNetworkLabelVO vo : vos) { + invs.add(HostNetworkLabelInventory.valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public Boolean getSystem() { + return system; + } + + public void setSystem(Boolean system) { + this.system = system; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..99dc14838e5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelInventoryDoc_zh_cn.groovy @@ -0,0 +1,40 @@ +package org.zstack.header.host + +import java.lang.Boolean +import java.sql.Timestamp + +doc { + + title "在这里输入结构的名称" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.2.1" + } + field { + name "serviceType" + desc "" + type "String" + since "5.2.1" + } + field { + name "system" + desc "" + type "Boolean" + since "5.2.1" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.2.1" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.2.1" + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java new file mode 100644 index 00000000000..068a594196c --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO.java @@ -0,0 +1,68 @@ +package org.zstack.header.host; + +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 10/24/2024. + */ +@Entity +@Table +public class HostNetworkLabelVO implements ToInventory { + @Id + @Column + private String uuid; + + @Column + private String serviceType; + + @Column + private Boolean system; + + @Column + private Timestamp createDate; + @Column + private Timestamp lastOpDate; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public Boolean getSystem() { + return system; + } + + public void setSystem(Boolean system) { + this.system = system; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java new file mode 100644 index 00000000000..3220ddc26e5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostNetworkLabelVO_.java @@ -0,0 +1,16 @@ +package org.zstack.header.host; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; +/** + * Created by boce.wang on 10/24/2024. + */ +@StaticMetamodel(HostNetworkLabelVO.class) +public class HostNetworkLabelVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute serviceType; + public static volatile SingularAttribute system; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java b/header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java new file mode 100644 index 00000000000..d1a14188180 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostResizeVolumeExtensionPoint.java @@ -0,0 +1,10 @@ +package org.zstack.header.host; + +import org.zstack.header.volume.VolumeInventory; + +/** + * Created by kayo on 2018/4/2. + */ +public interface HostResizeVolumeExtensionPoint { + HostResizeVolumeStruct beforeKvmHostResizeVolume(HostResizeVolumeStruct struct, VolumeInventory vol, String hostUuid); +} diff --git a/header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java b/header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java new file mode 100644 index 00000000000..2f6774c6e14 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostResizeVolumeStruct.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +/** + * @author Xingwei Yu + * @date 2025/8/12 14:20 + */ +public class HostResizeVolumeStruct { + private String deviceType; + String installPath; + long size; + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy new file mode 100644 index 00000000000..b31e5718c9f --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HwMonitorStatusDoc_zh_cn.groovy @@ -0,0 +1,27 @@ +package org.zstack.header.host + + + +doc { + + title "硬件监控状态" + + field { + name "Normal" + desc "正常状态" + type "HwMonitorStatus" + since "5.3.6" + } + field { + name "Error" + desc "错误状态" + type "HwMonitorStatus" + since "5.3.6" + } + field { + name "Unknown" + desc "未知状态" + type "HwMonitorStatus" + since "5.3.6" + } +} diff --git a/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java new file mode 100644 index 00000000000..c1577a1d9eb --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorMsg.java @@ -0,0 +1,54 @@ +package org.zstack.header.host; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +public class PullVolumeSnapshotOnHypervisorMsg extends NeedReplyMessage implements HostMessage { + VolumeInventory volume; + private String srcSnapshotParentPath; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + private String hostUuid; + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public String getSrcSnapshotParentPath() { + return srcSnapshotParentPath; + } + + public void setSrcSnapshotParentPath(String srcSnapshotParentPath) { + this.srcSnapshotParentPath = srcSnapshotParentPath; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + @Override + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } +} diff --git a/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java new file mode 100644 index 00000000000..13d109c48d5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/PullVolumeSnapshotOnHypervisorReply.java @@ -0,0 +1,17 @@ +package org.zstack.header.host; + +import org.zstack.header.message.MessageReply; + +/** + */ +public class PullVolumeSnapshotOnHypervisorReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java b/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java index c39bb6d3369..1aa5d0f9dd1 100644 --- a/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java +++ b/header/src/main/java/org/zstack/header/host/ShutdownHostMsg.java @@ -7,9 +7,17 @@ */ public class ShutdownHostMsg extends NeedReplyMessage implements HostMessage { private String uuid; + /** + * If true, the shutdown task execution should wait for the running task to complete. + */ private boolean waitTaskCompleted; private Long maxWaitTime; + + /** + * If true, the shutdown task will return immediately without waiting for the host to be powered off. + */ private boolean returnEarly; + private String originState; private HostPowerManagementMethod method; private boolean force = false; @@ -65,4 +73,12 @@ public boolean isForce() { public void setForce(boolean force) { this.force = force; } + + public String getOriginState() { + return originState; + } + + public void setOriginState(String originState) { + this.originState = originState; + } } diff --git a/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java b/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java index 568ba11a91d..01d5512208a 100755 --- a/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java +++ b/header/src/main/java/org/zstack/header/identity/APICheckApiPermissionReply.java @@ -24,7 +24,7 @@ public void setInventory(Map inventory) { public static APICheckApiPermissionReply __example__() { APICheckApiPermissionReply reply = new APICheckApiPermissionReply(); Map inventory = new HashMap<>(); - inventory.put("APICheckApiPermissionMsg", StatementEffect.Allow.toString()); + inventory.put("APICheckApiPermissionMsg", PolicyStatementEffect.Allow.toString()); reply.setInventory(inventory); return reply; } diff --git a/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java b/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java index ac06c354534..ca1433f18ae 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APICreateAccountMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.log.NoLogging; import org.zstack.header.message.APICreateMessage; import org.zstack.header.message.APIEvent; @@ -13,7 +14,8 @@ path = "/accounts", method = HttpMethod.POST, parameterName = "params", - responseClass = APICreateAccountEvent.class + responseClass = APICreateAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APICreateAccountMsg extends APICreateMessage implements APIAuditor { @APIParam(maxLength = 255) @@ -21,7 +23,7 @@ public class APICreateAccountMsg extends APICreateMessage implements APIAuditor @APIParam(maxLength = 255, password = true) @NoLogging private String password; - @APIParam(validValues = {"SystemAdmin", "Normal"}, required = false) + @APIParam(validValues = {"SystemAdmin", "Normal", "ThirdParty"}, required = false) private String type; @APIParam(maxLength = 2048, required = false) private String description; diff --git a/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java b/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java index 6c1109fd04e..4558534f067 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java +++ b/header/src/main/java/org/zstack/header/identity/APICreatePolicyEvent.java @@ -34,7 +34,7 @@ public static APICreatePolicyEvent __example__() { inventory.setName("USER-RESET-PASSWORD"); PolicyStatement s = new PolicyStatement(); s.setName(String.format("user-reset-password-%s", inventory.getUuid())); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", AccountConstant.ACTION_CATEGORY, APIUpdateUserMsg.class.getSimpleName())); inventory.setStatements(list(s)); diff --git a/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java b/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java index 077fafd1c9c..af30ad57792 100755 --- a/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APICreatePolicyMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APICreateMessage; import org.zstack.header.message.APIEvent; import org.zstack.header.message.APIMessage; @@ -17,7 +18,8 @@ path = "/accounts/policies", method = HttpMethod.POST, responseClass = APICreatePolicyEvent.class, - parameterName = "params" + parameterName = "params", + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APICreatePolicyMsg extends APICreateMessage implements AccountMessage, APIAuditor { @APIParam(maxLength = 255) @@ -63,7 +65,7 @@ public static APICreatePolicyMsg __example__() { PolicyStatement s = new PolicyStatement(); s.setName(String.format("user-reset-password-%s", uuid())); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", AccountConstant.ACTION_CATEGORY, APIUpdateUserMsg.class.getSimpleName())); msg.setStatements(list(s)); diff --git a/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java b/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java index 6a95307a1cd..7f7dddbd901 100755 --- a/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIDeleteAccountMsg.java @@ -1,9 +1,8 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIEvent; -import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -14,7 +13,8 @@ @RestRequest( path = "/accounts/{uuid}", method = HttpMethod.DELETE, - responseClass = APIDeleteAccountEvent.class + responseClass = APIDeleteAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIDeleteAccountMsg extends APIDeleteMessage implements AccountMessage { @APIParam(resourceType = AccountVO.class, successIfResourceNotExisting = true) diff --git a/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java b/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java index 6fcd8f91217..b5338ec0126 100755 --- a/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIDeletePolicyMsg.java @@ -1,9 +1,8 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIEvent; -import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -14,7 +13,8 @@ @RestRequest( path = "/accounts/policies/{uuid}", method = HttpMethod.DELETE, - responseClass = APIDeletePolicyEvent.class + responseClass = APIDeletePolicyEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIDeletePolicyMsg extends APIDeleteMessage implements AccountMessage { @APIParam(resourceType = PolicyVO.class, successIfResourceNotExisting = true) diff --git a/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java b/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java index 26e64ec8b9b..4732ada1fe4 100755 --- a/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java +++ b/header/src/main/java/org/zstack/header/identity/APIQueryPolicyReply.java @@ -30,7 +30,7 @@ public static APIQueryPolicyReply __example__() { inventory.setName("USER-RESET-PASSWORD"); PolicyStatement s = new PolicyStatement(); s.setName(String.format("user-reset-password-%s", inventory.getUuid())); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", AccountConstant.ACTION_CATEGORY, APIUpdateUserMsg.class.getSimpleName())); inventory.setStatements(list(s)); diff --git a/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java b/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java index d60053a40a9..15b33ee87c0 100755 --- a/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIUpdateAccountMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.log.NoLogging; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; @@ -13,7 +14,8 @@ path = "/accounts/{uuid}", method = HttpMethod.PUT, isAction = true, - responseClass = APIUpdateAccountEvent.class + responseClass = APIUpdateAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIUpdateAccountMsg extends APIMessage implements AccountMessage, Serializable { @APIParam(resourceType = AccountVO.class, checkAccount = true, operationTarget = true) diff --git a/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java b/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java index d111fa4fbca..bac63de35a3 100755 --- a/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java +++ b/header/src/main/java/org/zstack/header/identity/APIUpdateQuotaMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.APINoSee; @@ -13,7 +14,8 @@ path = "/accounts/quotas/actions", responseClass = APIUpdateQuotaEvent.class, isAction = true, - method = HttpMethod.PUT + method = HttpMethod.PUT, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIUpdateQuotaMsg extends APIMessage implements AccountMessage { @APIParam(resourceType = AccountVO.class) diff --git a/header/src/main/java/org/zstack/header/identity/AccountConstant.java b/header/src/main/java/org/zstack/header/identity/AccountConstant.java index 4da247d1651..7e376a915e9 100755 --- a/header/src/main/java/org/zstack/header/identity/AccountConstant.java +++ b/header/src/main/java/org/zstack/header/identity/AccountConstant.java @@ -39,6 +39,9 @@ public interface AccountConstant { String PREFERRED_USERNAME = "preferred_username"; String FULL_NAME = "fullname"; + String Phone_NAME = "phone"; + String Mail_NAME = "mail"; + String Identifier_NAME = "identifier"; String LOGIN_TYPE_NAME = "loginType"; String GROUPS_NAME = "groups"; String PROJECTS_NAME = "projects"; diff --git a/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy index 3c19a6c7aed..a86a4c77c8c 100755 --- a/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/identity/PolicyInventory_StatementDoc_zh_cn.groovy @@ -14,9 +14,9 @@ doc { name "effect" path "org.zstack.header.identity.PolicyInventory.Statement.effect" desc "声明的效果(许可,禁止)" - type "StatementEffect" + type "PolicyStatementEffect" since "0.6" - clz StatementEffect.class + clz PolicyStatementEffect.class } field { name "principals" diff --git a/header/src/main/java/org/zstack/header/identity/PolicyStatement.java b/header/src/main/java/org/zstack/header/identity/PolicyStatement.java index 01415cdacb8..d4a6f0c5de5 100755 --- a/header/src/main/java/org/zstack/header/identity/PolicyStatement.java +++ b/header/src/main/java/org/zstack/header/identity/PolicyStatement.java @@ -10,7 +10,7 @@ @SDK(sdkClassName = "PolicyStatement") public class PolicyStatement { private String name; - private StatementEffect effect; + private PolicyStatementEffect effect; private List principals; private List actions; private List resources; @@ -31,11 +31,11 @@ public void setName(String name) { this.name = name; } - public StatementEffect getEffect() { + public PolicyStatementEffect getEffect() { return effect; } - public void setEffect(StatementEffect effect) { + public void setEffect(PolicyStatementEffect effect) { this.effect = effect; } @@ -77,7 +77,7 @@ public static PolicyStatementBuilder builder() { public static final class PolicyStatementBuilder { private String name; - private StatementEffect effect; + private PolicyStatementEffect effect; private List principals; private List actions; private List resources; @@ -90,7 +90,7 @@ public PolicyStatementBuilder name(String name) { return this; } - public PolicyStatementBuilder effect(StatementEffect effect) { + public PolicyStatementBuilder effect(PolicyStatementEffect effect) { this.effect = effect; return this; } diff --git a/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy index 2228b37593d..266954dde18 100644 --- a/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/identity/PolicyStatementDoc_zh_cn.groovy @@ -1,7 +1,5 @@ package org.zstack.header.identity -import org.zstack.header.identity.StatementEffect - doc { title "在这里输入结构的名称" @@ -16,9 +14,9 @@ doc { name "effect" path "org.zstack.header.identity.PolicyStatement.effect" desc "null" - type "StatementEffect" + type "PolicyStatementEffect" since "0.6" - clz StatementEffect.class + clz PolicyStatementEffect.class } field { name "principals" diff --git a/header/src/main/java/org/zstack/header/identity/StatementEffect.java b/header/src/main/java/org/zstack/header/identity/PolicyStatementEffect.java old mode 100755 new mode 100644 similarity index 79% rename from header/src/main/java/org/zstack/header/identity/StatementEffect.java rename to header/src/main/java/org/zstack/header/identity/PolicyStatementEffect.java index 2706cffeb19..6c616c1e1d5 --- a/header/src/main/java/org/zstack/header/identity/StatementEffect.java +++ b/header/src/main/java/org/zstack/header/identity/PolicyStatementEffect.java @@ -3,7 +3,7 @@ import org.zstack.header.rest.SDK; @SDK(sdkClassName = "PolicyStatementEffect") -public enum StatementEffect { +public enum PolicyStatementEffect { Allow, Deny, } diff --git a/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java b/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java index d8de8552f6a..9a23ad4f10b 100644 --- a/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java +++ b/header/src/main/java/org/zstack/header/identity/login/APILogInMsg.java @@ -112,4 +112,17 @@ public LoginResult loginAudit(APIMessage msg, APIReply reply) { String resourceUuid = reply.isSuccess() ? ((APILogInReply) reply).getInventory().getUuid() : ""; return new LoginResult(clientIp, clientBrowser, resourceUuid, SessionVO.class); } + + @Override + public String getOperator() { + return username; + } + + public static APILogInMsg __example__() { + APILogInMsg msg = new APILogInMsg(); + msg.setUsername("admin"); + msg.setPassword("password"); + msg.setLoginType("account"); + return msg; + } } diff --git a/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java b/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java index 2e8fafae90f..94526e17c45 100644 --- a/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java +++ b/header/src/main/java/org/zstack/header/identity/login/LoginAuthConstant.java @@ -12,4 +12,5 @@ public interface LoginAuthConstant { String LOGIN_SESSION_INVENTORY = "LOGIN_SESSION_INVENTORY"; String LOGIN_SESSION_INFO = "LOGIN_SESSION_INFO"; + String LOGIN_SESSION_UUID = "LOGIN_SESSION_UUID"; } diff --git a/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java b/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java index b1270efd25d..b6b5a97de16 100644 --- a/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java +++ b/header/src/main/java/org/zstack/header/identity/login/LoginBackend.java @@ -28,8 +28,4 @@ public interface LoginBackend { default Set possibleUserUuidSetForGettingProcedures(LoginContext loginContext) { return Collections.emptySet(); } - - default Map generateJwtTokenClaims(LoginContext loginContext, LoginSessionInfo info) { - return new HashMap<>(); - } } diff --git a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java new file mode 100644 index 00000000000..96cf2ba6852 --- /dev/null +++ b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefBuilder.java @@ -0,0 +1,99 @@ +package org.zstack.header.identity.quota; + +import org.zstack.utils.DebugUtils; + +public class QuotaDefBuilder { + private String name; + private Long defaultValue; + private Long repairValue; + private GetQuotaUsage getUsage; + + public static QuotaDefBuilder newBuilder() { + return new QuotaDefBuilder(); + } + + public QuotaDefBuilder name(String name) { + this.name = name; + return this; + } + + public QuotaDefBuilder defaultValue(Long defaultValue) { + this.defaultValue = defaultValue; + return this; + } + + public QuotaDefBuilder repairValue(Long repairValue) { + this.repairValue = repairValue; + return this; + } + + public QuotaDefBuilder getUsage(GetQuotaUsage usage) { + this.getUsage = usage; + return this; + } + + public interface GetQuotaUsage { + Long apply(String accountUuid, String name); + } + + static class QuotaDefinitionImpl implements QuotaDefinition { + private String name; + private Long defaultValue; + private GetQuotaUsage getUsage; + private Long repairValue; + + @Override + public String getName() { + return this.name; + } + + @Override + public Long getDefaultValue() { + return this.defaultValue; + } + + @Override + public Long getQuotaUsage(String accountUuid) { + return getUsage.apply(accountUuid, name); + } + + public void setName(String name) { + this.name = name; + } + + public void setDefaultValue(Long defaultValue) { + this.defaultValue = defaultValue; + } + + public GetQuotaUsage getGetUsage() { + return getUsage; + } + + public void setGetUsage(GetQuotaUsage getUsage) { + this.getUsage = getUsage; + } + + @Override + public Long getRepairValue() { + return repairValue; + } + + public void setRepairValue(Long repairValue) { + this.repairValue = repairValue; + } + } + + public QuotaDefinition build() { + DebugUtils.Assert(this.name != null, "quota name is required"); + DebugUtils.Assert(this.defaultValue != null, "quota defaultValue is required"); + DebugUtils.Assert(this.getUsage != null, "quota getUsage is required"); + DebugUtils.Assert(this.repairValue != null, "quota repairValue is required"); + + QuotaDefinitionImpl quota = new QuotaDefinitionImpl(); + quota.name = this.name; + quota.defaultValue = this.defaultValue; + quota.getUsage = this.getUsage; + quota.repairValue = this.repairValue; + return quota; + } +} diff --git a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java index 2fb11031d74..2cdefa2a24b 100644 --- a/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java +++ b/header/src/main/java/org/zstack/header/identity/quota/QuotaDefinition.java @@ -18,4 +18,13 @@ public interface QuotaDefinition { * no usage supported */ Long getQuotaUsage(String accountUuid); + + /** + * Gets the repair value for the quota. + * + * @return the repair value as a Long. If the value is null, it indicates that the repair value is unavailable or not supported. + */ + default Long getRepairValue() { + return null; + } } diff --git a/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java b/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java index 07bee62dd29..5e1183c8522 100755 --- a/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java +++ b/header/src/main/java/org/zstack/header/identity/rbac/RBAC.java @@ -4,15 +4,13 @@ import org.zstack.header.core.StaticInit; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.SuppressCredentialCheck; import org.zstack.header.message.APIMessage; import org.zstack.utils.BeanUtils; import org.zstack.utils.DebugUtils; import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class RBAC { public static List permissions = new ArrayList<>(); @@ -113,12 +111,12 @@ public RoleBuilder permissionsByName(String...pnames) { } public RoleBuilder allow() { - role.effect = StatementEffect.Allow; + role.effect = PolicyStatementEffect.Allow; return this; } public RoleBuilder deny() { - role.effect = StatementEffect.Deny; + role.effect = PolicyStatementEffect.Deny; return this; } @@ -155,7 +153,7 @@ public static class Role { private String uuid; private String name; private Set allowedActions = new HashSet<>(); - private StatementEffect effect = StatementEffect.Allow; + private PolicyStatementEffect effect = PolicyStatementEffect.Allow; private boolean adminOnly; private boolean predefine = true; private List excludedActions = new ArrayList<>(); @@ -184,11 +182,11 @@ public void setAllowedActions(Set allowedActions) { this.allowedActions = allowedActions; } - public StatementEffect getEffect() { + public PolicyStatementEffect getEffect() { return effect; } - public void setEffect(StatementEffect effect) { + public void setEffect(PolicyStatementEffect effect) { this.effect = effect; } diff --git a/header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..3e4a7b81078 --- /dev/null +++ b/header/src/main/java/org/zstack/header/identity/role/RolePolicyRefInventoryDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.header.identity.role + +doc { + + title "角色策略引用清单" + + field { + name "roleUuid" + desc "角色的UUID" + type "String" + since "2.4.0" + } + field { + name "policyUuid" + desc "策略的UUID" + type "String" + since "2.4.0" + } + field { + name "createDate" + desc "创建日期" + type "Timestamp" + since "2.4.0" + } + field { + name "lastOpDate" + desc "最后操作日期" + type "Timestamp" + since "2.4.0" + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy new file mode 100644 index 00000000000..88d0e15d4bb --- /dev/null +++ b/header/src/main/java/org/zstack/header/identity/role/RoleStateDoc_zh_cn.groovy @@ -0,0 +1,19 @@ +package org.zstack.header.identity.role + +doc { + + title "角色状态" + + field { + name "name" + desc "角色启用状态" + type "String" + since "2.4.0" + } + field { + name "ordinal" + desc "" + type "int" + since "2.4.0" + } +} diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java index db8433f44f8..abaf94ccf91 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIAddPolicyStatementsToRoleMsg.java @@ -2,7 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; @@ -48,7 +48,7 @@ public static APIAddPolicyStatementsToRoleMsg __example__() { PolicyStatement state = new PolicyStatement(); state.setName("state-1"); - state.setEffect(StatementEffect.Allow); + state.setEffect(PolicyStatementEffect.Allow); state.setActions(asList("accpet")); msg.setStatements(asList(state)); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java index 4bbc3a1b4cb..872f4001c8f 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIAttachRoleToAccountMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.AccountVO; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIMessage; @@ -11,7 +12,8 @@ path = "/identities/accounts/{accountUuid}/roles/{roleUuid}", method = HttpMethod.POST, parameterName = "params", - responseClass = APIAttachRoleToAccountEvent.class + responseClass = APIAttachRoleToAccountEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1 ) public class APIAttachRoleToAccountMsg extends APIMessage implements RoleMessage { @APIParam(resourceType = RoleVO.class) diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java b/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java index b558f9cc2e5..def7e59ff3d 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIChangeRoleStateEvent.java @@ -1,7 +1,7 @@ package org.zstack.header.identity.role.api; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleInventory; import org.zstack.header.identity.role.RolePolicyStatementInventory; import org.zstack.header.identity.role.RoleState; @@ -40,7 +40,7 @@ public static APIChangeRoleStateEvent __example__() { RolePolicyStatementInventory inv = new RolePolicyStatementInventory(); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java index ba32ecf9e46..6de9a7a4282 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleEvent.java @@ -1,7 +1,7 @@ package org.zstack.header.identity.role.api; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleInventory; import org.zstack.header.identity.role.RolePolicyStatementInventory; import org.zstack.header.identity.role.RoleState; @@ -40,7 +40,7 @@ public static APICreateRoleEvent __example__() { role.setName("role-1"); RolePolicyStatementInventory inv = new RolePolicyStatementInventory(); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java index 439eb5011c1..e681b1781cc 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APICreateRoleMsg.java @@ -1,9 +1,10 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.PolicyStatement; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyVO; -import org.zstack.header.identity.StatementEffect; import org.zstack.header.message.APICreateMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -12,7 +13,7 @@ import static java.util.Arrays.asList; -@RestRequest(path = "/identities/roles", method = HttpMethod.POST, responseClass = APICreateRoleEvent.class, parameterName = "params") +@RestRequest(path = "/identities/roles", method = HttpMethod.POST, responseClass = APICreateRoleEvent.class, parameterName = "params", morphTransform = Constants.MORPH_TRANSFORM_IAM2) public class APICreateRoleMsg extends APICreateMessage { @APIParam(maxLength = 255) private String name; @@ -70,7 +71,7 @@ public static APICreateRoleMsg __example__() { msg.setPolicyUuids(asList(uuid())); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); msg.setStatements(asList(statement)); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java index 480ca3f8f0f..9f5db41b10e 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIDeleteRoleMsg.java @@ -1,13 +1,13 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; -import org.zstack.header.network.l3.APIAddDnsToL3NetworkMsg; import org.zstack.header.rest.RestRequest; -@RestRequest(path = "/identities/roles/{uuid}", method = HttpMethod.DELETE, responseClass = APIDeleteRoleEvent.class) +@RestRequest(path = "/identities/roles/{uuid}", method = HttpMethod.DELETE, responseClass = APIDeleteRoleEvent.class, morphTransform = Constants.MORPH_TRANSFORM_IAM2) public class APIDeleteRoleMsg extends APIDeleteMessage implements RoleMessage { @APIParam(resourceType = RoleVO.class, successIfResourceNotExisting = true) private String uuid; diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java index 2b53ed34b1f..319ec0d6a98 100755 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIDetachRoleFromAccountMsg.java @@ -1,15 +1,12 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; -import org.zstack.header.identity.AccountVO; -import org.zstack.header.identity.role.RoleStateEvent; -import org.zstack.header.identity.role.RoleVO; +import org.zstack.header.Constants; import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; -@RestRequest(path = "/identities/accounts/{accountUuid}/roles/{roleUuid}", method = HttpMethod.DELETE, responseClass = APIDetachRoleFromAccountEvent.class) +@RestRequest(path = "/identities/accounts/{accountUuid}/roles/{roleUuid}", method = HttpMethod.DELETE, responseClass = APIDetachRoleFromAccountEvent.class, morphTransform = Constants.MORPH_TRANSFORM_IAM1) public class APIDetachRoleFromAccountMsg extends APIDeleteMessage implements RoleMessage { @APIParam private String roleUuid; diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java index 488b2c027de..007dd62f6de 100644 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleEvent.java @@ -1,7 +1,7 @@ package org.zstack.header.identity.role.api; import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleInventory; import org.zstack.header.identity.role.RolePolicyStatementInventory; import org.zstack.header.identity.role.RoleState; @@ -43,7 +43,7 @@ public static APIUpdateRoleEvent __example__() { role.setName("role-1"); RolePolicyStatementInventory inv = new RolePolicyStatementInventory(); PolicyStatement statement = new PolicyStatement(); - statement.setEffect(StatementEffect.Allow); + statement.setEffect(PolicyStatementEffect.Allow); statement.setActions(asList("org.zstack.header.vm.APICreateVmInstanceMsg")); statement.setName("statement for test"); diff --git a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java index 1800157f600..9064e8d56a9 100644 --- a/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java +++ b/header/src/main/java/org/zstack/header/identity/role/api/APIUpdateRoleMsg.java @@ -1,9 +1,10 @@ package org.zstack.header.identity.role.api; import org.springframework.http.HttpMethod; +import org.zstack.header.Constants; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.PolicyVO; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.role.RoleVO; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; @@ -18,7 +19,8 @@ @RestRequest(path = "/identities/roles/{uuid}/actions", method = HttpMethod.PUT, isAction = true, - responseClass = APIUpdateRoleEvent.class) + responseClass = APIUpdateRoleEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM1) public class APIUpdateRoleMsg extends APIMessage implements RoleMessage { @APIParam(resourceType = RoleVO.class) private String uuid; @@ -76,7 +78,7 @@ public static APIUpdateRoleMsg __example__() { msg.setName("role-1"); msg.setPolicyUuids(Arrays.asList(uuid())); PolicyStatement policy = new PolicyStatement(); - policy.setEffect(StatementEffect.Allow); + policy.setEffect(PolicyStatementEffect.Allow); policy.setName("test role"); policy.setActions(Arrays.asList("org.zstack.header.identity.role.api.APIUpdateRoleMsg")); msg.setStatements(Arrays.asList(new PolicyStatement())); diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageEvent.java b/header/src/main/java/org/zstack/header/image/APICloneImageEvent.java new file mode 100644 index 00000000000..4798d138287 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageEvent.java @@ -0,0 +1,53 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +import java.util.Collections; + +@RestResponse(allTo = "inventory") +public class APICloneImageEvent extends APIEvent { + public APICloneImageEvent(String apiId) { + super(apiId); + } + + public APICloneImageEvent() { + super(null); + } + + private ImageInventory inventory; + + public ImageInventory getInventory() { + return inventory; + } + + public void setInventory(ImageInventory inventory) { + this.inventory = inventory; + } + + public static APICloneImageEvent __example__() { + APICloneImageEvent event = new APICloneImageEvent(); + + ImageInventory inv = new ImageInventory(); + inv.setUuid(uuid()); + + ImageBackupStorageRefInventory ref = new ImageBackupStorageRefInventory(); + ref.setBackupStorageUuid(uuid()); + ref.setImageUuid(inv.getUuid()); + ref.setInstallPath("ceph://zs-images/f0b149e053b34c7eb7fe694b182ebffd"); + ref.setStatus(ImageStatus.Ready.toString()); + + inv.setName("TinyLinux"); + inv.setBackupStorageRefs(Collections.singletonList(ref)); + inv.setUrl("http://192.168.1.20/share/images/tinylinux.qcow2"); + inv.setFormat(ImageConstant.QCOW2_FORMAT_STRING); + inv.setMediaType(ImageConstant.ImageMediaType.RootVolumeTemplate.toString()); + inv.setPlatform(ImagePlatform.Linux.toString()); + inv.setArchitecture(ImageArchitecture.x86_64.toString()); + + event.setInventory(inv); + return event; + } + +} + diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..f406289e561 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "克隆镜像的执行结果" + + ref { + name "inventory" + path "org.zstack.header.image.APICloneImageEvent.inventory" + desc "null" + type "ImageInventory" + since "5.4.0" + clz ImageInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APICloneImageEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java b/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java new file mode 100644 index 00000000000..5f614e6f304 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageMsg.java @@ -0,0 +1,52 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.*; +import org.zstack.header.other.APIAuditor; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +@TagResourceType(ImageVO.class) +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/image/clone/{imageUuid}", + method = HttpMethod.POST, + parameterName = "params", + responseClass = APICloneImageEvent.class +) +public class APICloneImageMsg extends APICreateMessage implements APIAuditor { + @APIParam(resourceType = ImageVO.class, noOwnerCheck = true) + private String imageUuid; + + @APIParam(required = false, validValues = {"DatabaseOnly"}) + private String strategy = ImageCloneStrategy.DatabaseOnly.toString(); + + @Override + public Result audit(APIMessage msg, APIEvent rsp) { + return null; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getStrategy() { + return strategy; + } + + public void setStrategy(String strategy) { + this.strategy = strategy; + } + + public static APICloneImageMsg __example__() { + APICloneImageMsg msg = new APICloneImageMsg(); + msg.setImageUuid(uuid()); + msg.setStrategy(ImageCloneStrategy.DatabaseOnly.toString()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..22d7a47e1b0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICloneImageMsgDoc_zh_cn.groovy @@ -0,0 +1,95 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICloneImageEvent + +doc { + title "CloneImage" + + category "image" + + desc """克隆镜像""" + + rest { + request { + url "POST /v1/image/clone/{imageUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICloneImageMsg.class + + desc """""" + + params { + + column { + name "imageUuid" + enclosedIn "params" + desc "镜像UUID" + location "url" + type "String" + optional false + since "5.4.0" + } + column { + name "imageGroupUuid" + enclosedIn "params" + desc "镜像组UUID" + location "body" + type "String" + optional false + since "5.4.0" + } + column { + name "strategy" + enclosedIn "params" + desc "克隆策略" + location "body" + type "String" + optional true + since "5.4.0" + values ("DatabaseOnly") + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.4.0" + } + } + } + + response { + clz APICloneImageEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java new file mode 100644 index 00000000000..46641ac1ebb --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEvent.java @@ -0,0 +1,35 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APICreateImageGroupFromImageEvent extends APIEvent { + ImageGroupInventory inventory; + + public APICreateImageGroupFromImageEvent(String apiId) { + super(apiId); + } + + public APICreateImageGroupFromImageEvent() { + super(); + } + + public void setInventory(ImageGroupInventory imageGroup) { + this.inventory = imageGroup; + } + + public ImageGroupInventory getInventory() { + return inventory; + } + + public static APICreateImageGroupFromImageEvent __example__() { + APICreateImageGroupFromImageEvent event = new APICreateImageGroupFromImageEvent(); + ImageGroupInventory inv = new ImageGroupInventory(); + inv.setUuid("f0b149e0-53b3-4c7e-b7fe-694b182ebffd"); + inv.setName("example-image-group"); + inv.setDescription("example image group"); + event.setInventory(inv); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..7eafd031064 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "从镜像创建镜像组的返回" + + ref { + name "inventory" + path "org.zstack.header.image.APICreateImageGroupFromImageEvent.inventory" + desc "null" + type "ImageGroupInventory" + since "5.4.0" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APICreateImageGroupFromImageEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java new file mode 100644 index 00000000000..7f8d6fd8c39 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsg.java @@ -0,0 +1,72 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +import java.util.List; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/imagegroup/from/image/{rootVolumeTemplateUuid}", + method = HttpMethod.POST, + responseClass = APICreateImageGroupFromImageEvent.class, + parameterName = "params" +) +@TagResourceType(ImageVO.class) +public class APICreateImageGroupFromImageMsg extends APICreateMessage { + @APIParam(maxLength = 255) + private String name; + @APIParam(required = true, maxLength = 2048) + private String rootVolumeTemplateUuid; + @APIParam(required = false, maxLength = 2048) + private String description; + @APIParam(required = false) + private List dataVolumeTemplateUuids; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRootVolumeTemplateUuid() { + return rootVolumeTemplateUuid; + } + + public void setRootVolumeTemplateUuid(String rootVolumeTemplateUuid) { + this.rootVolumeTemplateUuid = rootVolumeTemplateUuid; + } + + public List getDataVolumeTemplateUuids() { + return dataVolumeTemplateUuids; + } + + public void setDataVolumeTemplateUuids(List dataVolumeTemplateUuids) { + this.dataVolumeTemplateUuids = dataVolumeTemplateUuids; + } + + public static APICreateImageGroupFromImageMsg __example__() { + APICreateImageGroupFromImageMsg msg = new APICreateImageGroupFromImageMsg(); + msg.setRootVolumeTemplateUuid("b7b9dcad-3c6d-4a7b-9a0a-1b9a20f5c002"); + msg.setName("example-image-group-from-image"); + msg.setDescription("create image group from root image template"); + msg.setDataVolumeTemplateUuids(java.util.Arrays.asList( + "c1b9dcad-3c6d-4a7b-9a0a-1b9a20f5c003", + "d2b9dcad-3c6d-4a7b-9a0a-1b9a20f5c004")); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..e41d9eed7f6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromImageMsgDoc_zh_cn.groovy @@ -0,0 +1,103 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICreateImageGroupFromImageEvent + +doc { + title "CreateImageGroupFromImage" + + category "image" + + desc """从镜像创建镜像组""" + + rest { + request { + url "POST /v1/imagegroup/from/image/{rootVolumeTemplateUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateImageGroupFromImageMsg.class + + desc """""" + + params { + + column { + name "name" + enclosedIn "params" + desc "资源名称" + location "body" + type "String" + optional false + since "5.4.0" + } + column { + name "rootVolumeTemplateUuid" + enclosedIn "params" + desc "" + location "url" + type "String" + optional false + since "5.4.0" + } + column { + name "description" + enclosedIn "params" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "dataVolumeTemplateUuids" + enclosedIn "params" + desc "数据盘镜像模板 UUID 列表" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.4.0" + } + } + } + + response { + clz APICreateImageGroupFromImageEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java new file mode 100644 index 00000000000..aed70766b0c --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEvent.java @@ -0,0 +1,34 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APICreateImageGroupFromSnapshotEvent extends APIEvent { + ImageGroupInventory inventory; + + public APICreateImageGroupFromSnapshotEvent(String apiId) { + super(apiId); + } + + public APICreateImageGroupFromSnapshotEvent() { + super(); + } + + public void setInventory(ImageGroupInventory imageGroup) { + this.inventory = imageGroup; + } + + public ImageGroupInventory getInventory() { + return inventory; + } + + public static APICreateImageGroupFromSnapshotEvent __example__() { + APICreateImageGroupFromSnapshotEvent event = new APICreateImageGroupFromSnapshotEvent(); + ImageGroupInventory inv = new ImageGroupInventory(); + inv.setUuid("a4b149e0-53b3-4c7e-b7fe-694b182eb001"); + inv.setName("example-image-group-from-snapshot"); + event.setInventory(inv); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..601a0ea15c7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "从快照创建镜像组的返回" + + ref { + name "inventory" + path "org.zstack.header.image.APICreateImageGroupFromSnapshotEvent.inventory" + desc "null" + type "ImageGroupInventory" + since "5.4.0" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APICreateImageGroupFromSnapshotEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java new file mode 100644 index 00000000000..74fd042043c --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsg.java @@ -0,0 +1,73 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; + +import java.util.List; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/imagegroup/from/snapshot/{rootVolumeSnapshotUuid}", + method = HttpMethod.POST, + responseClass = APICreateImageGroupFromSnapshotEvent.class, + parameterName = "params" +) +@TagResourceType(ImageVO.class) +public class APICreateImageGroupFromSnapshotMsg extends APICreateMessage { + @APIParam(maxLength = 255) + private String name; + @APIParam(required = true, maxLength = 2048) + private String rootVolumeSnapshotUuid; + @APIParam(required = false, maxLength = 2048) + private String description; + @APIParam(required = false) + private List dataVolumeSnapshotUuids; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRootVolumeSnapshotUuid() { + return rootVolumeSnapshotUuid; + } + + public void setRootVolumeSnapshotUuid(String rootVolumeSnapshotUuid) { + this.rootVolumeSnapshotUuid = rootVolumeSnapshotUuid; + } + + public List getDataVolumeSnapshotUuids() { + return dataVolumeSnapshotUuids; + } + + public void setDataVolumeSnapshotUuids(List dataVolumeSnapshotUuids) { + this.dataVolumeSnapshotUuids = dataVolumeSnapshotUuids; + } + + public static APICreateImageGroupFromSnapshotMsg __example__() { + APICreateImageGroupFromSnapshotMsg msg = new APICreateImageGroupFromSnapshotMsg(); + msg.setRootVolumeSnapshotUuid("aa12b3cd-3c6d-4a7b-9a0a-1b9a20f5c005"); + msg.setName("example-image-group-from-snapshot"); + msg.setDescription("create image group from root volume snapshot"); + msg.setDataVolumeSnapshotUuids(java.util.Arrays.asList( + "bb12b3cd-3c6d-4a7b-9a0a-1b9a20f5c006", + "cc12b3cd-3c6d-4a7b-9a0a-1b9a20f5c007" + )); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..a89468d1adc --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromSnapshotMsgDoc_zh_cn.groovy @@ -0,0 +1,103 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICreateImageGroupFromSnapshotEvent + +doc { + title "CreateImageGroupFromSnapshot" + + category "image" + + desc """从快照创建镜像组""" + + rest { + request { + url "POST /v1/imagegroup/from/snapshot/{rootVolumeSnapshotUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateImageGroupFromSnapshotMsg.class + + desc """""" + + params { + + column { + name "name" + enclosedIn "params" + desc "资源名称" + location "body" + type "String" + optional false + since "5.4.0" + } + column { + name "rootVolumeSnapshotUuid" + enclosedIn "params" + desc "" + location "url" + type "String" + optional false + since "5.4.0" + } + column { + name "description" + enclosedIn "params" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "dataVolumeSnapshotUuids" + enclosedIn "params" + desc "数据盘快照 UUID 列表" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.4.0" + } + } + } + + response { + clz APICreateImageGroupFromSnapshotEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java new file mode 100644 index 00000000000..21cc3c92b1e --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEvent.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APICreateImageGroupFromVmInstanceEvent extends APIEvent { + ImageGroupInventory inventory; + + public APICreateImageGroupFromVmInstanceEvent(String apiId) { + super(apiId); + } + + public APICreateImageGroupFromVmInstanceEvent() { + super(); + } + + public void setInventory(ImageGroupInventory imageGroup) { + this.inventory = imageGroup; + } + + public ImageGroupInventory getInventory() { + return inventory; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..c7472afdbdc --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "从虚拟机创建镜像组的返回" + + ref { + name "inventory" + path "org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent.inventory" + desc "null" + type "ImageGroupInventory" + since "5.4.0" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java new file mode 100644 index 00000000000..b36db132359 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsg.java @@ -0,0 +1,58 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; +import org.zstack.header.vm.VmInstanceVO; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/images/groups/from/vm-instance", + method = HttpMethod.POST, + responseClass = APICreateImageGroupFromVmInstanceEvent.class, + parameterName = "params" +) +@TagResourceType(ImageVO.class) +public class APICreateImageGroupFromVmInstanceMsg extends APICreateMessage { + @APIParam(resourceType = VmInstanceVO.class, checkAccount = true, operationTarget = true) + private String vmInstanceUuid; + @APIParam(maxLength = 255) + private String name; + @APIParam(required = false, maxLength = 2048) + private String description; + + public String getVmInstanceUuid() { + return vmInstanceUuid; + } + + public void setVmInstanceUuid(String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public static APICreateImageGroupFromVmInstanceMsg __example__() { + APICreateImageGroupFromVmInstanceMsg msg = new APICreateImageGroupFromVmInstanceMsg(); + msg.setVmInstanceUuid("e7b9dcad-3c6d-4a7b-9a0a-1b9a20f5c001"); + msg.setName("example-image-group-from-vm"); + msg.setDescription("create image group from vm instance"); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..cecf4966ac4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APICreateImageGroupFromVmInstanceMsgDoc_zh_cn.groovy @@ -0,0 +1,94 @@ +package org.zstack.header.image + +import org.zstack.header.image.APICreateImageGroupFromVmInstanceEvent + +doc { + title "CreateImageGroupFromVmInstance" + + category "image" + + desc """从虚拟机创建镜像组""" + + rest { + request { + url "POST /v1/images/groups/from/vm-instance" + + header (Authorization: 'OAuth the-session-uuid') + + clz APICreateImageGroupFromVmInstanceMsg.class + + desc """""" + + params { + + column { + name "vmInstanceUuid" + enclosedIn "params" + desc "云主机UUID" + location "body" + type "String" + optional false + since "5.4.0" + } + column { + name "name" + enclosedIn "params" + desc "资源名称" + location "body" + type "String" + optional false + since "5.4.0" + } + column { + name "description" + enclosedIn "params" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "resourceUuid" + enclosedIn "params" + desc "资源UUID" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "tagUuids" + enclosedIn "params" + desc "标签UUID列表" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.4.0" + } + } + } + + response { + clz APICreateImageGroupFromVmInstanceEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java new file mode 100644 index 00000000000..d6499a9505d --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEvent.java @@ -0,0 +1,21 @@ +package org.zstack.header.image; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +@RestResponse +public class APIExpungeImageGroupEvent extends APIEvent { + public APIExpungeImageGroupEvent() { + } + + public APIExpungeImageGroupEvent(String apiId) { + super(apiId); + } + + public static APIExpungeImageGroupEvent __example__() { + APIExpungeImageGroupEvent event = new APIExpungeImageGroupEvent(); + + + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..95b4c0d40ad --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupEventDoc_zh_cn.groovy @@ -0,0 +1,23 @@ +package org.zstack.header.image + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "删除镜像组的返回" + + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APIExpungeImageGroupEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null" + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java new file mode 100644 index 00000000000..849fd236442 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsg.java @@ -0,0 +1,33 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@Action(category = ImageConstant.ACTION_CATEGORY) +@RestRequest( + path = "/imagegroups/{uuid}/actions", + method = HttpMethod.PUT, + responseClass = APIExpungeImageGroupEvent.class, + isAction = true +) +public class APIExpungeImageGroupMsg extends APIMessage { + @APIParam(required = true, resourceType = ImageGroupVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public static APIExpungeImageGroupMsg __example__() { + APIExpungeImageGroupMsg msg = new APIExpungeImageGroupMsg(); + msg.setUuid(uuid()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..2a43cafb204 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIExpungeImageGroupMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.image + +import org.zstack.header.image.APIExpungeImageGroupEvent + +doc { + title "ExpungeImageGroup" + + category "image" + + desc """删除镜像组""" + + rest { + request { + url "PUT /v1/imagegroups/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIExpungeImageGroupMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "expungeImageGroup" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.4.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.4.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.4.0" + } + } + } + + response { + clz APIExpungeImageGroupEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java new file mode 100644 index 00000000000..383e304d76d --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsg.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.Collections; +import java.util.List; + +@AutoQuery(replyClass = APIQueryImageGroupReply.class, inventoryClass = ImageGroupInventory.class) +@Action(category = ImageConstant.ACTION_CATEGORY, names = {"read"}) +@RestRequest( + path = "/imagegroups", + optionalPaths = {"/imagegroups/{uuid}"}, + method = HttpMethod.GET, + responseClass = APIQueryImageGroupReply.class +) +public class APIQueryImageGroupMsg extends APIQueryMessage { + public static List __example__() { + return Collections.singletonList("uuid=" + uuid()); + } + +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..8d081b59021 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupMsgDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.header.image + +import org.zstack.header.image.APIQueryImageGroupReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryImageGroup" + + category "image" + + desc """查询镜像组""" + + rest { + request { + url "GET /v1/imagegroups" + url "GET /v1/imagegroups/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryImageGroupMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryImageGroupReply.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java new file mode 100644 index 00000000000..3fb9bf2466e --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsg.java @@ -0,0 +1,25 @@ +package org.zstack.header.image; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.Collections; +import java.util.List; + +@AutoQuery(replyClass = APIQueryImageGroupRefReply.class, inventoryClass = ImageGroupRefInventory.class) +@Action(category = ImageConstant.ACTION_CATEGORY, names = {"read"}) +@RestRequest( + path = "/imagegrouprefs", + optionalPaths = {"/imagegrouprefs/{imageGroupUuid}"}, + method = HttpMethod.GET, + responseClass = APIQueryImageGroupRefReply.class +) +public class APIQueryImageGroupRefMsg extends APIQueryMessage { + public static List __example__() { + return Collections.singletonList("uuid=" + uuid()); + } + +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..0cfd9617faf --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefMsgDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.header.image + +import org.zstack.header.image.APIQueryImageGroupRefReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryImageGroupRef" + + category "image" + + desc """查询镜像组关联关系""" + + rest { + request { + url "GET /v1/imagegrouprefs" + url "GET /v1/imagegrouprefs/{imageGroupUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryImageGroupRefMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryImageGroupRefReply.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java new file mode 100644 index 00000000000..3b6143b38dc --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReply.java @@ -0,0 +1,27 @@ +package org.zstack.header.image; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.List; + +@RestResponse(allTo = "inventories") +public class APIQueryImageGroupRefReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryImageGroupRefReply __example__() { + APIQueryImageGroupRefReply reply = new APIQueryImageGroupRefReply(); + + + return reply; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..f8e6d9fac4e --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupRefReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupRefInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "查询镜像组关联关系的返回" + + ref { + name "inventories" + path "org.zstack.header.image.APIQueryImageGroupRefReply.inventories" + desc "null" + type "List" + since "5.4.0" + clz ImageGroupRefInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APIQueryImageGroupRefReply.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null" + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java new file mode 100644 index 00000000000..277e04885e9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReply.java @@ -0,0 +1,27 @@ +package org.zstack.header.image; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.List; + +@RestResponse(allTo = "inventories") +public class APIQueryImageGroupReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryImageGroupReply __example__() { + APIQueryImageGroupReply reply = new APIQueryImageGroupReply(); + + + return reply; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..76e2651f944 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/APIQueryImageGroupReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.image + +import org.zstack.header.image.ImageGroupInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "查询镜像组的返回" + + ref { + name "inventories" + path "org.zstack.header.image.APIQueryImageGroupReply.inventories" + desc "null" + type "List" + since "5.4.0" + clz ImageGroupInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.4.0" + } + ref { + name "error" + path "org.zstack.header.image.APIQueryImageGroupReply.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.4.0" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java b/header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java new file mode 100644 index 00000000000..abd9fe2d361 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageCloneStrategy.java @@ -0,0 +1,5 @@ +package org.zstack.header.image; + +public enum ImageCloneStrategy { + DatabaseOnly, +} diff --git a/header/src/main/java/org/zstack/header/image/ImageEO.java b/header/src/main/java/org/zstack/header/image/ImageEO.java index acc78d4e409..b04867f6051 100755 --- a/header/src/main/java/org/zstack/header/image/ImageEO.java +++ b/header/src/main/java/org/zstack/header/image/ImageEO.java @@ -1,8 +1,6 @@ package org.zstack.header.image; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.persistence.*; /** */ diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupInventory.java b/header/src/main/java/org/zstack/header/image/ImageGroupInventory.java new file mode 100644 index 00000000000..9489aad53e1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupInventory.java @@ -0,0 +1,104 @@ +package org.zstack.header.image; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = ImageGroupVO.class, collectionValueOfMethod = "valueOf1") +public class ImageGroupInventory implements Serializable { + private Integer imageCount; + private String name; + private String description; + private String status; + private Timestamp createDate; + private Timestamp lastOpDate; + private String uuid; + + protected ImageGroupInventory(ImageGroupVO vo) { + this.setImageCount(vo.getImageCount()); + this.setName(vo.getName()); + this.setStatus(vo.getStatus().toString()); + this.setDescription(vo.getDescription()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + this.setUuid(vo.getUuid()); + } + + public static ImageGroupInventory valueOf(ImageGroupVO vo) { + return new ImageGroupInventory(vo); + } + + public static List valueOf1(Collection vos) { + List invs = new ArrayList(vos.size()); + for (ImageGroupVO vo : vos) { + invs.add(ImageGroupInventory.valueOf(vo)); + } + return invs; + } + + public ImageGroupInventory() { + } + + + public Integer getImageCount() { + return imageCount; + } + + public void setImageCount(Integer imageCount) { + this.imageCount = imageCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..af9ac25cbc3 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupInventoryDoc_zh_cn.groovy @@ -0,0 +1,52 @@ +package org.zstack.header.image + +import java.lang.Integer +import java.sql.Timestamp + +doc { + + title "镜像组清单" + + field { + name "imageCount" + desc "" + type "Integer" + since "5.4.0" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.4.0" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.4.0" + } + field { + name "status" + desc "" + type "String" + since "5.4.0" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.4.0" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.4.0" + } + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.4.0" + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java new file mode 100644 index 00000000000..c5d337cffc6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventory.java @@ -0,0 +1,74 @@ +package org.zstack.header.image; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = ImageGroupRefVO.class, collectionValueOfMethod = "valueOf1") +public class ImageGroupRefInventory implements Serializable { + private String imageUuid; + private String imageGroupUuid; + private Timestamp createDate; + private Timestamp lastOpDate; + + protected ImageGroupRefInventory(ImageGroupRefVO vo) { + this.setImageUuid(vo.getImageUuid()); + this.setImageGroupUuid(vo.getImageGroupUuid()); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + } + + public ImageGroupRefInventory() { + } + + public static ImageGroupRefInventory valueOf(ImageGroupRefVO vo) { + return new ImageGroupRefInventory(vo); + } + + public static List valueOf1(Collection vos) { + List invs = new ArrayList(vos.size()); + for (ImageGroupRefVO vo : vos) { + invs.add(ImageGroupRefInventory.valueOf(vo)); + } + return invs; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getImageGroupUuid() { + return imageGroupUuid; + } + + public void setImageGroupUuid(String imageGroupUuid) { + this.imageGroupUuid = imageGroupUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..eb3bc0d91b6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefInventoryDoc_zh_cn.groovy @@ -0,0 +1,33 @@ +package org.zstack.header.image + +import java.sql.Timestamp + +doc { + + title "镜像组引用结构清单" + + field { + name "imageUuid" + desc "镜像UUID" + type "String" + since "5.4.0" + } + field { + name "imageGroupUuid" + desc "" + type "String" + since "5.4.0" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.4.0" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.4.0" + } +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java new file mode 100644 index 00000000000..68050f3f6d5 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO.java @@ -0,0 +1,75 @@ +package org.zstack.header.image; + +import org.zstack.header.vm.VmNicVO; +import org.zstack.header.vo.*; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.Index; + +import javax.persistence.*; +import java.io.Serializable; +import java.sql.Timestamp; + +@Entity +@Table +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = ImageGroupVO.class, myField = "imageGroupUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = ImageVO.class, myField = "imageUuid", targetField = "uuid"), + } +) +public class ImageGroupRefVO implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + private String imageUuid; + + @Column + private String imageGroupUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getImageGroupUuid() { + return imageGroupUuid; + } + + public void setImageGroupUuid(String imageGroupUuid) { + this.imageGroupUuid = imageGroupUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java new file mode 100644 index 00000000000..ae8a6f5310a --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupRefVO_.java @@ -0,0 +1,11 @@ +package org.zstack.header.image; + +import javax.persistence.metamodel.SingularAttribute; +import java.sql.Timestamp; + +public class ImageGroupRefVO_ { + public static volatile SingularAttribute imageUuid; + public static volatile SingularAttribute imageGroupUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupVO.java b/header/src/main/java/org/zstack/header/image/ImageGroupVO.java new file mode 100644 index 00000000000..25deb06dc8d --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupVO.java @@ -0,0 +1,86 @@ +package org.zstack.header.image; + +import org.zstack.header.vo.BaseResource; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ResourceVO; + +import javax.persistence.Column; +import java.sql.Timestamp; +import javax.persistence.*; + +@Entity +@Table +@BaseResource +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = ImageGroupRefVO.class, myField = "uuid", targetField = "imageGroupUuid") + } +) +public class ImageGroupVO extends ResourceVO { + @Column + private Integer imageCount; + @Column + private String name; + @Column + @Enumerated(EnumType.STRING) + private ImageStatus status; + @Column + private String description; + @Column + private Timestamp createDate; + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public Integer getImageCount() { + return imageCount; + } + + public void setImageCount(Integer imageCount) { + this.imageCount = imageCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public ImageStatus getStatus() { + return status; + } + + public void setStatus(ImageStatus status) { + this.status = status; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/image/ImageGroupVO_.java b/header/src/main/java/org/zstack/header/image/ImageGroupVO_.java new file mode 100644 index 00000000000..d7d6112ebe0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/image/ImageGroupVO_.java @@ -0,0 +1,14 @@ +package org.zstack.header.image; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import java.sql.Timestamp; + +public class ImageGroupVO_ extends ResourceVO_ { + public static volatile SingularAttribute imageCount; + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/image/ImageInventory.java b/header/src/main/java/org/zstack/header/image/ImageInventory.java index f72ca14916c..5acb06c38e9 100755 --- a/header/src/main/java/org/zstack/header/image/ImageInventory.java +++ b/header/src/main/java/org/zstack/header/image/ImageInventory.java @@ -49,29 +49,50 @@ public class ImageInventory implements Serializable { private List backupStorageRefs; private List systemTags; + public ImageInventory() { + + } + public ImageInventory(ImageVO vo) { + this.uuid = vo.getUuid(); + this.name = vo.getName(); + this.description = vo.getDescription(); + if (vo.getState() != null) { + this.state = vo.getState().toString(); + } else { + this.state = null; + } + if (vo.getStatus() != null) { + this.status = vo.getStatus().toString(); + } else { + this.status = null; + } + this.size = vo.getSize(); + this.actualSize = vo.getActualSize(); + this.md5Sum = vo.getMd5Sum(); + this.url = vo.getUrl(); + if (vo.getMediaType() != null) { + this.mediaType = vo.getMediaType().toString(); + } else { + this.mediaType = null; + } + this.guestOsType = vo.getGuestOsType(); + this.type = vo.getType(); + if (vo.getPlatform() != null) { + this.platform = vo.getPlatform().toString(); + } else { + this.platform = null; + } + this.architecture = vo.getArchitecture(); + this.format = vo.getFormat(); + this.system = vo.isSystem(); + this.virtio = vo.getVirtio(); + this.createDate = vo.getCreateDate(); + this.lastOpDate = vo.getLastOpDate(); + this.backupStorageRefs = ImageBackupStorageRefInventory.valueOf(vo.getBackupStorageRefs()); + } + public static ImageInventory valueOf(ImageVO vo) { - ImageInventory inv = new ImageInventory(); - inv.setCreateDate(vo.getCreateDate()); - inv.setDescription(vo.getDescription()); - inv.setMediaType(vo.getMediaType().toString()); - inv.setFormat(vo.getFormat()); - inv.setGuestOsType(vo.getGuestOsType()); - inv.setMd5Sum(vo.getMd5Sum()); - inv.setName(vo.getName()); - inv.setSize(vo.getSize()); - inv.setActualSize(vo.getActualSize()); - inv.setStatus(vo.getStatus().toString()); - inv.setState(vo.getState().toString()); - inv.setUrl(vo.getUrl()); - inv.setPlatform(vo.getPlatform() == null ? null : vo.getPlatform().toString()); - inv.setArchitecture(vo.getArchitecture()); - inv.setUuid(vo.getUuid()); - inv.setType(vo.getType()); - inv.setSystem(vo.isSystem()); - inv.setLastOpDate(vo.getLastOpDate()); - inv.setBackupStorageRefs(ImageBackupStorageRefInventory.valueOf(vo.getBackupStorageRefs())); - inv.setVirtio(vo.getVirtio()); - return inv; + return new ImageInventory(vo); } public static ImageInventory valueOf(ImageEO vo) { diff --git a/header/src/main/java/org/zstack/header/image/ImageVO.java b/header/src/main/java/org/zstack/header/image/ImageVO.java index 84b67648159..944be03a291 100755 --- a/header/src/main/java/org/zstack/header/image/ImageVO.java +++ b/header/src/main/java/org/zstack/header/image/ImageVO.java @@ -17,6 +17,7 @@ @EntityGraph.Neighbour(type = ImageBackupStorageRefVO.class, myField = "uuid", targetField = "imageUuid") } ) +@Inheritance(strategy = InheritanceType.JOINED) public class ImageVO extends ImageAO implements OwnedByAccount, ToInventory { @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "imageUuid", insertable = false, updatable = false) diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java index b234ca862cc..ec569b5d0ba 100755 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetCurrentTimeMsg.java @@ -15,7 +15,7 @@ method = HttpMethod.PUT, responseClass = APIGetCurrentTimeReply.class ) -public class APIGetCurrentTimeMsg extends APISyncCallMessage { +public class APIGetCurrentTimeMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetCurrentTimeMsg __example__() { APIGetCurrentTimeMsg msg = new APIGetCurrentTimeMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java index f56eca7063f..2a928050d64 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeArchMsg.java @@ -17,7 +17,7 @@ responseClass = APIGetManagementNodeArchReply.class ) @SuppressCredentialCheck -public class APIGetManagementNodeArchMsg extends APISyncCallMessage { +public class APIGetManagementNodeArchMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetManagementNodeArchMsg __example__() { APIGetManagementNodeArchMsg msg = new APIGetManagementNodeArchMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java index 22179bb6e94..407d63b3de6 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetManagementNodeOSMsg.java @@ -16,7 +16,7 @@ responseClass = APIGetManagementNodeOSReply.class ) @SuppressCredentialCheck -public class APIGetManagementNodeOSMsg extends APISyncCallMessage { +public class APIGetManagementNodeOSMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetManagementNodeOSMsg __example__() { APIGetManagementNodeOSMsg msg = new APIGetManagementNodeOSMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java index 79dabf86811..8e93957d06f 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetPlatformTimeZoneMsg.java @@ -12,7 +12,7 @@ method = HttpMethod.GET, responseClass = APIGetPlatformTimeZoneReply.class ) -public class APIGetPlatformTimeZoneMsg extends APISyncCallMessage { +public class APIGetPlatformTimeZoneMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetPlatformTimeZoneMsg __example__() { APIGetPlatformTimeZoneMsg msg = new APIGetPlatformTimeZoneMsg(); return msg; diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java index 2a0be05290c..7ff8adb7870 100644 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetSupportAPIsMsg.java @@ -12,7 +12,7 @@ method = HttpMethod.PUT, responseClass = APIGetSupportAPIsReply.class ) -public class APIGetSupportAPIsMsg extends APISyncCallMessage { +public class APIGetSupportAPIsMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetSupportAPIsMsg __example__() { return new APIGetSupportAPIsMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java b/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java index 2693b109954..f9a9f3209d6 100755 --- a/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java +++ b/header/src/main/java/org/zstack/header/managementnode/APIGetVersionMsg.java @@ -15,7 +15,7 @@ responseClass = APIGetVersionReply.class, method = HttpMethod.PUT ) -public class APIGetVersionMsg extends APISyncCallMessage { +public class APIGetVersionMsg extends APISyncCallMessage implements APIManagementNodeMessage { public static APIGetVersionMsg __example__() { APIGetVersionMsg msg = new APIGetVersionMsg(); diff --git a/header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java b/header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java new file mode 100644 index 00000000000..3f006f2eafe --- /dev/null +++ b/header/src/main/java/org/zstack/header/managementnode/APIManagementNodeMessage.java @@ -0,0 +1,4 @@ +package org.zstack.header.managementnode; + +public interface APIManagementNodeMessage { +} diff --git a/header/src/main/java/org/zstack/header/message/APIBatchRequest.java b/header/src/main/java/org/zstack/header/message/APIBatchRequest.java index 7759b97746a..a8b1be45c1d 100644 --- a/header/src/main/java/org/zstack/header/message/APIBatchRequest.java +++ b/header/src/main/java/org/zstack/header/message/APIBatchRequest.java @@ -1,6 +1,47 @@ package org.zstack.header.message; +import org.zstack.header.errorcode.ErrorCode; + public interface APIBatchRequest { + class BatchOperationResult { + private T inventory; + private String uuid; + private boolean success; + private ErrorCode error; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public ErrorCode getError() { + return error; + } + + public void setError(ErrorCode error) { + this.error = error; + } + + public T getInventory() { + return inventory; + } + + public void setInventory(T inventory) { + this.inventory = inventory; + } + } + class Result { private int totalCount; private int successCount; diff --git a/header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy new file mode 100644 index 00000000000..93c2e57faa6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/message/APIBatchRequest_BatchOperationResultDoc_zh_cn.groovy @@ -0,0 +1,29 @@ +package org.zstack.header.message + +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "批量操作接口的结果" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.2.1" + } + field { + name "success" + desc "" + type "boolean" + since "5.2.1" + } + ref { + name "error" + path "org.zstack.header.message.APIBatchRequest.BatchOperationResult.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.2.1" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/message/APIMessage.java b/header/src/main/java/org/zstack/header/message/APIMessage.java index dfd1ad59dff..bffc2cc75d0 100755 --- a/header/src/main/java/org/zstack/header/message/APIMessage.java +++ b/header/src/main/java/org/zstack/header/message/APIMessage.java @@ -219,6 +219,20 @@ public void validate(Collection validators) throws IllegalA value = ((String) value).trim(); f.set(this, value); } + + if (value instanceof List && !at.noTrim()) { + List valueList = (List) value; + if (!valueList.isEmpty()) { + boolean allStrings = valueList.stream().allMatch(element -> element instanceof String); + if (allStrings) { + List valueNew = new ArrayList<>(); + for (Object element : valueList) { + valueNew.add(((String) element).trim()); + } + f.set(this, valueNew); + } + } + } for (ApiMessageValidator validator : validators) { validator.validate(this, f, value, at); diff --git a/header/src/main/java/org/zstack/header/message/APIParam.java b/header/src/main/java/org/zstack/header/message/APIParam.java index 322a9b382b0..be4c81fd275 100755 --- a/header/src/main/java/org/zstack/header/message/APIParam.java +++ b/header/src/main/java/org/zstack/header/message/APIParam.java @@ -28,6 +28,8 @@ long[] numberRange() default {}; + double[] floatNumberRange() default {}; + String[] numberRangeUnit() default {}; boolean checkAccount() default false; diff --git a/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java b/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java index ec0e2c4a4f6..e8ee995a2f1 100644 --- a/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java +++ b/header/src/main/java/org/zstack/header/message/ApiMessageParamValidator.java @@ -106,6 +106,23 @@ private void validateNonNullValue(APIMessage msg, Field f, Object value, APIPara } } } + + if (at.floatNumberRange().length > 0 && TypeUtils.isTypeOf(value, Float.TYPE, Float.class, Double.TYPE, Double.class)) { + DebugUtils.Assert(at.floatNumberRange().length == 2, String.format("invalid field[%s], APIParam.floatNumberRange must have and only have 2 items", f.getName())); + double low = at.floatNumberRange()[0]; + double high = at.floatNumberRange()[1]; + double val = ((Number) value).doubleValue(); + if (val < low || val > high) { + if (at.numberRangeUnit().length > 0) { + DebugUtils.Assert(at.numberRangeUnit().length == 2, String.format("invalid field[%s], APIParam.floatNumberRangeUnit must have and only have 2 items", f.getName())); + String lowUnit = at.numberRangeUnit()[0]; + String highUnit = at.numberRangeUnit()[1]; + throw new InvalidApiMessageException("field[%s] must be in range of [%s %s, %s %s]", f.getName(), low, lowUnit, high, highUnit); + } else { + throw new InvalidApiMessageException("field[%s] must be in range of [%s, %s]", f.getName(), low, high); + } + } + } } private void validateValue(String[] validValues, String value, String fieldName, String msgName) { diff --git a/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java b/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java index 8a9f5b98d39..668a5572868 100755 --- a/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java +++ b/header/src/main/java/org/zstack/header/message/JsonSchemaBuilder.java @@ -27,7 +27,7 @@ public JsonSchemaBuilder(Object object) { private boolean isSkip(Field f) { return f.isAnnotationPresent(NoJsonSchema.class) || Modifier.isStatic(f.getModifiers()) - || f.isAnnotationPresent(GsonTransient.class); + || f.isAnnotationPresent(GsonTransient.class) || Modifier.isTransient(f.getModifiers()); } private void build(Object o, Stack paths) throws IllegalAccessException { diff --git a/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java b/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java index 052015e5f2b..20aa9427295 100755 --- a/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java +++ b/header/src/main/java/org/zstack/header/message/NeedReplyMessage.java @@ -32,6 +32,14 @@ public boolean hasSystemTag(Predicate isMatch) { return systemTags != null && systemTags.stream().anyMatch(isMatch); } + public boolean removeSystemTag(Predicate isMatch) { + if (systemTags == null) { + return false; + } + + return systemTags.removeIf(isMatch); + } + public void addSystemTag(String systemTag){ if (systemTags == null) { systemTags = new ArrayList<>(); diff --git a/header/src/main/java/org/zstack/header/message/OverlayMessage.java b/header/src/main/java/org/zstack/header/message/OverlayMessage.java index b76f9585f10..a58a0bcd703 100755 --- a/header/src/main/java/org/zstack/header/message/OverlayMessage.java +++ b/header/src/main/java/org/zstack/header/message/OverlayMessage.java @@ -37,6 +37,7 @@ public NeedReplyMessage getMessage() { public String getTaskName() { String simpleName = messageClassName.substring( messageClassName.lastIndexOf(".") + 1, messageClassName.lastIndexOf("Msg")); + simpleName = simpleName.replaceFirst("API", ""); return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, simpleName); } } diff --git a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java index a22b4e7f0fd..b91f322a823 100755 --- a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NetworkMsg.java @@ -71,7 +71,7 @@ public abstract class APICreateL2NetworkMsg extends APICreateMessage implements /** * @desc vSwitch type */ - @APIParam(required = false, maxLength = 1024, validValues = {"LinuxBridge", "OvsDpdk", "MacVlan"}) + @APIParam(required = false, maxLength = 1024, validValues = {"LinuxBridge", "OvsDpdk", "MacVlan", "OvnDpdk"}) private String vSwitchType = "LinuxBridge"; @APIParam(required = false) diff --git a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java index 1da72c4ef51..6f42e0c3a3d 100755 --- a/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/l2/APICreateL2NoVlanNetworkMsg.java @@ -1,12 +1,19 @@ package org.zstack.header.network.l2; import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIParam; +import org.zstack.header.message.OverriddenApiParam; +import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; +import org.zstack.header.zone.ZoneVO; /** */ @TagResourceType(L2NetworkVO.class) +@OverriddenApiParams({ + @OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)) +}) @RestRequest( path = "/l2-networks/no-vlan", method = HttpMethod.POST, diff --git a/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java b/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java index 7439ac800df..58ce39044f5 100755 --- a/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/l2/APICreateL2VlanNetworkMsg.java @@ -2,8 +2,11 @@ import org.springframework.http.HttpMethod; import org.zstack.header.message.APIParam; +import org.zstack.header.message.OverriddenApiParam; +import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; +import org.zstack.header.zone.ZoneVO; /** * @api create a l2VlanNetwork @@ -42,6 +45,9 @@ * @since 0.1.0 */ @TagResourceType(L2NetworkVO.class) +@OverriddenApiParams({ + @OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)) +}) @RestRequest( path = "/l2-networks/vlan", method = HttpMethod.POST, diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java index ccdbc4e918f..e72b0b91396 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkConstant.java @@ -35,6 +35,10 @@ public interface L2NetworkConstant { @PythonClass public static final String VSWITCH_TYPE_OVS_KERNEL = "OvsKernel"; + @PythonClass + public static final String VSWITCH_TYPE_OVN_DPDK = "OvnDpdk"; + public static final String OVN_DPDK_VNIC_SRC_PATH = "/var/run/openvswitch/"; + public static final String DETACH_L2NETWORK_CODE = "l2Network.detach"; // https://elixir.bootlin.com/linux/v5.6/source/include/uapi/linux/if.h#L33 @@ -43,4 +47,17 @@ public interface L2NetworkConstant { public static final int VIRTUAL_NETWORK_ID_DEFAULT_VALUE = 0; public static final String KVM_HYPERVISOR_TYPE = "KVM"; + + public static final String BONDING_MODE_LACP = "802.3ad"; + public static final String BONDING_MODE_AB = "active-backup"; + public static final String BONDING_MODE_SLB = "balance-slb"; + public static final String BONDING_MODE_TCP = "balance-tcp"; + + public static final String LACP_MODE_OFF = "off"; + public static final String LACP_MODE_ACTIVE = "active"; + public static final String LACP_MODE_PASSIVE = "passive"; + + public static final Integer VLAN_ID_MAX = 4095; + public static final Integer VXLAN_ID_MAX = 16777215; + public static final Integer MAX_PARALLEL_HOST_MSG = 10; } diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java index 84fd74ceedc..d50559128d9 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkCreateExtensionPoint.java @@ -1,9 +1,11 @@ package org.zstack.header.network.l2; +import org.zstack.header.core.Completion; import org.zstack.header.network.NetworkException; public interface L2NetworkCreateExtensionPoint { void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException; + default void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2NetworkMsg msg, Completion completion) {completion.success();} void afterCreateL2Network(L2NetworkInventory l2Network); } diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDateDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDataDoc_zh_cn.groovy similarity index 95% rename from header/src/main/java/org/zstack/header/network/l2/L2NetworkDateDoc_zh_cn.groovy rename to header/src/main/java/org/zstack/header/network/l2/L2NetworkDataDoc_zh_cn.groovy index e802c717665..b2a1214b032 100644 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDateDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDataDoc_zh_cn.groovy @@ -1,8 +1,5 @@ package org.zstack.header.network.l2 -import java.sql.Timestamp -import java.sql.Timestamp - doc { title "二层网络结构" diff --git a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java index a780c4e9910..3e46f74b1e7 100755 --- a/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/network/l2/L2NetworkDeleteExtensionPoint.java @@ -1,9 +1,14 @@ package org.zstack.header.network.l2; +import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; + public interface L2NetworkDeleteExtensionPoint { void preDeleteL2Network(L2NetworkInventory inventory) throws L2NetworkException; void beforeDeleteL2Network(L2NetworkInventory inventory); + default void deleteL2Network(L2NetworkInventory inv, NoErrorCompletion completion) {completion.done();} + void afterDeleteL2Network(L2NetworkInventory inventory); } diff --git a/header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java new file mode 100644 index 00000000000..c443878b0a3 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l2/SdnControllerDeleteExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.header.network.l2; + +import org.zstack.header.core.Completion; + +public interface SdnControllerDeleteExtensionPoint { + void deleteNetworkServiceOfSdnController(String sdnControllerUuid, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java deleted file mode 100644 index 593edc3f436..00000000000 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchManager.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.zstack.header.network.l2; - -public interface VSwitchManager { -} diff --git a/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java b/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java index f00d4b3153b..530d926cbfd 100644 --- a/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java +++ b/header/src/main/java/org/zstack/header/network/l2/VSwitchType.java @@ -1,35 +1,34 @@ package org.zstack.header.network.l2; -import org.zstack.header.vm.VmMacVlanNicConstant; import org.zstack.header.vm.VmNicType; -import org.zstack.header.vm.VmOvsNicConstant; +import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; +import org.zstack.utils.logging.CLogger; import java.util.*; public class VSwitchType { + private static final CLogger logger = Utils.getLogger(VSwitchType.class); private static Map types = Collections.synchronizedMap(new HashMap()); private final String typeName; - private static Map> vSwitchSupportNicTypesMap = Collections.synchronizedMap(new HashMap>()); private boolean exposed = true; - - public static boolean hasType(String typeName) { - return types.containsKey(typeName); - } + private boolean attachToCluster = true; + private String sdnControllerType = null; + private boolean useDpdk = false; + private Map nicTypes = Collections.synchronizedMap(new HashMap<>()); public VSwitchType(String typeName) { this.typeName = typeName; - types.put(typeName, this); + if (!types.containsKey(typeName)) { + types.put(typeName, this); + } } public VSwitchType(String typeName, boolean exposed) { this(typeName); - this.exposed = exposed; - } - - public VSwitchType(String typeName, VmNicType nicType) { - this.typeName = typeName; - types.put(typeName, this); - vSwitchSupportNicTypesMap.computeIfAbsent(typeName, k -> new ArrayList()).add(nicType); + if (!types.containsKey(typeName)) { + types.put(typeName, this); + } } public boolean isExposed() { @@ -40,34 +39,62 @@ public void setExposed(boolean exposed) { this.exposed = exposed; } - public List getSupVmNicTypes() { - return vSwitchSupportNicTypesMap.get(typeName); + + public boolean isAttachToCluster() { + return attachToCluster; } - public VmNicType getVmNicTypeWithCondition(boolean enableSRIOV, boolean enableVhostUser) { - List types = getSupVmNicTypes(); + public void setAttachToCluster(boolean attachToCluster) { + this.attachToCluster = attachToCluster; + } - if (typeName.equals(L2NetworkConstant.VSWITCH_TYPE_OVS_DPDK)) { - if (enableVhostUser && types.contains(VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VHOST_USER_SPACE))) { - return VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VHOST_USER_SPACE); - } else if (types.contains(VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VDPA))){ - return VmNicType.valueOf(VmOvsNicConstant.ACCEL_TYPE_VDPA); - } - } else if (typeName.equals(L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE)){ - for (VmNicType type : types) { - if (type.isUseSRIOV() == enableSRIOV) { - return type; - } + public String getSdnControllerType() { + return sdnControllerType; + } + + public void setSdnControllerType(String sdnControllerType) { + this.sdnControllerType = sdnControllerType; + } + + public boolean isUseDpdk() { + return useDpdk; + } + + public void setUseDpdk(boolean useDpdk) { + this.useDpdk = useDpdk; + } + + public void addVmNicType(VmNicType.VmNicSubType subType, VmNicType nicType) { + VmNicType oldNicType = nicTypes.get(subType); + if (oldNicType != null) { + if (!oldNicType.toString().equals(nicType.toString())) { + throw new IllegalArgumentException("duplicated nic type: " + nicType + + " subtype " + subType + " for vSwitchType " + typeName + " " + + JSONObjectUtil.toJsonString(nicTypes)); + } else { + /* call addVmNicType duplicated */ + return; } - } else if (typeName.equals(L2NetworkConstant.VSWITCH_TYPE_MACVLAN)) { - if (types.contains(VmNicType.valueOf(VmMacVlanNicConstant.MACVLAN_NIC_TYPE))) { - return VmNicType.valueOf(VmMacVlanNicConstant.MACVLAN_NIC_TYPE); + } + logger.debug("addVmNicType nic type: " + nicType + + " subtype " + subType + " for vSwitchType " + typeName); + nicTypes.put(subType, nicType); + } + + public VmNicType getVmNicType(VmNicType.VmNicSubType subType) { + VmNicType nicType = nicTypes.get(subType); + if (nicType == null) { + /* for case, enableVHostUser is enabled, but vswitch type is linux bridge */ + nicType = nicTypes.get(VmNicType.VmNicSubType.NONE); + if (nicType == null) { + throw new IllegalArgumentException("unsupported nicSubType " + subType + " for vswitch type " + typeName); } } - return null; + return nicType; } + public static VSwitchType valueOf(String typeName) { VSwitchType type = types.get(typeName); if (type == null) { @@ -83,7 +110,7 @@ public String toString() { @Override public boolean equals(Object t) { - if (t == null || !(t instanceof VSwitchType)) { + if (!(t instanceof VSwitchType)) { return false; } diff --git a/header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java new file mode 100644 index 00000000000..70833859dfc --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/AfterDeleteIpRangeExtensionPoint.java @@ -0,0 +1,10 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.core.Completion; + +/** + * Created by boce.wang on 07/01/2025. + */ +public interface AfterDeleteIpRangeExtensionPoint { + void afterDeleteIpRange(IpRangeInventory ipr); +} diff --git a/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java b/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java index ed6537164fd..6ad1a5507b7 100644 --- a/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java +++ b/header/src/main/java/org/zstack/header/network/l3/IpRangeFactory.java @@ -1,9 +1,12 @@ package org.zstack.header.network.l3; +import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.message.APICreateMessage; +import java.util.List; + public interface IpRangeFactory { IpRangeType getType(); - IpRangeInventory createIpRange(IpRangeInventory ipr, APICreateMessage msg); + void createIpRange(List iprs, APICreateMessage msg, ReturnValueCompletion> completion); } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java index 8c34d2f40e4..52050b4ddd9 100755 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO.java @@ -16,6 +16,9 @@ public class L3NetworkAO extends ResourceVO { @Index private String name; + @Column + private Integer internalId; + @Column private String description; @@ -175,4 +178,12 @@ public Boolean getIsolated() { public void setIsolated(Boolean isolated) { this.isolated = isolated; } + + public Integer getInternalId() { + return internalId; + } + + public void setInternalId(Integer internalId) { + this.internalId = internalId; + } } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java index 9cc55edca44..8268dc4fe3a 100755 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkAO_.java @@ -9,6 +9,7 @@ @StaticMetamodel(L3NetworkAO.class) public class L3NetworkAO_ extends ResourceVO_ { public static volatile SingularAttribute name; + public static volatile SingularAttribute internalId; public static volatile SingularAttribute type; public static volatile SingularAttribute system; public static volatile SingularAttribute state; diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java index 6927c3ee044..f1662f6421f 100755 --- a/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkInventory.java @@ -85,6 +85,9 @@ public class L3NetworkInventory implements Serializable { * @desc max length of 255 characters */ private String name; + + private Integer internalId; + /** * @desc max length of 2048 characters */ @@ -162,6 +165,7 @@ public class L3NetworkInventory implements Serializable { public static L3NetworkInventory valueOf(L3NetworkVO vo) { L3NetworkInventory inv = new L3NetworkInventory(); inv.setUuid(vo.getUuid()); + inv.setInternalId(vo.getInternalId()); inv.setCreateDate(vo.getCreateDate()); inv.setDescription(vo.getDescription()); inv.setL2NetworkUuid(vo.getL2NetworkUuid()); @@ -430,4 +434,12 @@ public boolean enableIpAddressAllocation() { return false; } + + public Integer getInternalId() { + return internalId; + } + + public void setInternalId(Integer internalId) { + this.internalId = internalId; + } } diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java new file mode 100644 index 00000000000..b388eebff63 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkSequenceNumberVO.java @@ -0,0 +1,20 @@ +package org.zstack.header.network.l3; + +import javax.persistence.*; + +@Entity +@Table +public class L3NetworkSequenceNumberVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } +} diff --git a/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java b/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java new file mode 100644 index 00000000000..6699c0b0021 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/L3NetworkUpdateExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.header.network.l3; + +public interface L3NetworkUpdateExtensionPoint { + void updateL3NetworkMtu(L3NetworkInventory inventory); +} diff --git a/header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java b/header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java new file mode 100644 index 00000000000..228b05aa98d --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/l3/SdnControllerL3.java @@ -0,0 +1,12 @@ +package org.zstack.header.network.l3; + +import org.zstack.header.core.Completion; + +import java.util.List; + +public interface SdnControllerL3 { + void createL3Network(L3NetworkInventory inv, List systemTags, Completion completion); + void deleteL3Network(L3NetworkInventory inv, Completion completion); + void createIpRange(IpRangeInventory inv, Completion completion); + void deleteIpRange(IpRangeInventory inv, Completion completion); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerConstant.java similarity index 57% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerConstant.java index 8552c56c167..b6a6ddbe6ad 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerConstant.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerConstant.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.configuration.PythonClass; @@ -12,16 +12,33 @@ public class SdnControllerConstant { @PythonClass public static final String HARDWARE_VXLAN_NETWORK_TYPE = "HardwareVxlanNetwork"; + public static final String DEFAULT_VENDOR_VERSION = "V1"; + public static final String ACTION_CATEGORY = "SdnController"; public static final String SERVICE_ID = "SdnController"; public static final String H3C_VCFC_CONTROLLER = "H3C VCFC"; + + public static final String H3C_VCFC_VENDOR_VERSION_V1 = DEFAULT_VENDOR_VERSION; + public static final String H3C_VCFC_VENDOR_VERSION_V2 = "V2"; + public static final String H3C_VCFC_DEFAULT_TENANT_NAME = "default"; public static final String H3C_VCFC_DEFAULT_TENANT_TYPE = "default"; + // H3C SDN Controller Tenant Status + public static final String H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE = "Enabled"; + public static final String H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE = "Disabled"; + + // H3C SDN Controller Default Tenant ID (cannot be deleted) + public static final String H3C_SDN_CONTROLLER_DEFAULT_TENANT_ID = "ffffffff-0000-0000-0000-000000000001"; + public static final String TF_CONTROLLER = "TF"; + public static final String SDN_CONTROLLER_VROUTER_PREFIX = "VR_"; + + public static final String DEFAULT_SDN_CONTROLLER_VERSION = "V1"; + public enum Processes{ Pre, Post @@ -43,6 +60,7 @@ public enum ResourceTypes{ public enum Params { HARDWARE_VXLAN_POOLS, - VXLAN_NETWORK + VXLAN_NETWORK, + SDN_CONTROLLER, } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionMsg.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionMsg.java similarity index 89% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionMsg.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionMsg.java index c74ff667458..104233ad9a8 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionMsg.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionMsg.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.message.DeletionMessage; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionReply.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionReply.java similarity index 69% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionReply.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionReply.java index e18dd0538e3..950b69084b0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerDeletionReply.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerDeletionReply.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.message.MessageReply; diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventory.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventory.java new file mode 100644 index 00000000000..840d2f72cda --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventory.java @@ -0,0 +1,126 @@ +package org.zstack.header.network.sdncontroller; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.host.HostInventory; +import org.zstack.header.query.ExpandedQueries; +import org.zstack.header.query.ExpandedQuery; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = SdnControllerHostRefVO.class) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "host", inventoryClass = HostInventory.class, + foreignKey = "uuid", expandedInventoryKey = "hostUuid"), + @ExpandedQuery(expandedField = "sdnController", inventoryClass = SdnControllerInventory.class, + foreignKey = "sdnControllerUuid", expandedInventoryKey = "uuid"), +}) +public class SdnControllerHostRefInventory implements Serializable { + private String sdnControllerUuid; + private String hostUuid; + private String vSwitchType; + private String vtepIp; + private String nicPciAddresses; + private String nicDrivers; + private String netmask; + private String bondMode; + private String lacpMode; + + public static SdnControllerHostRefInventory valueOf(SdnControllerHostRefVO vo) { + SdnControllerHostRefInventory inv = new SdnControllerHostRefInventory(); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + inv.setHostUuid(vo.getHostUuid()); + inv.setvSwitchType(vo.getvSwitchType()); + inv.setVtepIp(vo.getVtepIp()); + inv.setNetmask(vo.getNetmask()); + inv.setNicPciAddresses(vo.getNicPciAddresses()); + inv.setNicDrivers(vo.getNicDrivers()); + inv.setBondMode(vo.getBondMode()); + inv.setLacpMode(vo.getLacpMode()); + return inv; + } + + public static List valueOf(Collection vos) { + List lst = new ArrayList(vos.size()); + for (SdnControllerHostRefVO vo : vos) { + lst.add(SdnControllerHostRefInventory.valueOf(vo)); + } + return lst; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getNicPciAddresses() { + return nicPciAddresses; + } + + public void setNicPciAddresses(String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + + public String getNicDrivers() { + return nicDrivers; + } + + public void setNicDrivers(String nicDrivers) { + this.nicDrivers = nicDrivers; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } +} diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..d6fa745e440 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefInventoryDoc_zh_cn.groovy @@ -0,0 +1,63 @@ +package org.zstack.header.network.sdncontroller + + + +doc { + + title "SDN控制器与物理机关联关系清单" + + field { + name "sdnControllerUuid" + desc "SDN控制器Uuid" + type "String" + since "5.3.0" + } + field { + name "hostUuid" + desc "物理机UUID" + type "String" + since "5.3.0" + } + field { + name "vSwitchType" + desc "虚拟交换机类型" + type "String" + since "5.3.0" + } + field { + name "vtepIp" + desc "物理机VTEP IP" + type "String" + since "5.3.0" + } + field { + name "nicPciAddresses" + desc "物理机网卡和PCI地址映射" + type "String" + since "5.3.0" + } + field { + name "nicDrivers" + desc "物理机网卡和驱动类型映射" + type "String" + since "5.3.0" + } + field { + name "netmask" + desc "物理机VTEP IP掩码" + type "String" + since "5.3.0" + } + field { + name "bondMode" + desc "物理机网卡bond模式" + type "String" + since "5.3.0" + } + field { + name "lacpMode" + desc "物理机网卡LACP模式" + type "String" + since "5.3.0" + } +} diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO.java new file mode 100644 index 00000000000..6d932d02d90 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO.java @@ -0,0 +1,163 @@ +package org.zstack.header.network.sdncontroller; + +import org.zstack.header.host.HostEO; +import org.zstack.header.search.SqlTrigger; +import org.zstack.header.search.TriggerIndex; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.SoftDeletionCascade; +import org.zstack.header.vo.SoftDeletionCascades; + +import javax.persistence.*; + +/** + * Created by shixin.ruan on 09/30/2019. + */ +@Entity +@Table +@TriggerIndex +@SqlTrigger(foreignVOClass = SdnControllerVO.class, foreignVOJoinColumn = "sdnControllerUuid") +@SoftDeletionCascades({ + @SoftDeletionCascade(parent = SdnControllerVO.class, joinColumn = "sdnControllerUuid"), + @SoftDeletionCascade(parent = HostEO.class, joinColumn = "hostUuid") +}) +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = SdnControllerVO.class, myField = "sdnControllerUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = HostEO.class, myField = "hostUuid", targetField = "uuid"), + } +) +public class SdnControllerHostRefVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ForeignKey.ReferenceOption.RESTRICT) + private String sdnControllerUuid; + + @Column + @ForeignKey(parentEntityClass = HostEO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String hostUuid; + + @Column + private String vSwitchType; + + @Column + private String vtepIp; + + @Column + private String netmask; + + @Column + private String nicPciAddresses; + + @Column + private String nicDrivers; + + @Column + private String bondMode; + + @Column + private String lacpMode; + + + public SdnControllerHostRefVO() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getNicPciAddresses() { + return nicPciAddresses; + } + + public void setNicPciAddresses(String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + + public String getNicDrivers() { + return nicDrivers; + } + + public void setNicDrivers(String nicDrivers) { + this.nicDrivers = nicDrivers; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + public static SdnControllerHostRefVO fromOther(SdnControllerHostRefVO vo) { + SdnControllerHostRefVO newRef = new SdnControllerHostRefVO(); + newRef.sdnControllerUuid = vo.getSdnControllerUuid(); + newRef.hostUuid = vo.getHostUuid(); + newRef.vSwitchType = vo.getvSwitchType(); + newRef.vtepIp = vo.getVtepIp(); + newRef.netmask = vo.getNetmask(); + newRef.bondMode = vo.getBondMode(); + newRef.nicPciAddresses = vo.nicPciAddresses; + newRef.nicDrivers = vo.getNicDrivers(); + newRef.lacpMode = vo.getLacpMode(); + + return newRef; + } +} diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO_.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO_.java new file mode 100644 index 00000000000..c0348a6efdf --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerHostRefVO_.java @@ -0,0 +1,18 @@ +package org.zstack.header.network.sdncontroller; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(SdnControllerHostRefVO.class) +public class SdnControllerHostRefVO_ { + public static volatile SingularAttribute id; + public static volatile SingularAttribute hostUuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute vSwitchType; + public static volatile SingularAttribute vtepIp; + public static volatile SingularAttribute netmask; + public static volatile SingularAttribute nicPciAddresses; + public static volatile SingularAttribute nicDrivers; + public static volatile SingularAttribute bondMode; + public static volatile SingularAttribute lacpMode; +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java similarity index 52% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java index 7c3fbfe25d2..9f364f79136 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventory.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventory.java @@ -1,62 +1,50 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.configuration.PythonClassInventory; -import org.zstack.header.log.NoLogging; -import org.zstack.header.query.ExpandedQueries; -import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; -import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags; import java.io.Serializable; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; @Inventory(mappingVOClass = SdnControllerVO.class) -@ExpandedQueries({ - @ExpandedQuery(expandedField = "vxlanPool", inventoryClass = HardwareL2VxlanNetworkPoolInventory.class, - foreignKey = "uuid", expandedInventoryKey = "sdnControllerUuid"), -}) @PythonClassInventory public class SdnControllerInventory implements Serializable { private String uuid; private String vendorType; + private String vendorVersion; private String name; private String description; private String ip; private String username; - @NoLogging private String password; + private SdnControllerStatus status; + private List hostRefs; private Timestamp createDate; private Timestamp lastOpDate; - private List vniRanges; - private List vxlanPools; + + public SdnControllerInventory() { + } + + public SdnControllerInventory(SdnControllerVO vo) { + this.setUuid(vo.getUuid()); + this.setVendorType(vo.getVendorType()); + this.setVendorVersion(vo.getVendorVersion()); + this.setDescription(vo.getDescription()); + this.setName(vo.getName()); + this.setIp(vo.getIp()); + this.setUsername(vo.getUsername()); + this.setPassword(vo.getPassword()); + this.setStatus(vo.getStatus()); + this.setHostRefs(SdnControllerHostRefInventory.valueOf(vo.getHostRefVOS())); + this.setCreateDate(vo.getCreateDate()); + this.setLastOpDate(vo.getLastOpDate()); + } public static SdnControllerInventory valueOf(SdnControllerVO vo) { - SdnControllerInventory inv = new SdnControllerInventory(); - inv.setUuid(vo.getUuid()); - inv.setVendorType(vo.getVendorType()); - inv.setDescription(vo.getDescription()); - inv.setName(vo.getName()); - inv.setIp(vo.getIp()); - inv.setUsername(vo.getUsername()); - inv.setPassword(vo.getPassword()); - inv.setCreateDate(vo.getCreateDate()); - inv.setLastOpDate(vo.getLastOpDate()); - inv.vniRanges = new ArrayList<>(); - if (vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { - List> tokenList = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.getTokensOfTagsByResourceUuid(vo.getUuid()); - for (Map tokens : tokenList) { - SdnVniRange range = new SdnVniRange(); - range.startVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN)); - range.endVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN)); - inv.vniRanges.add(range); - } - } - inv.setVxlanPools(HardwareL2VxlanNetworkPoolInventory.valueOf2(vo.getVxlanPools())); - return inv; + return new SdnControllerInventory(vo); } public static List valueOf(Collection vos) { @@ -83,6 +71,14 @@ public void setVendorType(String vendorType) { this.vendorType = vendorType; } + public String getVendorVersion() { + return vendorVersion; + } + + public void setVendorVersion(String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public String getName() { return name; } @@ -139,19 +135,19 @@ public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } - public List getVniRanges() { - return vniRanges; + public SdnControllerStatus getStatus() { + return status; } - public void setVniRanges(List vniRanges) { - this.vniRanges = vniRanges; + public void setStatus(SdnControllerStatus status) { + this.status = status; } - public List getVxlanPools() { - return vxlanPools; + public List getHostRefs() { + return hostRefs; } - public void setVxlanPools(List vxlanPools) { - this.vxlanPools = vxlanPools; + public void setHostRefs(List hostRefs) { + this.hostRefs = hostRefs; } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy similarity index 68% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy index a2e193fb1ef..ca9a031f59e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerInventoryDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerInventoryDoc_zh_cn.groovy @@ -1,4 +1,5 @@ -package org.zstack.sdnController.header +package org.zstack.header.network.sdncontroller + doc { @@ -16,6 +17,12 @@ doc { type "String" since "3.7" } + field { + name "vendorVersion" + desc "厂商版本" + type "String" + since "5.4" + } field { name "name" desc "资源名称" @@ -46,6 +53,14 @@ doc { type "String" since "3.7" } + ref { + name "status" + path "org.zstack.header.network.sdncontroller.SdnControllerInventory.status" + desc "null" + type "SdnControllerStatus" + since "5.3.0" + clz SdnControllerStatus.class + } field { name "createDate" desc "创建时间" @@ -58,20 +73,4 @@ doc { type "Timestamp" since "3.7" } - ref { - name "vniRanges" - path "org.zstack.sdnController.header.SdnControllerInventory.vniRanges" - desc "null" - type "List" - since "3.7" - clz SdnVniRange.class - } - ref { - name "vxlanPools" - path "org.zstack.sdnController.header.SdnControllerInventory.vxlanPools" - desc "null" - type "List" - since "3.7" - clz HardwareL2VxlanNetworkPoolInventory.class - } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerMessage.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerMessage.java similarity index 61% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerMessage.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerMessage.java index 042ae3a541b..cddec39c551 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerMessage.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerMessage.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; public interface SdnControllerMessage { String getSdnControllerUuid(); diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostMsg.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostMsg.java new file mode 100644 index 00000000000..69a11e7bdc6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostMsg.java @@ -0,0 +1,43 @@ +package org.zstack.header.network.sdncontroller; + +import org.zstack.header.message.NeedReplyMessage; + +public class SdnControllerRemoveHostMsg extends NeedReplyMessage implements SdnControllerMessage { + private String sdnControllerUuid; + private String hostUuid; + private String vSwitchType; + private boolean createChain = true; + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public boolean isCreateChain() { + return createChain; + } + + public void setCreateChain(boolean createChain) { + this.createChain = createChain; + } +} diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostReply.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostReply.java new file mode 100644 index 00000000000..9376a4d0649 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerRemoveHostReply.java @@ -0,0 +1,6 @@ +package org.zstack.header.network.sdncontroller; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerRemoveHostReply extends MessageReply { +} diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java new file mode 100644 index 00000000000..5bc0c7ebda0 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatus.java @@ -0,0 +1,7 @@ +package org.zstack.header.network.sdncontroller; + +public enum SdnControllerStatus { + Connecting, + Connected, + Disconnected +} diff --git a/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatusDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatusDoc_zh_cn.groovy new file mode 100644 index 00000000000..c049e771f1b --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerStatusDoc_zh_cn.groovy @@ -0,0 +1,27 @@ +package org.zstack.header.network.sdncontroller + + + +doc { + + title "SDN控制器状态" + + field { + name "Connecting" + desc "连接中" + type "SdnControllerStatus" + since "5.3.0" + } + field { + name "Connected" + desc "已连接" + type "SdnControllerStatus" + since "5.3.0" + } + field { + name "Disconnected" + desc "已失联" + type "SdnControllerStatus" + since "5.3.0" + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java similarity index 75% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java index 64da98622e7..f9a911436d2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.identity.OwnedByAccount; import org.zstack.header.vo.BaseResource; @@ -24,6 +24,9 @@ public class SdnControllerVO extends ResourceVO implements OwnedByAccount, ToInv @Column private String vendorType; + @Column + private String vendorVersion; + @Column private String name; @@ -42,7 +45,11 @@ public class SdnControllerVO extends ResourceVO implements OwnedByAccount, ToInv @OneToMany(fetch=FetchType.EAGER) @JoinColumn(name="sdnControllerUuid", insertable=false, updatable=false) @NoView - private Set vxlanPools = new HashSet(); + private Set hostRefVOS = new HashSet(); + + @Column + @Enumerated(EnumType.STRING) + private SdnControllerStatus status; @Column private Timestamp createDate; @@ -66,6 +73,14 @@ public void setVendorType(String vendorType) { this.vendorType = vendorType; } + public String getVendorVersion() { + return vendorVersion; + } + + public void setVendorVersion(String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public String getName() { return name; } @@ -122,14 +137,6 @@ public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } - public Set getVxlanPools() { - return vxlanPools; - } - - public void setVxlanPools(Set vxlanPools) { - this.vxlanPools = vxlanPools; - } - @Override public String getAccountUuid() { return accountUuid; @@ -139,4 +146,20 @@ public String getAccountUuid() { public void setAccountUuid(String accountUuid) { this.accountUuid = accountUuid; } + + public SdnControllerStatus getStatus() { + return status; + } + + public void setStatus(SdnControllerStatus status) { + this.status = status; + } + + public Set getHostRefVOS() { + return hostRefVOS; + } + + public void setHostRefVOS(Set hostRefVOS) { + this.hostRefVOS = hostRefVOS; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO_.java similarity index 80% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java rename to header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO_.java index 033ed41e921..27eb3abfbcb 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerVO_.java +++ b/header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO_.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController.header; +package org.zstack.header.network.sdncontroller; import org.zstack.header.vo.ResourceVO_; @@ -9,11 +9,13 @@ @StaticMetamodel(SdnControllerVO.class) public class SdnControllerVO_ extends ResourceVO_ { public static volatile SingularAttribute vendorType; + public static volatile SingularAttribute vendorVersion; public static volatile SingularAttribute name; public static volatile SingularAttribute description; public static volatile SingularAttribute ip; public static volatile SingularAttribute username; public static volatile SingularAttribute password; + public static volatile SingularAttribute status; public static volatile SingularAttribute createDate; public static volatile SingularAttribute lastOpDate; } diff --git a/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java b/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java index ce54ba424e7..00f2b148e2e 100755 --- a/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java +++ b/header/src/main/java/org/zstack/header/network/service/APIDetachNetworkServiceFromL3NetworkMsg.java @@ -72,7 +72,7 @@ public static APIDetachNetworkServiceFromL3NetworkMsg __example__() { msg.setL3NetworkUuid(uuid()); msg.setNetworkServices(m); - + msg.setService("PortForwarding"); return msg; } diff --git a/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java index c013af92502..c643b7be0e4 100644 --- a/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/network/service/AfterApplyFlatEipExtensionPoint.java @@ -4,4 +4,5 @@ public interface AfterApplyFlatEipExtensionPoint { void AfterApplyFlatEip(List vipUuids, String hostUuid); + default void cleanGatewayArpEntry(String vmUuid, String gatewayIp) {}; } diff --git a/header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java new file mode 100644 index 00000000000..42b45b254b7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/GetSdnControllerExtensionPoint.java @@ -0,0 +1,8 @@ +package org.zstack.header.network.service; + +import org.zstack.header.network.l3.SdnControllerL3; + +public interface GetSdnControllerExtensionPoint { + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); + SdnControllerL3 getSdnControllerL3(String l2Uuid); +} diff --git a/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java b/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java index 1512ba53865..852bd09c401 100755 --- a/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java +++ b/header/src/main/java/org/zstack/header/network/service/NetworkServiceProviderType.java @@ -8,6 +8,8 @@ public class NetworkServiceProviderType { private static Map types = Collections.synchronizedMap(new HashMap()); private final String typeName; + private boolean createDhcpNameSpace = true; + private boolean allocateDhcpServerIp = true; public NetworkServiceProviderType(String typeName) { this.typeName = typeName; @@ -29,7 +31,7 @@ public String toString() { @Override public boolean equals(Object t) { - if (t == null || !(t instanceof NetworkServiceProviderType)) { + if (!(t instanceof NetworkServiceProviderType)) { return false; } @@ -37,6 +39,22 @@ public boolean equals(Object t) { return type.toString().equals(typeName); } + public boolean isCreateDhcpNameSpace() { + return createDhcpNameSpace; + } + + public void setCreateDhcpNameSpace(boolean createDhcpNameSpace) { + this.createDhcpNameSpace = createDhcpNameSpace; + } + + public boolean isAllocateDhcpServerIp() { + return allocateDhcpServerIp; + } + + public void setAllocateDhcpServerIp(boolean allocateDhcpServerIp) { + this.allocateDhcpServerIp = allocateDhcpServerIp; + } + @Override public int hashCode() { return typeName.hashCode(); diff --git a/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java new file mode 100644 index 00000000000..065d90e17d9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/SdnControllerDhcp.java @@ -0,0 +1,52 @@ +package org.zstack.header.network.service; + +import org.zstack.header.core.Completion; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.l3.L3NetworkVO; + +import java.util.List; + +/** + * 该接口定义了 SDN 控制器处理 DHCP 服务的方法。 + * 实现该接口的类负责在 SDN 环境中分配、启用和禁用 DHCP 服务。 + + */ +public interface SdnControllerDhcp { + + /** + * 为 L3 网络分配 DHCP 服务并启用 + * @param vo L3 网络 VO 对象 + * @param systemTags 系统标签列表 + * @param completion 操作完成后的回调 + * */ + + void allocateDhcpAndEnableDhcp(L3NetworkVO vo, List systemTags, Completion completion); + + /** + * 启用指定 L3 网络的 DHCP 服务 + * @param l3_min L3 网络索引 + * @param l3_max L3 网络索引 + * @param invs L3 网络清单列表 + * @param sync 是否同步操作 + * @param completion 操作完成后的回调 + * */ + + void enableDhcp(long l3Min, long l3Max, List invs, boolean sync, Completion completion); + + /** + * 启用指定 L3 网络的 DHCP 服务 + * @param invs L3 网络清单列表 + * @param completion 操作完成后的回调 + * */ + + void enableDhcp(List invs, Completion completion); + + /** + * 禁用指定 L3 网络的 DHCP 服务 + * @param invs L3 网络清单列表 + * @param ipversion IP 版本 + * @param completion 操作完成后的回调 + * */ + + void disableDhcp(List invs, int ipversion, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java b/header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java new file mode 100644 index 00000000000..d3840068954 --- /dev/null +++ b/header/src/main/java/org/zstack/header/network/service/VirtualRouterLoadBalancerExtensionPoint.java @@ -0,0 +1,10 @@ +package org.zstack.header.network.service; + +import org.zstack.header.core.Completion; + +/** + * Created by boce.wang on 11/25/2024. + */ +public interface VirtualRouterLoadBalancerExtensionPoint { + void afterRefreshLoadBalancerListener(String vrUuid, Completion completion); +} diff --git a/header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java b/header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java new file mode 100644 index 00000000000..76ff8dfa432 --- /dev/null +++ b/header/src/main/java/org/zstack/header/observabilityServer/ObservabilityServerConstant.java @@ -0,0 +1,17 @@ +package org.zstack.header.observabilityServer; + +import org.zstack.header.configuration.PythonClass; + +/** + * Created by boce.wang on 11/25/2024. + */ +public interface ObservabilityServerConstant { + @PythonClass + public static final String OBSERVABILITY_SERVER_VM_TYPE = "ObservabilityServer"; + @PythonClass + public static final String OBSERVABILITY_SERVER_OFFERING_TYPE = "ObservabilityServer"; + @PythonClass + public static final String SERVICE_ID = "observabilityServer"; + public static final String ACTION_CATEGORY = "observabilityServer"; + +} diff --git a/header/src/main/java/org/zstack/header/os/OSArchitecture.java b/header/src/main/java/org/zstack/header/os/OSArchitecture.java new file mode 100644 index 00000000000..57776bf301f --- /dev/null +++ b/header/src/main/java/org/zstack/header/os/OSArchitecture.java @@ -0,0 +1,65 @@ +package org.zstack.header.os; + +import java.util.Locale; + +/** + * Represents the operating system architecture type obtained from System.getProperty("os.arch"). + */ +public enum OSArchitecture { + X86_64(new String[]{"amd64", "x86_64"}, "x86_64"), + AARCH64(new String[]{"aarch64"}, "aarch64"), + LOONGARCH64(new String[]{"loongarch64"}, "loongarch64"), + MIPS64EL(new String[]{"mips64el"}, "mips64el"), + UNKNOWN(null, "unknown"); + + private final String[] archNames; + private final String normalizedName; + + /** + * Private constructor for OSArchitecture enum. + * + * @param archNames An array of possible raw architecture names from System.getProperty("os.arch"). Can be null for UNKNOWN. + * @param normalizedName The standardized, simplified name for this architecture. + */ + OSArchitecture(String[] archNames, String normalizedName) { + this.archNames = archNames; + this.normalizedName = normalizedName; + } + + /** + * Gets the current OS architecture based on System.getProperty("os.arch"). + * Returns UNKNOWN if no match is found. + * + * @return The corresponding OSArchitecture enum constant. + */ + public static OSArchitecture getCurrent() { + String currentArch = System.getProperty("os.arch"); + if (currentArch == null) { + return UNKNOWN; + } + + String lowerCaseArch = currentArch.toLowerCase(Locale.ROOT); + + for (OSArchitecture arch : values()) { + if (arch.archNames == null) { + continue; + } + for (String name : arch.archNames) { + if (lowerCaseArch.equals(name.toLowerCase())) { + return arch; + } + } + } + return UNKNOWN; + } + + /** + * Returns a normalized string representation of the architecture, as defined in the enum constant. + * For example, for X86_64, this will always return "x86_64". + * + * @return A normalized string name for the architecture. + */ + public String normalizedArchName() { + return this.normalizedName; + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/rest/RESTFacade.java b/header/src/main/java/org/zstack/header/rest/RESTFacade.java index 9fcdedbd545..e9d3120f9d6 100755 --- a/header/src/main/java/org/zstack/header/rest/RESTFacade.java +++ b/header/src/main/java/org/zstack/header/rest/RESTFacade.java @@ -36,6 +36,8 @@ public interface RESTFacade { void asyncJsonDelete(String url, String body, Map headers, AsyncRESTCallback callback, TimeUnit unit, long timeout); void asyncJsonGet(String url, String body, Map headers, AsyncRESTCallback callback, TimeUnit unit, long timeout); + void asyncJson(final String url, final String body, Map headers, HttpMethod method, final AsyncRESTCallback callback, final TimeUnit unit, final long timeout); + T syncJsonPost(String url, Object body, Class returnClass); T syncJsonPost(String url, Object body, Class returnClass, TimeUnit unit, long timeout); @@ -62,6 +64,8 @@ public interface RESTFacade { T syncJsonPut(String url, String body, Map headers, Class returnClass, TimeUnit unit, long timeout); + RestHttp http(Class returnClass); + ResponseEntity syncRawJson(String url, HttpEntity req, HttpMethod method, TimeUnit unit, long timeout); HttpHeaders syncHead(String url); diff --git a/header/src/main/java/org/zstack/header/rest/RestHttp.java b/header/src/main/java/org/zstack/header/rest/RestHttp.java new file mode 100644 index 00000000000..7c7527698fc --- /dev/null +++ b/header/src/main/java/org/zstack/header/rest/RestHttp.java @@ -0,0 +1,221 @@ +package org.zstack.header.rest; + +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.zstack.header.Confirm; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorableValue; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.utils.DebugUtils; +import org.zstack.utils.TypeUtils; +import org.zstack.utils.gson.JSONObjectUtil; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; + +import static org.zstack.header.Confirm.*; + +public class RestHttp { + public final Class returnClass; + + // basic info + protected String path; + protected Map headers = new HashMap<>(); + protected String body; + protected HttpMethod method; + + // request parameters + protected boolean timeoutEnabled = true; + protected long timeoutInMillis = 1800000L; // -1 means never timeout + protected boolean retry = true; + protected int retryTimes = 5; + protected int retryIntervalInSeconds = 1; + + // response handlers + protected BiFunction, ErrorCode> errorCodeBuilder; + protected Function, ResponseEntity> handler; + protected final List> retryIfExceptionMatched = new ArrayList<>(); + + public RestHttp(Class returnClass) { + this.returnClass = Objects.requireNonNull(returnClass); + } + + public RestHttp withPath(String path) { + this.path = path; + return this; + } + + public RestHttp withHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public RestHttp withBody(String body) { + this.body = body; + return this; + } + + public RestHttp withBodyJson(Object body) { + this.body = JSONObjectUtil.toJsonString(body); + return this; + } + + public RestHttp withTimeoutInMillis(long timeoutInMillis) { + this.timeoutEnabled = true; + this.timeoutInMillis = timeoutInMillis; + return this; + } + + /** + * Not recommended + */ + public RestHttp withoutTimeout() { + this.timeoutEnabled = false; + this.timeoutInMillis = -1L; + return this; + } + + public RestHttp withRetry(int retryTimes, int retryIntervalInSeconds) { + this.retry = true; + this.retryTimes = retryTimes; + this.retryIntervalInSeconds = retryIntervalInSeconds; + return this; + } + + public RestHttp withoutRetry() { + this.retry = false; + return this; + } + + public RestHttp retryIfException(Function checker) { + this.retryIfExceptionMatched.add(checker); + return this; + } + + public RestHttp retryIfException(Class... classes) { + return retryIfException(e -> TypeUtils.isTypeOf(e, classes) ? Yes : No); + } + + public RestHttp withHandler(Function, ResponseEntity> handler) { + this.handler = handler; + return this; + } + + public RestHttp withErrorCodeBuilder(BiFunction, ErrorCode> errorCodeBuilder) { + this.errorCodeBuilder = errorCodeBuilder; + return this; + } + + @SuppressWarnings("unchecked") + protected ErrorableValue handleWithErrorCode() { + try { + DebugUtils.Assert(this.handler != null, "handler cannot be null"); + final ResponseEntity entity = this.handler.apply(this); + if (returnClass == Void.class) { + return ErrorableValue.of(null); + } + + return returnClass == String.class ? + ((ErrorableValue) ErrorableValue.of(entity.getBody())) : + ErrorableValue.of(JSONObjectUtil.toObject(entity.getBody(), returnClass)); + } catch (OperationFailureException e) { + return ErrorableValue.ofErrorCode(e.getErrorCode()); + } + } + + public T get() { + return call(HttpMethod.GET); + } + + public ErrorableValue getWithErrorCode() { + return callWithErrorCode(HttpMethod.GET); + } + + public T post() { + return call(HttpMethod.POST); + } + + public ErrorableValue postWithErrorCode() { + return callWithErrorCode(HttpMethod.POST); + } + + public T put() { + return call(HttpMethod.PUT); + } + + public ErrorableValue putWithErrorCode() { + return callWithErrorCode(HttpMethod.PUT); + } + + public T delete() { + return call(HttpMethod.DELETE); + } + + public ErrorableValue deleteWithErrorCode() { + return callWithErrorCode(HttpMethod.DELETE); + } + + public T call(HttpMethod method) { + this.method = method; + ErrorableValue result = handleWithErrorCode(); + if (!result.isSuccess()) { + throw new OperationFailureException(result.error); + } + return result.result; + } + + public ErrorableValue callWithErrorCode(HttpMethod method) { + this.method = method; + return handleWithErrorCode(); + } + + public ResponseEntity exchange(HttpMethod method) { + this.method = method; + return this.handler.apply(this); + } + + public String getPath() { + return path; + } + + public Map getHeaders() { + return headers; + } + + public String getBody() { + return body; + } + + public HttpMethod getMethod() { + return method; + } + + public boolean isTimeoutEnabled() { + return timeoutEnabled; + } + + public long getTimeoutInMillis() { + return timeoutInMillis; + } + + public boolean isRetry() { + return retry; + } + + public int getRetryTimes() { + return retryTimes; + } + + public int getRetryIntervalInSeconds() { + return retryIntervalInSeconds; + } + + public BiFunction, ErrorCode> getErrorCodeBuilder() { + return errorCodeBuilder; + } + + public List> getRetryIfExceptionMatched() { + return retryIfExceptionMatched; + } +} diff --git a/header/src/main/java/org/zstack/header/rest/RestRequest.java b/header/src/main/java/org/zstack/header/rest/RestRequest.java index d606b570170..e2e062e4624 100755 --- a/header/src/main/java/org/zstack/header/rest/RestRequest.java +++ b/header/src/main/java/org/zstack/header/rest/RestRequest.java @@ -21,4 +21,5 @@ String[] mappingFields() default {}; Class responseClass(); String category() default ""; + String morphTransform() default ""; } diff --git a/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java b/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java index fa73f3579b5..c35816b09ae 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java +++ b/header/src/main/java/org/zstack/header/storage/addon/IscsiRemoteTarget.java @@ -1,6 +1,12 @@ package org.zstack.header.storage.addon; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.net.URI; + public class IscsiRemoteTarget extends BlockRemoteTarget { + private final static CLogger logger = Utils.getLogger(IscsiRemoteTarget.class); private String transport = "tcp"; private String iqn; @@ -70,4 +76,50 @@ public enum DiskIdType { wwn, serial } + + public static IscsiRemoteTarget fromUri(String uriString) { + try { + URI uri = URI.create(uriString); + + if (!"iscsi".equalsIgnoreCase(uri.getScheme())) { + logger.info("Invalid URI scheme. Expected 'iscsi', got: " + uri.getScheme()); + return null; + } + + IscsiRemoteTarget target = new IscsiRemoteTarget(); + String authority = uri.getAuthority(); + if (authority == null || authority.isEmpty()) { + logger.info("Invalid URI authority: " + uri.getAuthority()); + return null; + } + String[] serverHostNames = authority.split(":")[0].split(","); + target.setIp(serverHostNames[0]); + target.setPort(uri.getPort() == -1 ? 3260 : uri.getPort()); + + // parse: /{iqn}/{diskIdType}_{diskId} + String path = uri.getPath(); + if (path != null && path.startsWith("/")) { + String[] pathParts = path.substring(1).split("/"); + if (pathParts.length >= 2) { + target.setIqn(pathParts[0]); + String[] diskParts = pathParts[1].split("_", 2); + if (diskParts.length == 2) { + target.setDiskIdType(diskParts[0]); + target.setDiskId(diskParts[1]); + } else { + logger.info("Invalid diskId format in URI path: " + pathParts[1]); + return null; + } + } else { + logger.info("Invalid URI path format: " + path); + return null; + } + } + + return target; + } catch (Exception e) { + logger.error("Failed to parse URI: " + uriString, e); + return null; + } + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/ExternalPrimaryStorageHostRefVO.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO.java similarity index 63% rename from header/src/main/java/org/zstack/header/storage/primary/ExternalPrimaryStorageHostRefVO.java rename to header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO.java index 7bffdb23960..035f89b1ff2 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/ExternalPrimaryStorageHostRefVO.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO.java @@ -1,4 +1,6 @@ -package org.zstack.header.storage.primary; +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO; import javax.persistence.Column; import javax.persistence.Entity; @@ -12,6 +14,9 @@ public class ExternalPrimaryStorageHostRefVO extends PrimaryStorageHostRefVO { @Column private String protocol; + @Column + private int hostId; + public String getProtocol() { return protocol; } @@ -19,4 +24,12 @@ public String getProtocol() { public void setProtocol(String protocol) { this.protocol = protocol; } + + public int getHostId() { + return hostId; + } + + public void setHostId(int hostId) { + this.hostId = hostId; + } } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java new file mode 100644 index 00000000000..0701135df99 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageHostRefVO_.java @@ -0,0 +1,12 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(ExternalPrimaryStorageHostRefVO.class) +public class ExternalPrimaryStorageHostRefVO_ extends PrimaryStorageHostRefVO_ { + public static volatile SingularAttribute hostId; + public static volatile SingularAttribute protocol; +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java index 269cb483bb4..52b1946405c 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/ExternalPrimaryStorageVO_.java @@ -10,4 +10,5 @@ public class ExternalPrimaryStorageVO_ extends PrimaryStorageVO_ { public static volatile SingularAttribute identity; public static volatile SingularAttribute config; public static volatile SingularAttribute addonInfo; + public static volatile SingularAttribute defaultProtocol; } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java index 4a25a811c85..5d6896960ce 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java @@ -32,6 +32,7 @@ public interface PrimaryStorageControllerSvc { void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletioncomp); void flattenVolume(String installPath, ReturnValueCompletioncomp); + // support uri or path void stats(String installPath, ReturnValueCompletion comp); void batchStats(Collection installPath, ReturnValueCompletion> comp); @@ -50,4 +51,7 @@ public interface PrimaryStorageControllerSvc { void validateConfig(String config); void setTrashExpireTime(int timeInSeconds, Completion completion); + void onFirstAdditionConfigure(Completion completion); + + long alignSize(long size); } diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java index e36f2ca6956..f292e694183 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageNodeSvc.java @@ -23,6 +23,8 @@ public interface PrimaryStorageNodeSvc { List getActiveVolumesLocation(HostInventory h); + void deployClient(HostInventory h, Completion comp); + void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp); void deactivateHeartbeatVolume(HostInventory h, Completion comp); diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java b/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java index d38ea8ce9db..b2a6b7fe64a 100644 --- a/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/StorageCapabilities.java @@ -5,6 +5,7 @@ import java.util.List; +// TODO Merge with PrimaryStorageFeature public class StorageCapabilities { private VolumeSnapshotCapability snapshotCapability; @@ -13,11 +14,20 @@ public class StorageCapabilities { private boolean supportStorageQos; private boolean supportLiveExpandVolume; + private boolean supportShareableVolume; private boolean supportExportVolumeSnapshot; public List supportedImageFormats; private VolumeProtocol defaultIsoActiveProtocol; private VolumeProtocol defaultImageExportProtocol; + public boolean isSupportShareableVolume() { + return supportShareableVolume; + } + + public void setSupportShareableVolume(boolean supportShareableVolume) { + this.supportShareableVolume = supportShareableVolume; + } + public VolumeProtocol getDefaultIsoActiveProtocol() { return defaultIsoActiveProtocol; } diff --git a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java index 0604aa016c3..981f6ad1943 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpImageCacheOnPrimaryStorageMsg.java @@ -41,8 +41,6 @@ public String getPrimaryStorageUuid() { return uuid; } - - public static APICleanUpImageCacheOnPrimaryStorageMsg __example__() { APICleanUpImageCacheOnPrimaryStorageMsg msg = new APICleanUpImageCacheOnPrimaryStorageMsg(); msg.setUuid(uuid()); diff --git a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java index b7aaa80a30b..547b9da04ea 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java +++ b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageEvent.java @@ -33,4 +33,10 @@ public APICleanUpStorageTrashOnPrimaryStorageEvent(String apiId) { public APICleanUpStorageTrashOnPrimaryStorageEvent() { } + + public static APICleanUpStorageTrashOnPrimaryStorageEvent __example__() { + APICleanUpStorageTrashOnPrimaryStorageEvent event = new APICleanUpStorageTrashOnPrimaryStorageEvent(); + event.setTotal(1); + return event; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java index 19c910314e5..4d2b219d76b 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/APICleanUpStorageTrashOnPrimaryStorageMsg.java @@ -37,4 +37,10 @@ public boolean isForce() { public void setForce(boolean force) { this.force = force; } + + public static APICleanUpStorageTrashOnPrimaryStorageMsg __example__() { + APICleanUpStorageTrashOnPrimaryStorageMsg msg = new APICleanUpStorageTrashOnPrimaryStorageMsg(); + msg.setUuid(uuid()); + return msg; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java index 2a08a8fac90..5126ffa2883 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/AllocatePrimaryStorageMsg.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Allocate PrimaryStorage @@ -21,6 +22,7 @@ public class AllocatePrimaryStorageMsg extends NeedReplyMessage { private String backupStorageUuid; private List possiblePrimaryStorageTypes; private List excludePrimaryStorageTypes; + private Set requiredFeatures; private Long totalSize = null; private long size; @@ -43,6 +45,14 @@ public class AllocatePrimaryStorageMsg extends NeedReplyMessage { private boolean noOverProvisioning; private String purpose; + public Set getRequiredFeatures() { + return requiredFeatures; + } + + public void setRequiredFeatures(Set requiredFeatures) { + this.requiredFeatures = requiredFeatures; + } + public List getExcludePrimaryStorageTypes() { return excludePrimaryStorageTypes; } diff --git a/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java b/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java index f1e0372a5c8..7eebf88e616 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java +++ b/header/src/main/java/org/zstack/header/storage/primary/CheckInstallPathInTrashReply.java @@ -2,12 +2,15 @@ import org.zstack.header.message.MessageReply; +import java.util.List; + /** * Created by mingjian.deng on 2018/12/25. */ public class CheckInstallPathInTrashReply extends MessageReply { private Long trashId; private String resourceUuid; + private List relatedTrashPaths; public Long getTrashId() { return trashId; @@ -24,4 +27,12 @@ public String getResourceUuid() { public void setResourceUuid(String resourceUuid) { this.resourceUuid = resourceUuid; } + + public List getRelatedTrashPaths() { + return relatedTrashPaths; + } + + public void setRelatedTrashPaths(List relatedTrashPaths) { + this.relatedTrashPaths = relatedTrashPaths; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java new file mode 100644 index 00000000000..8e1595df39c --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageMsg.java @@ -0,0 +1,52 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +import java.util.ArrayList; +import java.util.List; + +public class CommitVolumeSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { + private VolumeInventory volume; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + private List srcChildrenInstallPathInDb = new ArrayList<>(); + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + public List getSrcChildrenInstallPathInDb() { + return srcChildrenInstallPathInDb; + } + + public void setSrcChildrenInstallPathInDb(List srcChildrenInstallPathInDb) { + this.srcChildrenInstallPathInDb = srcChildrenInstallPathInDb; + } + + @Override + public String getPrimaryStorageUuid() { + return srcSnapshot.getPrimaryStorageUuid(); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java new file mode 100644 index 00000000000..d5f87e1ab9f --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/CommitVolumeSnapshotOnPrimaryStorageReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.MessageReply; + +public class CommitVolumeSnapshotOnPrimaryStorageReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java new file mode 100644 index 00000000000..e3e6acec382 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteOnPrimaryStorageMessage.java @@ -0,0 +1,5 @@ +package org.zstack.header.storage.primary; + +public interface DeleteOnPrimaryStorageMessage extends PrimaryStorageMessage { + boolean isGcOnFailure(); +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java index ff8302a44ba..839eecf6e85 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageMsg.java @@ -5,8 +5,9 @@ /** */ -public class DeleteSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { +public class DeleteSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements DeleteOnPrimaryStorageMessage { private VolumeSnapshotInventory snapshot; + private boolean gcOnFailure = false; @Override public String getPrimaryStorageUuid() { @@ -20,4 +21,13 @@ public VolumeSnapshotInventory getSnapshot() { public void setSnapshot(VolumeSnapshotInventory snapshot) { this.snapshot = snapshot; } + + @Override + public boolean isGcOnFailure() { + return gcOnFailure; + } + + public void setGcOnFailure(boolean gcOnFailure) { + this.gcOnFailure = gcOnFailure; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java index ed29cbe5e69..39a8a89bf44 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteSnapshotOnPrimaryStorageReply.java @@ -5,4 +5,13 @@ /** */ public class DeleteSnapshotOnPrimaryStorageReply extends MessageReply { + private boolean gcSubmitted = false; + + public void setGcSubmitted(boolean gcSubmitted) { + this.gcSubmitted = gcSubmitted; + } + + public boolean isGcSubmitted() { + return gcSubmitted; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java index e481e4bf75f..f635eb61318 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageMsg.java @@ -1,18 +1,23 @@ package org.zstack.header.storage.primary; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.utils.CollectionUtils; import java.util.List; -public class DeleteVolumeChainOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { +public class DeleteVolumeChainOnPrimaryStorageMsg extends NeedReplyMessage implements DeleteOnPrimaryStorageMessage { private String primaryStorageUuid; - + // TODO remove this field, use url instead private String hostUuid; private List installPaths; private String volumeFormat; + // TODO refactor, remove it + // for gc, used to deduplicate GC + private String chainTop; + @Override public String getPrimaryStorageUuid() { return primaryStorageUuid; @@ -45,4 +50,22 @@ public String getVolumeFormat() { public void setVolumeFormat(String volumeFormat) { this.volumeFormat = volumeFormat; } + + public String getChainTop() { + if (chainTop != null) { + return chainTop; + } else if (!CollectionUtils.isEmpty(installPaths)) { + return installPaths.get(0); + } + return null; + } + + public void setChainTop(String chainTop) { + this.chainTop = chainTop; + } + + @Override + public boolean isGcOnFailure() { + return true; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java index 2f2fc268ed1..3602f203e85 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DeleteVolumeChainOnPrimaryStorageReply.java @@ -2,5 +2,17 @@ import org.zstack.header.message.MessageReply; +import java.util.ArrayList; +import java.util.List; + public class DeleteVolumeChainOnPrimaryStorageReply extends MessageReply { + private List undeletedInstallPaths = new ArrayList<>(); + + public List getUndeletedInstallPaths() { + return undeletedInstallPaths; + } + + public void setUndeletedInstallPaths(List undeletedInstallPaths) { + this.undeletedInstallPaths = undeletedInstallPaths; + } } diff --git a/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java new file mode 100644 index 00000000000..8e82eafac9d --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotMsg.java @@ -0,0 +1,27 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.NeedReplyMessage; + +import java.util.List; + +public class GetOwningVolumePathFromInternalSnapshotMsg extends NeedReplyMessage implements PrimaryStorageMessage { + private String primaryStorageUuid; + private List snapshotPaths; + + @Override + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public List getSnapshotPaths() { + return snapshotPaths; + } + + public void setSnapshotPaths(List snapshotPaths) { + this.snapshotPaths = snapshotPaths; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java new file mode 100644 index 00000000000..00836233185 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/GetOwningVolumePathFromInternalSnapshotReply.java @@ -0,0 +1,22 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.MessageReply; + +import java.util.HashMap; +import java.util.Map; + +public class GetOwningVolumePathFromInternalSnapshotReply extends MessageReply { + private Map owningVolumePaths = new HashMap<>(); + + public Map getOwningVolumePaths() { + return owningVolumePaths; + } + + public void setOwningVolumePaths(Map owningVolumePaths) { + this.owningVolumePaths = owningVolumePaths; + } + + public void putOwningVolumePath(String snapshotPath, String volumePath) { + this.owningVolumePaths.put(snapshotPath, volumePath); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java index 08c361b78f3..d928fea28c7 100644 --- a/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/GetVolumeBackingChainFromPrimaryStorageMsg.java @@ -12,6 +12,7 @@ public class GetVolumeBackingChainFromPrimaryStorageMsg extends NeedReplyMessage private String volumeUuid; private List rootInstallPaths = new ArrayList<>(); private String primaryStorageUuid; + // TODO remove it private String hostUuid; private String volumeFormat; diff --git a/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java index ffb9854b2cf..13bc292157b 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java +++ b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageAllocationSpec.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; /** */ @@ -23,6 +24,15 @@ public class PrimaryStorageAllocationSpec { private List possiblePrimaryStorageTypes; private List excludePrimaryStorageTypes; private String backupStorageUuid; + private Set requiredFeatures; + + public Set getRequiredFeatures() { + return requiredFeatures; + } + + public void setRequiredFeatures(Set requiredFeatures) { + this.requiredFeatures = requiredFeatures; + } public List getCandidatePrimaryStorageUuids() { return candidatePrimaryStorageUuids == null ? Collections.emptyList() : candidatePrimaryStorageUuids; diff --git a/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java new file mode 100644 index 00000000000..1dbee35303c --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/PrimaryStorageFeature.java @@ -0,0 +1,9 @@ +package org.zstack.header.storage.primary; + +/** + * @ Author : yh.w + * @ Date : Created in 10:42 2025/7/15 + */ +public enum PrimaryStorageFeature { + SHARED_VOLUME, +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java new file mode 100644 index 00000000000..2c06c26286e --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageMsg.java @@ -0,0 +1,52 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.header.volume.VolumeInventory; + +public class PullVolumeSnapshotOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { + private VolumeInventory volume; + private String srcSnapshotParentPath; + private VolumeSnapshotInventory srcSnapshot; + private VolumeSnapshotInventory dstSnapshot; + + public VolumeInventory getVolume() { + return volume; + } + + public void setVolume(VolumeInventory volume) { + this.volume = volume; + } + + public String getSrcSnapshotParentPath() { + return srcSnapshotParentPath; + } + + public void setSrcSnapshotParentPath(String srcSnapshotParentPath) { + this.srcSnapshotParentPath = srcSnapshotParentPath; + } + + public VolumeSnapshotInventory getSrcSnapshot() { + return srcSnapshot; + } + + public void setSrcSnapshot(VolumeSnapshotInventory srcSnapshot) { + this.srcSnapshot = srcSnapshot; + } + + public VolumeSnapshotInventory getDstSnapshot() { + return dstSnapshot; + } + + public void setDstSnapshot(VolumeSnapshotInventory dstSnapshot) { + this.dstSnapshot = dstSnapshot; + } + + @Override + public String getPrimaryStorageUuid() { + if (volume == null) { + throw new IllegalArgumentException("volume cannot be null"); + } + return volume.getPrimaryStorageUuid(); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java new file mode 100644 index 00000000000..0cae40ce2e4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/primary/PullVolumeSnapshotOnPrimaryStorageReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.storage.primary; + +import org.zstack.header.message.MessageReply; + +public class PullVolumeSnapshotOnPrimaryStorageReply extends MessageReply { + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java deleted file mode 100644 index 5ee1ed35a3f..00000000000 --- a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageMsg.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.zstack.header.storage.primary; - -import org.zstack.header.message.NeedReplyMessage; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; -import org.zstack.header.volume.VolumeInventory; - -/** - * @ Author : yh.w - * @ Date : Created in 11:47 2023/8/21 - */ -public class UndoSnapshotCreationOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage { - private String vmUuid; - private VolumeInventory volume; - private VolumeSnapshotInventory snapshot; - private String srcPath; - private String dstPath; - private String primaryStorageUuid; - - public VolumeSnapshotInventory getSnapshot() { - return snapshot; - } - - public void setSnapshot(VolumeSnapshotInventory snapshot) { - this.snapshot = snapshot; - } - - public VolumeInventory getVolume() { - return volume; - } - - public void setVolume(VolumeInventory volume) { - this.volume = volume; - } - - public String getVmUuid() { - return vmUuid; - } - - public void setVmUuid(String vmUuid) { - this.vmUuid = vmUuid; - } - - public String getSrcPath() { - return srcPath; - } - - public void setSrcPath(String srcPath) { - this.srcPath = srcPath; - } - - public String getDstPath() { - return dstPath; - } - - public void setDstPath(String dstPath) { - this.dstPath = dstPath; - } - - public void setPrimaryStorageUuid(String primaryStorageUuid) { - this.primaryStorageUuid = primaryStorageUuid; - } - - @Override - public String getPrimaryStorageUuid() { - return primaryStorageUuid; - } -} diff --git a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java deleted file mode 100644 index be0b31aa3c4..00000000000 --- a/header/src/main/java/org/zstack/header/storage/primary/UndoSnapshotCreationOnPrimaryStorageReply.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.zstack.header.storage.primary; - -import org.zstack.header.message.MessageReply; - -public class UndoSnapshotCreationOnPrimaryStorageReply extends MessageReply { - private String newVolumeInstallPath; - private long size; - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public String getNewVolumeInstallPath() { - return newVolumeInstallPath; - } - - public void setNewVolumeInstallPath(String newVolumeInstallPath) { - this.newVolumeInstallPath = newVolumeInstallPath; - } -} diff --git a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java index ab75ad69b61..79050146db5 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java +++ b/header/src/main/java/org/zstack/header/storage/primary/VolumeSnapshotCapability.java @@ -1,26 +1,47 @@ package org.zstack.header.storage.primary; +import java.util.function.Function; + /** * Created by frank on 6/9/2015. */ public class VolumeSnapshotCapability { - public boolean isSupportCreateOnHypervisor() { - return supportCreateOnHypervisor; - } - - public void setSupportCreateOnHypervisor(boolean supportCreateOnHypervisor) { - this.supportCreateOnHypervisor = supportCreateOnHypervisor; - } - public static enum VolumeSnapshotArrangementType { CHAIN, INDIVIDUAL } + + public static enum VolumeSnapshotPlacementType { + INTERNAL, + EXTERNAL, + } private boolean support; + + /*** + * Whether the primary storage supports creating volume snapshots by hypervisor. + */ private boolean supportCreateOnHypervisor; + + + /*** + * Whether the primary storage supports lazy delete for volume snapshots. + * even if snapshot is not ready for delete, it can be auto-deleted in storage backend. + * so client can delete snapshot immediately without waiting for reference cleaned. + */ + private boolean supportLazyDelete; + private VolumeSnapshotArrangementType arrangementType; + private VolumeSnapshotPlacementType placementType; + + /*** + * If volume snapshot is inner snapshot on volume, it must be set. + * A regex match volume install path from inner volume snapshot install path. + * such as pool/vol from pool/vol@snapshot can be extracted by regex ^[^@]+ + */ + private String volumePathFromInternalSnapshotRegex; + public boolean isSupport() { return support; } @@ -36,4 +57,38 @@ public VolumeSnapshotArrangementType getArrangementType() { public void setArrangementType(VolumeSnapshotArrangementType arrangementType) { this.arrangementType = arrangementType; } + + public VolumeSnapshotPlacementType getPlacementType() { + return placementType; + } + + public void setPlacementType(VolumeSnapshotPlacementType placementType) { + this.placementType = placementType; + } + + public boolean isSupportCreateOnHypervisor() { + return supportCreateOnHypervisor; + } + + public void setSupportCreateOnHypervisor(boolean supportCreateOnHypervisor) { + this.supportCreateOnHypervisor = supportCreateOnHypervisor; + } + + public boolean isSupportLazyDelete() { + return supportLazyDelete; + } + + public void setSupportLazyDelete(boolean supportLazyDelete) { + this.supportLazyDelete = supportLazyDelete; + } + + @Deprecated + public String getVolumePathFromInternalSnapshotRegex() { + return volumePathFromInternalSnapshotRegex; + } + + @Deprecated + public void setVolumePathFromInternalSnapshotRegex(String volumePathFromInternalSnapshotRegex) { + this.volumePathFromInternalSnapshotRegex = volumePathFromInternalSnapshotRegex; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java index f9ed4e674fa..93003c6211c 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsg.java @@ -61,6 +61,12 @@ public class APIDeleteVolumeSnapshotMsg extends APIDeleteMessage implements Dele @APINoSee private String treeUuid; + @APIParam(required = false, validValues = {"pull", "commit", "auto"}) + private String direction = "auto"; + + @APIParam(required = false, validValues = {"single", "chain", "auto"}) + private String scope = "chain"; + @Override public String getTreeUuid() { return treeUuid; @@ -84,6 +90,22 @@ public String getSnapshotUuid() { return uuid; } + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + @Override public String getVolumeUuid() { return volumeUuid; diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy index 44586873a44..36b1322fc02 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/snapshot/APIDeleteVolumeSnapshotMsgDoc_zh_cn.groovy @@ -39,6 +39,24 @@ doc { optional true since "0.6" } + column { + name "direction" + enclosedIn "" + desc "数据合并方向。pull:向前合并;commit:向后合并;auto:自动选择最优合并方向" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "scope" + enclosedIn "" + desc "数据合并方式。single:仅合并单个快照;chain:合并整个快照链;auto:自动判断最佳合并范围" + location "body" + type "String" + optional true + since "5.4.0" + } column { name "systemTags" enclosedIn "" diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java new file mode 100644 index 00000000000..09fa7efe320 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotDirection.java @@ -0,0 +1,30 @@ +package org.zstack.header.storage.snapshot; + +public enum DeleteVolumeSnapshotDirection { + Pull("pull"), + Commit("commit"), + Auto("auto"); + + private final String direction; + + DeleteVolumeSnapshotDirection(String direction) { + this.direction = direction; + } + + @Override + public String toString() { + return direction; + } + + public static DeleteVolumeSnapshotDirection fromString(String value) { + if (value == null || value.trim().isEmpty()) { + throw new IllegalArgumentException(String.format("direction must be one of [pull, commit, auto], but value is %s", value)); + } + for (DeleteVolumeSnapshotDirection direction : DeleteVolumeSnapshotDirection.values()) { + if (direction.direction.equalsIgnoreCase(value)) { + return direction; + } + } + throw new IllegalArgumentException("Invalid direction: " + value); + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java index 78fe7375d56..b6efff2c386 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMessage.java @@ -7,4 +7,8 @@ */ public interface DeleteVolumeSnapshotMessage extends VolumeSnapshotMessage { DeletionMode getDeletionMode(); + + String getDirection(); + + String getScope(); } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java index 3bb86662266..78af874890e 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotMsg.java @@ -1,6 +1,7 @@ package org.zstack.header.storage.snapshot; import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.APIParam; import org.zstack.header.message.NeedReplyMessage; /** @@ -11,6 +12,8 @@ public class DeleteVolumeSnapshotMsg extends NeedReplyMessage implements DeleteV private String volumeUuid; private String treeUuid; private String deletionMode; + private String direction; + private String scope; public void setSnapshotUuid(String snapshotUuid) { this.snapshotUuid = snapshotUuid; @@ -49,4 +52,22 @@ public void setTreeUuid(String treeUuid) { public String getTreeUuid() { return treeUuid; } + + @Override + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + @Override + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java new file mode 100644 index 00000000000..1cf6b15dcf4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/DeleteVolumeSnapshotScope.java @@ -0,0 +1,18 @@ +package org.zstack.header.storage.snapshot; + +public enum DeleteVolumeSnapshotScope { + Single("single"), + Chain("chain"), + Auto("auto"); + + private final String scope; + + DeleteVolumeSnapshotScope(String scope) { + this.scope = scope; + } + + @Override + public String toString() { + return scope; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java deleted file mode 100644 index 06073791161..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeMsg.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.zstack.header.storage.snapshot; - -import org.zstack.header.message.NeedReplyMessage; - -/** - * @ Author : yh.w - * @ Date : Created in 13:35 2023/9/4 - */ -public class MarkSnapshotAsVolumeMsg extends NeedReplyMessage implements VolumeSnapshotMessage { - private String volumeUuid; - private String snapshotUuid; - private long size; - private String volumePath; - private String treeUuid; - - public String getVolumePath() { - return volumePath; - } - - public void setVolumePath(String volumePath) { - this.volumePath = volumePath; - } - - public String getVolumeUuid() { - return volumeUuid; - } - - public void setVolumeUuid(String volumeUuid) { - this.volumeUuid = volumeUuid; - } - - @Override - public void setTreeUuid(String treeUuid) { - this.treeUuid = treeUuid; - } - - @Override - public String getTreeUuid() { - return treeUuid; - } - - public String getSnapshotUuid() { - return snapshotUuid; - } - - public void setSnapshotUuid(String snapshotUuid) { - this.snapshotUuid = snapshotUuid; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } -} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java b/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java deleted file mode 100644 index e14d357bfb4..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/MarkSnapshotAsVolumeReply.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.zstack.header.storage.snapshot; - -import org.zstack.header.message.MessageReply; - -/** - * @ Author : yh.w - * @ Date : Created in 15:59 2023/9/4 - */ -public class MarkSnapshotAsVolumeReply extends MessageReply { -} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java index 0044b6ca8fb..da1592442ad 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotAfterDeleteExtensionPoint.java @@ -1,6 +1,7 @@ package org.zstack.header.storage.snapshot; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import java.util.List; @@ -8,7 +9,6 @@ * Created by xing5 on 2016/5/3. */ public interface VolumeSnapshotAfterDeleteExtensionPoint { - void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion); - void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot); + void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion); void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots); } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java index 07099be40ca..7c1cf7f6244 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionMsg.java @@ -9,6 +9,8 @@ public class VolumeSnapshotDeletionMsg extends DeletionMessage implements Volume private String volumeUuid; private boolean volumeDeletion; private boolean dbOnly; + private String direction; + private String scope; /** * @ignore */ @@ -57,4 +59,20 @@ public boolean isDbOnly() { public void setDbOnly(boolean dbOnly) { this.dbOnly = dbOnly; } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java new file mode 100644 index 00000000000..cd1b03ef05a --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotDeletionStructs.java @@ -0,0 +1,39 @@ +package org.zstack.header.storage.snapshot; + +import java.util.List; + +public class VolumeSnapshotDeletionStructs { + private List snapshotInventories; + private String direction; + private String scope; + + public VolumeSnapshotDeletionStructs(List snapshotInventories, String direction, String scope) { + this.snapshotInventories = snapshotInventories; + this.direction = direction; + this.scope = scope; + } + + public List getSnapshotInventories() { + return snapshotInventories; + } + + public void setSnapshotInventories(List snapshotInventories) { + this.snapshotInventories = snapshotInventories; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotInventory.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotInventory.java old mode 100755 new mode 100644 diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java deleted file mode 100755 index fdd6c422490..00000000000 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotPreDeleteExtensionPoint.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.zstack.header.storage.snapshot; - -/** - * Created by xing5 on 2016/5/3. - */ -public interface VolumeSnapshotPreDeleteExtensionPoint { - void volumeSnapshotPreDeleteExtensionPoint(VolumeSnapshotInventory snapshot); -} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java new file mode 100644 index 00000000000..c3a19becf5f --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotRevertOverlayVolumeMsg.java @@ -0,0 +1,16 @@ +package org.zstack.header.storage.snapshot; + +import org.zstack.header.message.OverlayMessage; +import org.zstack.header.volume.VolumeMessage; + +public class VolumeSnapshotRevertOverlayVolumeMsg extends OverlayMessage implements VolumeMessage { + private String volumeUuid; + + public String getVolumeUuid() { + return volumeUuid; + } + + public void setVolumeUuid(String volumeUuid) { + this.volumeUuid = volumeUuid; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java index fbb8a670d83..57b4fab4099 100755 --- a/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/VolumeSnapshotTree.java @@ -348,6 +348,7 @@ private VolumeSnapshotInventory getInventory(Set filterUuids) { private SnapshotLeaf root; private String volumeUuid; + private String uuid; public static VolumeSnapshotTree fromInventories(List invs) { VolumeSnapshotTree tree = new VolumeSnapshotTree(); @@ -377,6 +378,7 @@ public static VolumeSnapshotTree fromInventories(List i } tree.volumeUuid = inv.getVolumeUuid(); + tree.uuid = inv.getTreeUuid(); } DebugUtils.Assert(tree.root != null, "why tree root is null???"); @@ -403,6 +405,14 @@ public void setVolumeUuid(String volumeUuid) { this.volumeUuid = volumeUuid; } + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + private SnapshotLeaf findSnapshot(final List leafs, final Function func) { for (SnapshotLeaf leaf : leafs) { SnapshotLeaf ret = findSnapshot(leaf.children, func); @@ -424,4 +434,12 @@ public SnapshotLeaf findSnapshot(Function func } return findSnapshot(root.children, func); } + + public SnapshotLeaf findSnapshot(String snapshotUuid) { + if (snapshotUuid == null) { + return null; + } + + return findSnapshot(arg -> arg.getUuid().equals(snapshotUuid)); + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java index 1a5d3c16f7e..42fe3df00a9 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsg.java @@ -5,6 +5,7 @@ import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; import org.zstack.header.message.DefaultTimeout; +import org.zstack.header.rest.APINoSee; import org.zstack.header.rest.RestRequest; import org.zstack.header.storage.snapshot.SnapshotBackendOperation; import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; @@ -25,6 +26,15 @@ public class APIDeleteVolumeSnapshotGroupMsg extends APIDeleteMessage implements @APIParam(resourceType = VolumeSnapshotGroupVO.class, successIfResourceNotExisting = true) private String uuid; + @APIParam(required = false, validValues = {"pull", "commit", "auto"}) + private String direction = "auto"; + + @APIParam(required = false, validValues = {"single", "chain", "auto"}) + private String scope = "chain"; + + @APINoSee + private String vmUuid; + public String getUuid() { return uuid; } @@ -33,6 +43,30 @@ public void setUuid(String uuid) { this.uuid = uuid; } + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getVmUuid() { + return vmUuid; + } + + public void setVmUuid(String vmUuid) { + this.vmUuid = vmUuid; + } + @Override public String getGroupUuid() { return uuid; diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy index b835804ca6f..11e71e4c39d 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/APIDeleteVolumeSnapshotGroupMsgDoc_zh_cn.groovy @@ -30,6 +30,24 @@ doc { optional false since "3.6.0" } + column { + name "direction" + enclosedIn "" + desc "数据合并方向。pull:向前合并;commit:向后合并;auto:自动选择最优合并方向" + location "body" + type "String" + optional true + since "5.4.0" + } + column { + name "scope" + enclosedIn "" + desc "数据合并方式。single:仅合并单个快照;chain:合并整个快照链;auto:自动判断最佳合并范围" + location "body" + type "String" + optional true + since "5.4.0" + } column { name "deleteMode" enclosedIn "" diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java b/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java index cddf37f9ff1..6f1129a8911 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/group/DeleteVolumeSnapshotGroupInnerMsg.java @@ -10,6 +10,8 @@ public class DeleteVolumeSnapshotGroupInnerMsg extends NeedReplyMessage implements VolumeSnapshotGroupMessage { private String uuid; private String deletionMode; + private String direction; + private String scope; public String getUuid() { return uuid; @@ -36,4 +38,20 @@ public void setDeletionMode(APIDeleteMessage.DeletionMode deletionMode) { public APIDeleteMessage.DeletionMode getDeletionMode() { return APIDeleteMessage.DeletionMode.valueOf(deletionMode); } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java index a3db08d459c..e8b12800b12 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceInventory.java @@ -36,6 +36,9 @@ public class VolumeSnapshotReferenceInventory { private String directSnapshotInstallUrl; + /** + * the UUID of resource referencing @volumeUuid. + */ private String referenceUuid; private String referenceType; diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java index b553ade6380..0020210791c 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceTreeVO_.java @@ -13,4 +13,7 @@ public class VolumeSnapshotReferenceTreeVO_ extends ResourceVO_ { public static volatile SingularAttribute rootVolumeUuid; public static volatile SingularAttribute rootVolumeSnapshotTreeUuid; public static volatile SingularAttribute rootVolumeSnapshotInstallUrl; + + public static volatile SingularAttribute primaryStorageUuid; + public static volatile SingularAttribute hostUuid; } diff --git a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java index 25fe22ee9e0..c646c440847 100644 --- a/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java +++ b/header/src/main/java/org/zstack/header/storage/snapshot/reference/VolumeSnapshotReferenceVO.java @@ -52,6 +52,9 @@ public class VolumeSnapshotReferenceVO { private Long parentId; + /** + * the UUID of resource referencing @volumeUuid. + */ @Column private String referenceUuid; diff --git a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java index 45168b08aaf..3ea3c9375c0 100644 --- a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java +++ b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsg.java @@ -2,13 +2,13 @@ import org.springframework.http.HttpMethod; import org.zstack.header.configuration.DiskOfferingVO; +import org.zstack.header.configuration.InstanceOfferingVO; import org.zstack.header.identity.Action; import org.zstack.header.image.ImageVO; import org.zstack.header.message.APIParam; import org.zstack.header.message.APISyncCallMessage; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.rest.RestRequest; -import org.zstack.header.storage.backup.BackupStorageVO; import java.util.List; @@ -41,6 +41,17 @@ public class APIGetCandidatePrimaryStoragesForCreatingVmMsg extends APISyncCallM private String clusterUuid; private String defaultL3NetworkUuid; + @APIParam(required = false, resourceType = InstanceOfferingVO.class, checkAccount = true) + private String instanceOfferingUuid; + + public String getInstanceOfferingUuid() { + return instanceOfferingUuid; + } + + public void setInstanceOfferingUuid(String instanceOfferingUuid) { + this.instanceOfferingUuid = instanceOfferingUuid; + } + public List getDataDiskSizes() { return dataDiskSizes; } diff --git a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy index d0f388f677b..d0b146235af 100644 --- a/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/vm/APIGetCandidatePrimaryStoragesForCreatingVmMsgDoc_zh_cn.groovy @@ -120,6 +120,15 @@ doc { optional true since "2.1" } + column { + name "instanceOfferingUuid" + enclosedIn "" + desc "计算规格UUID" + location "query" + type "String" + optional true + since "5.4.0" + } } } diff --git a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java index 89d9fc210bc..763a5757476 100755 --- a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java +++ b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java @@ -69,7 +69,7 @@ public class APIMigrateVmMsg extends APIMessage implements VmInstanceMessage, Mi @APIParam(required = false) private boolean allowUnknown; - @APIParam(required = false, validValues = {"auto-converge"}) + @APIParam(required = false, validValues = {"auto-converge", "no-converge"}) private String strategy; @APIParam(required = false) diff --git a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy index a615888ea1d..6b948fc0699 100644 --- a/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/vm/APIMigrateVmMsgDoc_zh_cn.groovy @@ -65,7 +65,7 @@ doc { type "String" optional true since "3.6.0" - values ("auto-converge") + values ("auto-converge","no-converge") } column { name "systemTags" diff --git a/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java b/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java index 733e3db7aa3..a268e6421dc 100755 --- a/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java +++ b/header/src/main/java/org/zstack/header/vm/VmAbnormalLifeCycleStruct.java @@ -163,6 +163,14 @@ boolean match(VmAbnormalLifeCycleStruct struct) { && Objects.equals(struct.getCurrentHostUuid(), struct.getOriginalHostUuid()); } }, + VmNoStateFromUnknownStateHostNotChanged { + @Override + boolean match(VmAbnormalLifeCycleStruct struct) { + return struct.getOriginalState() == VmInstanceState.Unknown + && struct.getCurrentState() == VmInstanceState.NoState + && Objects.equals(struct.getCurrentHostUuid(), struct.getOriginalHostUuid()); + } + }, VmNoStateFromCrashedStateHostNotChanged { @Override boolean match(VmAbnormalLifeCycleStruct struct) { diff --git a/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java b/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java index bde3985ce8d..e6fe6a92272 100755 --- a/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java +++ b/header/src/main/java/org/zstack/header/vm/VmCanonicalEvents.java @@ -19,6 +19,7 @@ public class VmCanonicalEvents { public static final String VM_NIC_INFO_CHANGED_PATH = "/vm/nicinfo/change"; public static final String VM_NIC_INFO_DUPLICATE_PATH = "/vm/nicinfo/duplicate"; public static final String VM_NIC_INFO_IPRANGE_CONFLICT_PATH = "/vm/nicinfo/iprangeConflict"; + public static final String VM_GPU_STATUS_ABNORMAL = "/vm/gpu/status/abnormal"; @NeedJsonSchema public static class VmCrashReportData { @@ -317,4 +318,35 @@ public void setInternalIp(String internalIp) { this.internalIp = internalIp; } } + + @NeedJsonSchema + public static class VmGpuStatusAbnormalData { + private String vmUuid; + private String pciDeviceAddress; + private String status; + + public String getVmUuid() { + return vmUuid; + } + + public void setVmUuid(String vmUuid) { + this.vmUuid = vmUuid; + } + + public String getPciDeviceAddress() { + return pciDeviceAddress; + } + + public void setPciDeviceAddress(String pciDeviceAddress) { + this.pciDeviceAddress = pciDeviceAddress; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + } } diff --git a/header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy new file mode 100644 index 00000000000..a6d208d5d32 --- /dev/null +++ b/header/src/main/java/org/zstack/header/vm/VmCapabilitiesDoc_zh_cn.groovy @@ -0,0 +1,33 @@ +package org.zstack.header.vm + +import org.zstack.header.vm.VmCapabilities + +doc { + + title "云主机能力" + + field { + name "supportLiveMigration" + desc "是否支持热迁移" + type "boolean" + since "3.1.0" + } + field { + name "supportVolumeMigration" + desc "是否支持卷迁移" + type "boolean" + since "3.1.0" + } + field { + name "supportReimage" + desc "是否支持重装" + type "boolean" + since "3.1.0" + } + field { + name "supportMemorySnapshot" + desc "是否支持内存快照" + type "boolean" + since "3.1.0" + } +} diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java index bf807146deb..896e60e414e 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java @@ -8,6 +8,7 @@ public interface VmInstanceConstant { String ACTION_CATEGORY = "instance"; @PythonClass String USER_VM_TYPE = "UserVm"; + String APPLIANCE_VM_TYPE = "ApplianceVm"; Integer VM_MONITOR_NUMBER = 1; // System limit @@ -19,6 +20,7 @@ public interface VmInstanceConstant { String VM_SYNC_SIGNATURE_PREFIX = "Vm-"; + String L2_TF_VSWITCH_TYPE = "TfL2Network"; String TF_VIRTUAL_NIC_TYPE = "TFVNIC"; enum Params { @@ -85,4 +87,10 @@ enum Capability { String EMPTY_CDROM = "empty"; String NONE_CDROM = "none"; + + String MEMORY_ACCESS_MODE_SHARED = "shared"; + String MEMORY_ACCESS_MODE_PRIVATE = "private"; + + Long VM_NIC_QOS_MIN = 8000L; + Long VM_NIC_QOS_MAX = 30000000000L; } diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java b/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java index 481c8affd26..44ce4a8831e 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceNicFactory.java @@ -7,7 +7,6 @@ public interface VmInstanceNicFactory { VmNicType getType(); - VSwitchType getVSwitchType(); VmNicVO createVmNic(VmNicInventory inv, VmInstanceSpec spec); static VmNicVO createVmNic(VmNicInventory nic) { diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceState.java b/header/src/main/java/org/zstack/header/vm/VmInstanceState.java index 281c22480eb..8a755b52fda 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceState.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceState.java @@ -3,10 +3,7 @@ import org.zstack.header.configuration.PythonClass; import org.zstack.header.exception.CloudRuntimeException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @PythonClass public enum VmInstanceState { @@ -32,6 +29,8 @@ public enum VmInstanceState { public static List intermediateStates = new ArrayList(); + public static Set offlineStates = new HashSet<>(); + static { intermediateStates.add(Starting); intermediateStates.add(Stopping); @@ -43,6 +42,12 @@ public enum VmInstanceState { intermediateStates.add(VolumeMigrating); intermediateStates.add(VolumeRecovering); + offlineStates.add(Created); + offlineStates.add(Stopped); + offlineStates.add(Destroyed); + offlineStates.add(VolumeMigrating); + offlineStates.add(Crashed); + Created.transactions( new Transaction(VmInstanceStateEvent.starting, VmInstanceState.Starting), new Transaction(VmInstanceStateEvent.destroying, VmInstanceState.Destroying), diff --git a/header/src/main/java/org/zstack/header/vm/VmNicType.java b/header/src/main/java/org/zstack/header/vm/VmNicType.java index 184fa74239c..3fd9612742a 100755 --- a/header/src/main/java/org/zstack/header/vm/VmNicType.java +++ b/header/src/main/java/org/zstack/header/vm/VmNicType.java @@ -1,13 +1,17 @@ package org.zstack.header.vm; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class VmNicType { + public enum VmNicSubType { + NONE, + SRIOV, + VHOSTUSER, + } private static Map types = Collections.synchronizedMap(new HashMap<>()); private final String typeName; + private boolean hasAddon = false; private boolean useSRIOV = false; public VmNicType(String typeName) { @@ -15,12 +19,6 @@ public VmNicType(String typeName) { types.put(typeName, this); } - public VmNicType(String typeName, Boolean useSRIOV) { - this.typeName = typeName; - this.useSRIOV = useSRIOV; - types.put(typeName, this); - } - public static VmNicType valueOf(String typeName) { VmNicType type = types.get(typeName); if (type == null) { @@ -29,10 +27,22 @@ public static VmNicType valueOf(String typeName) { return type; } + public boolean isHasAddon() { + return hasAddon; + } + + public void setHasAddon(boolean hasAddon) { + this.hasAddon = hasAddon; + } + public boolean isUseSRIOV() { return useSRIOV; } + public void setUseSRIOV(boolean useSRIOV) { + this.useSRIOV = useSRIOV; + } + @Override public String toString() { return typeName; diff --git a/header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java new file mode 100644 index 00000000000..833df491428 --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/CreateDataVolumeMsg.java @@ -0,0 +1,78 @@ +package org.zstack.header.volume; + +import org.zstack.header.message.NeedReplyMessage; + +public class CreateDataVolumeMsg extends NeedReplyMessage implements VolumeCreateMessage { + private String name; + private String description; + private String diskOfferingUuid; + private long diskSize; + private String primaryStorageUuid; + private String accountUuid; + private String resourceUuid; + private APICreateDataVolumeMsg apiMsg; + + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDiskOfferingUuid() { + return diskOfferingUuid; + } + + public void setDiskOfferingUuid(String diskOfferingUuid) { + this.diskOfferingUuid = diskOfferingUuid; + } + + public long getDiskSize() { + return diskSize; + } + + public void setDiskSize(long diskSize) { + this.diskSize = diskSize; + } + + public String getAccountUuid() { + return accountUuid; + } + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public String getResourceUuid() { + return resourceUuid; + } + + public void setResourceUuid(String resourceUuid) { + this.resourceUuid = resourceUuid; + } + + public APICreateDataVolumeMsg getApiMsg() { + return apiMsg; + } + + public void setApiMsg(APICreateDataVolumeMsg apiMsg) { + this.apiMsg = apiMsg; + } +} diff --git a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java b/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java deleted file mode 100644 index 682a563fde5..00000000000 --- a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationMsg.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.zstack.header.volume; - -import org.zstack.header.message.NeedReplyMessage; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; - -public class UndoSnapshotCreationMsg extends NeedReplyMessage implements VolumeMessage { - String vmInstanceUuid; - String volumeUuid; - VolumeSnapshotInventory snapShot; - - public String getVmInstanceUuid() { - return vmInstanceUuid; - } - - public void setVmInstanceUuid(String vmInstanceUuid) { - this.vmInstanceUuid = vmInstanceUuid; - } - - public VolumeSnapshotInventory getSnapShot() { - return snapShot; - } - - public void setSnapShot(VolumeSnapshotInventory snapShot) { - this.snapShot = snapShot; - } - - @Override - public String getVolumeUuid() { - return volumeUuid; - } - - public void setVolumeUuid(String volumeUuid) { - this.volumeUuid = volumeUuid; - } -} diff --git a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java b/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java deleted file mode 100644 index c3d7098374c..00000000000 --- a/header/src/main/java/org/zstack/header/volume/UndoSnapshotCreationReply.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.zstack.header.volume; - -import org.zstack.header.message.MessageReply; - -public class UndoSnapshotCreationReply extends MessageReply { - private VolumeInventory volume; - - public VolumeInventory getVolume() { - return volume; - } - - public void setVolume(VolumeInventory volume) { - this.volume = volume; - } -} diff --git a/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java b/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java index 3d6f8f76c78..673c7cbf9bd 100755 --- a/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeBeforeExpungeExtensionPoint.java @@ -1,13 +1,14 @@ package org.zstack.header.volume; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; /** * Created by xing5 on 2016/5/3. */ public interface VolumeBeforeExpungeExtensionPoint { void volumePreExpunge(VolumeInventory volume); - void volumeBeforeExpunge(VolumeInventory volume, Completion completion); + void volumeBeforeExpunge(VolumeInventory volume, NoErrorCompletion completion); default boolean skipExpungeVolume(VolumeInventory volume) { return false; diff --git a/header/src/main/java/org/zstack/header/volume/VolumeConfigs.java b/header/src/main/java/org/zstack/header/volume/VolumeConfigs.java new file mode 100644 index 00000000000..0693125b54f --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/VolumeConfigs.java @@ -0,0 +1,17 @@ +package org.zstack.header.volume; + +/** + * @ Author : yh.w + * @ Date : Created in 16:38 2025/1/24 + */ +public class VolumeConfigs { + private int queueNum = 1; + + public int getQueueNum() { + return queueNum; + } + + public void setQueueNum(int queueNum) { + this.queueNum = queueNum; + } +} diff --git a/header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java b/header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java new file mode 100644 index 00000000000..961515ab198 --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/VolumeConfigsExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.header.volume; + +public interface VolumeConfigsExtensionPoint { + void setVolumeConfigs(VolumeConfigs vcs, String volUuid); +} diff --git a/header/src/main/java/org/zstack/header/volume/VolumeStats.java b/header/src/main/java/org/zstack/header/volume/VolumeStats.java index 5cf77698ea2..2931945e7ed 100644 --- a/header/src/main/java/org/zstack/header/volume/VolumeStats.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeStats.java @@ -2,9 +2,16 @@ public class VolumeStats { protected String installPath; - protected Long actualSize; protected String format; + protected Long actualSize; protected Long size; + /** + * The parent uri of the volume, vendor://pool/path@snapshot or snapshot://uuid + */ + protected String parentUri; + + // TODO(shenjin): remove it + @Deprecated protected String runStatus; public VolumeStats(String installPath, Long actualSize) { @@ -54,6 +61,15 @@ public String getFormat() { return format; } + public void setParentUri(String parentUri) { + this.parentUri = parentUri; + } + + public String getParentUri() { + return parentUri; + } + + @Deprecated public String getRunStatus() { return runStatus; } diff --git a/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java new file mode 100644 index 00000000000..b4bed57f82e --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventory.java @@ -0,0 +1,57 @@ +package org.zstack.header.volume.block; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; +import org.zstack.header.search.Parent; +import org.zstack.header.volume.VolumeConstant; +import org.zstack.header.volume.VolumeInventory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Inventory(mappingVOClass = BlockVolumeVO.class, collectionValueOfMethod="valueOf1", + parent = {@Parent(inventoryClass = VolumeInventory.class, type = VolumeConstant.BLOCK_VOLUME_TYPE)}) +@PythonClassInventory +public class BlockVolumeInventory extends VolumeInventory { + private String iscsiPath; + + private String vendor; + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getIscsiPath() { + return iscsiPath; + } + + public void setIscsiPath(String iscsiPath) { + this.iscsiPath = iscsiPath; + } + + public static BlockVolumeInventory valueOf(BlockVolumeVO vo) { + return new BlockVolumeInventory(vo); + } + + public BlockVolumeInventory() { + } + + public BlockVolumeInventory(BlockVolumeVO other) { + super(VolumeInventory.valueOf(other)); + this.vendor = other.getVendor(); + this.iscsiPath = other.getIscsiPath(); + } + + public static List valueOf1(Collection vos) { + List invs = new ArrayList(vos.size()); + for (BlockVolumeVO vo : vos) { + invs.add(new BlockVolumeInventory(vo)); + } + return invs; + } +} diff --git a/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..7dacb678bdd --- /dev/null +++ b/header/src/main/java/org/zstack/header/volume/block/BlockVolumeInventoryDoc_zh_cn.groovy @@ -0,0 +1,150 @@ +package org.zstack.header.volume.block + +import java.lang.Integer +import java.lang.Long +import java.sql.Timestamp +import java.lang.Boolean + +doc { + + title "块存储卷" + + field { + name "iscsiPath" + desc "" + type "String" + since "4.7.11" + } + field { + name "vendor" + desc "" + type "String" + since "4.7.11" + } + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "4.7.11" + } + field { + name "name" + desc "资源名称" + type "String" + since "4.7.11" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "4.7.11" + } + field { + name "primaryStorageUuid" + desc "主存储UUID" + type "String" + since "4.7.11" + } + field { + name "vmInstanceUuid" + desc "云主机UUID" + type "String" + since "4.7.11" + } + field { + name "diskOfferingUuid" + desc "云盘规格UUID" + type "String" + since "4.7.11" + } + field { + name "rootImageUuid" + desc "" + type "String" + since "4.7.11" + } + field { + name "installPath" + desc "" + type "String" + since "4.7.11" + } + field { + name "type" + desc "" + type "String" + since "4.7.11" + } + field { + name "format" + desc "" + type "String" + since "4.7.11" + } + field { + name "size" + desc "" + type "Long" + since "4.7.11" + } + field { + name "actualSize" + desc "" + type "Long" + since "4.7.11" + } + field { + name "deviceId" + desc "" + type "Integer" + since "4.7.11" + } + field { + name "state" + desc "" + type "String" + since "4.7.11" + } + field { + name "status" + desc "" + type "String" + since "4.7.11" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "4.7.11" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "4.7.11" + } + field { + name "isShareable" + desc "" + type "Boolean" + since "4.7.11" + } + field { + name "volumeQos" + desc "" + type "String" + since "4.7.11" + } + field { + name "lastDetachDate" + desc "" + type "Timestamp" + since "4.7.11" + } + field { + name "lastVmInstanceUuid" + desc "" + type "String" + since "4.7.11" + } +} diff --git a/identity/pom.xml b/identity/pom.xml index a46c9397b39..2f06a0008cb 100755 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. identity diff --git a/identity/src/main/java/org/zstack/identity/AccountBase.java b/identity/src/main/java/org/zstack/identity/AccountBase.java index a62c0ad5418..ca4d7c59ed0 100755 --- a/identity/src/main/java/org/zstack/identity/AccountBase.java +++ b/identity/src/main/java/org/zstack/identity/AccountBase.java @@ -12,13 +12,21 @@ import org.zstack.core.cloudbus.EventFacade; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.*; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQLBatch; +import org.zstack.core.db.SQLBatchWithReturn; +import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.core.Completion; -import org.zstack.header.core.workflow.*; +import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.core.workflow.FlowDoneHandler; +import org.zstack.header.core.workflow.FlowErrorHandler; +import org.zstack.header.core.workflow.FlowTrigger; +import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.identity.*; @@ -435,6 +443,10 @@ private void handle(APIGetAccountQuotaUsageMsg msg) { } private void handle(APIUpdateQuotaMsg msg) { + for (QuotaExtensionPoint ext : pluginRgty.getExtensionList(QuotaExtensionPoint.class)) { + ext.beforeUpdateQuota(msg.getQuotaVO().getName(), msg.getValue(), msg.getIdentityUuid()); + } + QuotaVO quota = msg.getQuotaVO(); quota.setValue(msg.getValue()); quota = dbf.updateAndRefresh(quota); diff --git a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java index 88d1d837130..0cbaf8b45aa 100644 --- a/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java +++ b/identity/src/main/java/org/zstack/identity/AccountLoginBackend.java @@ -29,15 +29,6 @@ public LoginType getLoginType() { return loginType; } - @Override - public Map generateJwtTokenClaims(LoginContext loginContext, LoginSessionInfo info) { - Map claims = new HashMap<>(); - claims.put(AccountConstant.LOGIN_TYPE_NAME, loginContext.getLoginBackendType()); - claims.put(AccountConstant.FULL_NAME, loginContext.getUsername()); - claims.put(AccountConstant.PREFERRED_USERNAME, loginContext.getUsername()); - return claims; - } - @Override public void login(LoginContext loginContext, ReturnValueCompletion completion) { AccountVO vo = Q.New(AccountVO.class) @@ -153,6 +144,6 @@ public void collectUserInfoIntoContext(LoginContext loginContext) { @Override public List getRequiredAdditionalAuthFeature() { - return Arrays.asList(LoginAuthConstant.basicLoginControl, LoginAuthConstant.twoFactor); + return Arrays.asList(LoginAuthConstant.basicLoginControl, LoginAuthConstant.twoFactor, LoginAuthConstant.ssoServerLoginControl); } } diff --git a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java index 99fefbb48c6..c00a6e11dd2 100755 --- a/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/AccountManagerImpl.java @@ -430,10 +430,10 @@ private void handle(APICheckApiPermissionMsg msg) { try { new Auth().check(api); - ret.put(apiName, StatementEffect.Allow.toString()); + ret.put(apiName, PolicyStatementEffect.Allow.toString()); } catch (ApiMessageInterceptionException e) { logger.debug(e.getMessage()); - ret.put(apiName, StatementEffect.Deny.toString()); + ret.put(apiName, PolicyStatementEffect.Deny.toString()); } } catch (ClassNotFoundException e) { throw new OperationFailureException(argerr("%s is not an API", apiName)); @@ -815,7 +815,7 @@ private void collectDefaultQuota() { } } - repairAccountQuota(); + // repairAccountQuota(); } private void collectQuotaMessageCheckers(Quota quota) { @@ -873,7 +873,8 @@ protected void scripts() { List existingQuota = q(QuotaVO.class).select(QuotaVO_.name).eq(QuotaVO_.identityUuid, nA).listValues(); for (Map.Entry e : quotaDefinitionMap.entrySet()) { String rtype = e.getKey(); - Long value = e.getValue().getDefaultValue(); + Long value = e.getValue().getRepairValue() != null ? + e.getValue().getRepairValue() : e.getValue().getDefaultValue(); if (existingQuota.contains(rtype)) { continue; } @@ -1263,7 +1264,7 @@ private void accountFieldCheck() throws IllegalAccessException { private void useDecision(Decision d, boolean userPolicy) { String policyCategory = userPolicy ? "user policy" : "group policy"; - if (d.effect == StatementEffect.Allow) { + if (d.effect == PolicyStatementEffect.Allow) { logger.debug(String.format("API[name: %s, action: %s] is approved by a %s[name: %s, uuid: %s]," + " statement[name: %s, action: %s]", msg.getClass().getSimpleName(), d.action, policyCategory, d.policy.getName(), d.policy.getUuid(), d.statement.getName(), d.actionRule)); @@ -1378,7 +1379,7 @@ class Decision { String action; PolicyStatement statement; String actionRule; - StatementEffect effect; + PolicyStatementEffect effect; } private Decision decide(List userPolicies) { diff --git a/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java b/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java index 8c6b9e5f26a..ca045613d5f 100644 --- a/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java +++ b/identity/src/main/java/org/zstack/identity/IAMIdentityResourceGenerator.java @@ -10,7 +10,6 @@ import org.zstack.utils.logging.CLogger; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static org.zstack.utils.CollectionDSL.list; @@ -49,7 +48,7 @@ private void makeReadAPIsForNormalAccountJSONStatement() { readAPIs.add(APIUpdateUserMsg.class.getName()); PolicyStatement s = PolicyStatement.builder().name("read-apis-for-normal-account") - .effect(StatementEffect.Allow) + .effect(PolicyStatementEffect.Allow) .actions(readAPIs) .build(); diff --git a/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java b/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java new file mode 100644 index 00000000000..b49a39ce967 --- /dev/null +++ b/identity/src/main/java/org/zstack/identity/QuotaExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.identity; + +import org.zstack.header.identity.QuotaVO; + +public interface QuotaExtensionPoint { + void beforeUpdateQuota(String quotaName, long newValue, String accountUuid); +} diff --git a/identity/src/main/java/org/zstack/identity/Session.java b/identity/src/main/java/org/zstack/identity/Session.java index fdc837f2d54..2b27931beef 100755 --- a/identity/src/main/java/org/zstack/identity/Session.java +++ b/identity/src/main/java/org/zstack/identity/Session.java @@ -40,6 +40,10 @@ public class Session implements Component { private DatabaseFacade dbf; @Autowired private EventFacade evtf; + @Autowired + private PluginRegistry pluginRgty; + + private static List logoutExtensionPoints; private Future expiredSessionCollector; private static Interner sessionLock = Interners.newWeakInterner(); @@ -221,6 +225,11 @@ protected ErrorCode scripts() { } logout(s.getUuid()); + + for (LogoutExtensionPoint ext : logoutExtensionPoints) { + ext.beforeLogout(s); + } + return err(IdentityErrors.INVALID_SESSION, "Session expired"); } @@ -266,6 +275,7 @@ public boolean start() { setupGlobalConfig(); startCleanUpStaleSessionTask(); setupCanonicalEvents(); + logoutExtensionPoints = pluginRgty.getExtensionList(LogoutExtensionPoint.class); return true; } diff --git a/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java b/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java index 8b003d6da85..42b127de4cd 100644 --- a/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java +++ b/identity/src/main/java/org/zstack/identity/login/LoginManagerImpl.java @@ -225,7 +225,7 @@ public void success(LoginSessionInfo info) { SessionInventory session = processSession(info); data.put(LoginAuthConstant.LOGIN_SESSION_INVENTORY, session); - + loginContext.getProperties().put(LoginAuthConstant.LOGIN_SESSION_UUID, session.getUuid()); for (LoginAuthExtensionPoint ext : matchedAuthExtensions) { ext.afterLoginSuccess(loginContext, info); } diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java b/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java index 59131decfbb..c2eb1e54b08 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACAPIRequestChecker.java @@ -36,7 +36,7 @@ public void check(RBACEntity entity) { return; } - if (PolicyUtils.isAdminOnlyAction(entity.getApiName()) && !AccountConstant.isAdminPermission(entity.getApiMessage().getSession())) { + if (!AccountConstant.isAdminPermission(entity.getApiMessage().getSession()) && PolicyUtils.isAdminOnlyAction(entity.getApiName())) { throw new OperationFailureException(err(IdentityErrors.PERMISSION_DENIED, "request api[name: %s] is admin only, can not be executed by current user", entity.getApiName())); diff --git a/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java b/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java index 35903c19835..7f136f9ec15 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java +++ b/identity/src/main/java/org/zstack/identity/rbac/RBACManager.java @@ -3,7 +3,6 @@ import org.zstack.core.db.SQLBatchWithReturn; import org.zstack.header.identity.*; import org.zstack.header.message.APIMessage; -import org.zstack.identity.Session; import java.util.ArrayList; import java.util.HashMap; @@ -21,20 +20,14 @@ static List getPoliciesByAPI(APIMessage message) { } static List getPoliciesBySession(final SessionInventory session) { + if (session.getAccountUuid().equals(AccountConstant.INITIAL_SYSTEM_ADMIN_UUID) || session.isAccountSession()) { + return new ArrayList<>(internalPolices); + + } + return new SQLBatchWithReturn>() { @Override protected List scripts() { - List ret = new ArrayList<>(); - if (!session.getAccountUuid().equals(AccountConstant.INITIAL_SYSTEM_ADMIN_UUID) && !session.isAccountSession()) { - ret.addAll(getPoliciesForUser(session)); - } else { - ret.addAll(internalPolices); - } - - return ret; - } - - private List getPoliciesForUser(SessionInventory session) { // polices attached to the user List vos = sql("select p from PolicyVO p, UserPolicyRefVO r where r.policyUuid = p.uuid" + " and r.userUuid = :uuid", PolicyVO.class).param("uuid", session.getUserUuid()).list(); @@ -51,7 +44,7 @@ private List getPoliciesForUser(SessionInventory session) { static Map> collectDenyStatements(List polices) { Map> ret = new HashMap<>(); polices.forEach(p -> { - List ss = p.getStatements().stream().filter(s->s.getEffect() == StatementEffect.Deny).collect(Collectors.toList()); + List ss = p.getStatements().stream().filter(s->s.getEffect() == PolicyStatementEffect.Deny).collect(Collectors.toList()); if (!ss.isEmpty()) { ret.put(p, ss); } @@ -63,7 +56,7 @@ static Map> collectDenyStatements(List> collectAllowedStatements(List polices) { Map> ret = new HashMap<>(); polices.forEach(p -> { - List ss = p.getStatements().stream().filter(s->s.getEffect() == StatementEffect.Allow).collect(Collectors.toList()); + List ss = p.getStatements().stream().filter(s->s.getEffect() == PolicyStatementEffect.Allow).collect(Collectors.toList()); if (!ss.isEmpty()) { ret.put(p, ss); } diff --git a/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy b/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy index e47b71a19e0..932c85c56b3 100755 --- a/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy +++ b/identity/src/main/java/org/zstack/identity/rbac/SystemInternalPolicy.groovy @@ -3,7 +3,7 @@ package org.zstack.identity.rbac import org.zstack.header.identity.AccountConstant import org.zstack.header.identity.InternalPolicy import org.zstack.header.identity.PolicyInventory -import org.zstack.header.identity.StatementEffect +import org.zstack.header.identity.PolicyStatementEffect import org.zstack.header.identity.rbac.RBAC class SystemInternalPolicy implements InternalPolicy { @@ -15,7 +15,7 @@ class SystemInternalPolicy implements InternalPolicy { statement { name = "normal-account-allowed-apis" - effect = StatementEffect.Allow + effect = PolicyStatementEffect.Allow RBAC.permissions.each { info -> info.normalAPIs.each { action(it) } @@ -24,7 +24,7 @@ class SystemInternalPolicy implements InternalPolicy { statement { name = "give-admin-all-apis" - effect = StatementEffect.Allow + effect = PolicyStatementEffect.Allow action("**") diff --git a/image/pom.xml b/image/pom.xml index b595568f6ea..917fbc74fac 100755 --- a/image/pom.xml +++ b/image/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. image diff --git a/image/src/main/java/org/zstack/image/ImageBase.java b/image/src/main/java/org/zstack/image/ImageBase.java index 2843e90c0c3..c4ca5fcb840 100755 --- a/image/src/main/java/org/zstack/image/ImageBase.java +++ b/image/src/main/java/org/zstack/image/ImageBase.java @@ -3,8 +3,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.compute.vm.IsoOperator; -import org.zstack.compute.vm.VmSystemTags; +import org.zstack.compute.vm.*; import org.zstack.core.asyncbatch.While; import org.zstack.core.cascade.CascadeConstant; import org.zstack.core.cascade.CascadeFacade; @@ -36,8 +35,7 @@ import org.zstack.header.image.ImageDeletionPolicyManager.ImageDeletionPolicy; import org.zstack.header.message.*; import org.zstack.header.storage.backup.*; -import org.zstack.header.vm.DetachIsoFromVmInstanceMsg; -import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.*; import org.zstack.header.volume.VolumeType; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; @@ -51,8 +49,7 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.*; -import static org.zstack.utils.CollectionDSL.e; -import static org.zstack.utils.CollectionDSL.map; +import static org.zstack.utils.CollectionDSL.*; /** * Created with IntelliJ IDEA. @@ -295,6 +292,7 @@ private void handle(final ExpungeImageMsg msg) { bus.reply(msg, reply); return; } + dbf.remove(ref); DeleteBitsOnBackupStorageMsg dmsg = new DeleteBitsOnBackupStorageMsg(); dmsg.setBackupStorageUuid(ref.getBackupStorageUuid()); @@ -314,7 +312,6 @@ public void run(MessageReply r) { } returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getActualSize()); - dbf.remove(ref); //TODO remove ref from metadata, this logic should after all refs deleted runAfterExpungeImageExtension(ref.getBackupStorageUuid()); @@ -453,9 +450,7 @@ public void done(ErrorCodeList errorCodeList) { } }); - List refs = new ArrayList<>(); - for (final ImageBackupStorageRefVO ref : toDelete) { chain.then(new NoRollbackFlow() { String __name__ = String.format("delete-image-%s-from-backup-storage-%s", self.getUuid(), ref.getBackupStorageUuid()); @@ -463,6 +458,8 @@ public void done(ErrorCodeList errorCodeList) { @Override public void run(final FlowTrigger trigger, Map data) { if (deletionPolicy == ImageDeletionPolicy.Direct) { + dbf.remove(ref); + DeleteBitsOnBackupStorageMsg dmsg = new DeleteBitsOnBackupStorageMsg(); dmsg.setBackupStorageUuid(ref.getBackupStorageUuid()); dmsg.setInstallPath(ref.getInstallPath()); @@ -471,16 +468,22 @@ public void run(final FlowTrigger trigger, Map data) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - //TODO logger.warn(String.format("failed to delete image[uuid:%s, name:%s] from backup storage[uuid:%s] because %s," + " need to garbage collect it", self.getUuid(), self.getName(), reply.getError(), ref.getBackupStorageUuid())); - } else { - returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getActualSize()); - dbf.remove(ref); - // now delete ref in metadata - runAfterExpungeImageExtension(ref.getBackupStorageUuid()); + + BackupStorageDeleteBitGC gc = new BackupStorageDeleteBitGC(); + gc.NAME = String.format("gc-delete-bits-%s-on-backup-storage-%s", msg.getImageUuid(), ref.getBackupStorageUuid()); + gc.backupStorageUuid = ref.getBackupStorageUuid(); + gc.imageUuid = msg.getImageUuid(); + gc.installPath = ref.getInstallPath(); + gc.deduplicateSubmit(ImageGlobalConfig.DELETION_GARBAGE_COLLECTION_INTERVAL.value(Long.class), + TimeUnit.SECONDS); } + + returnBackupStorageCapacity(ref.getBackupStorageUuid(), self.getActualSize()); + // now delete ref in metadata + runAfterExpungeImageExtension(ref.getBackupStorageUuid()); trigger.next(); } }); @@ -492,7 +495,6 @@ public void run(MessageReply reply) { } else { ref.setStatus(ImageStatus.Deleted); refs.add(ref); - trigger.next(); } } @@ -579,10 +581,8 @@ public void done(ErrorCodeList errorCodeList) { bus.reply(msg, reply); } }); - } - private void handle(OverlayMessage msg) { thdf.chainSubmit(new ChainTask(msg) { @Override @@ -815,7 +815,7 @@ public String call(ImageBackupStorageRefVO arg) { if (bsUuids.isEmpty()) { throw new OperationFailureException(operr("the image[uuid:%s, name:%s] is not deleted on any backup storage", - self.getUuid(), self.getName())); + self.getUuid(), self.getName())); } } else { for (final String bsUuid : msg.getBackupStorageUuids()) { @@ -831,12 +831,12 @@ public ImageBackupStorageRefVO call(ImageBackupStorageRefVO arg) { if (ref == null) { throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not on the backup storage[uuid:%s]", - self.getUuid(), self.getName(), bsUuid)); + self.getUuid(), self.getName(), bsUuid)); } if (ref.getStatus() != ImageStatus.Deleted) { throw new OperationFailureException(argerr("the image[uuid:%s, name:%s] is not deleted on the backup storage[uuid:%s]", - self.getUuid(), self.getName(), bsUuid)); + self.getUuid(), self.getName(), bsUuid)); } bsUuids.add(bsUuid); diff --git a/image/src/main/java/org/zstack/image/ImageManagerImpl.java b/image/src/main/java/org/zstack/image/ImageManagerImpl.java index 8d6207031b6..0f1f87975d0 100755 --- a/image/src/main/java/org/zstack/image/ImageManagerImpl.java +++ b/image/src/main/java/org/zstack/image/ImageManagerImpl.java @@ -24,6 +24,7 @@ import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.AbstractService; import org.zstack.header.allocator.HostAllocatorFilterExtensionPoint; import org.zstack.header.allocator.HostAllocatorSpec; @@ -34,6 +35,7 @@ import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostVO; @@ -46,6 +48,7 @@ import org.zstack.header.longjob.LongJobState; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; import org.zstack.header.message.*; +import org.zstack.header.network.l3.IpRangeVO; import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.backup.*; import org.zstack.header.storage.primary.CancelJobOnPrimaryStorageMsg; @@ -55,10 +58,9 @@ import org.zstack.header.storage.snapshot.*; import org.zstack.header.tag.SystemTagCreateMessageValidator; import org.zstack.header.tag.SystemTagValidator; -import org.zstack.header.vm.CreateTemplateFromRootVolumeVmMsg; -import org.zstack.header.vm.CreateTemplateFromRootVolumeVmReply; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.*; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ResourceVO_; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; import org.zstack.tag.TagManager; @@ -66,25 +68,32 @@ import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6Constants; +import org.zstack.utils.network.IPv6NetworkUtils; +import org.zstack.utils.network.NetworkUtils; import org.zstack.zql.ZQL; import javax.persistence.Tuple; import javax.persistence.TypedQuery; +import javax.xml.ws.ResponseWrapper; import java.net.URI; import java.net.URISyntaxException; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.stream.Collectors; +import static java.util.Arrays.asList; import static org.zstack.core.Platform.*; -import static org.zstack.core.progress.ProgressReportService.getTaskStage; -import static org.zstack.core.progress.ProgressReportService.reportProgress; +import static org.zstack.core.progress.ProgressReportService.*; +import static org.zstack.core.progress.ProgressReportService.markTaskStage; import static org.zstack.longjob.LongJobUtils.buildErrIfCanceled; import static org.zstack.longjob.LongJobUtils.noncancelableErr; import static org.zstack.utils.CollectionDSL.list; @@ -328,6 +337,79 @@ private void handleLocalMessage(Message msg) { } } + private void handle(final APIExpungeImageGroupMsg msg) { + final APIExpungeImageGroupEvent evt = new APIExpungeImageGroupEvent(msg.getId()); + List imageUuids = Q.New(ImageGroupRefVO.class) + .eq(ImageGroupRefVO_.imageGroupUuid, msg.getUuid()) + .select(ImageGroupRefVO_.imageUuid) + .listValues(); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-image-group-%s", msg.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = String.format("delete-images-from-image-group-%s", msg.getUuid()); + + @Override + public boolean skip(Map data) { + return CollectionUtils.isEmpty(imageUuids); + } + + @Override + public void run(final FlowTrigger trigger, Map data) { + new While<>(imageUuids).all((uuid, compl) -> { + ImageDeletionMsg msg = new ImageDeletionMsg(); + msg.setImageUuid(uuid); + msg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); + msg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(msg, ImageConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(compl) { + @Override + public void run(MessageReply reply) { + compl.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "database-clean"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + new SQLBatch() { + @Override + protected void scripts() { + if (!CollectionUtils.isEmpty(imageUuids)) { + sql(ImageGroupRefVO.class) + .eq(ImageGroupRefVO_.imageGroupUuid, msg.getUuid()) + .hardDelete(); + } + + sql(ImageGroupVO.class) + .eq(ImageGroupVO_.uuid, msg.getUuid()) + .hardDelete(); + } + }.execute(); + trigger.next(); + } + }); + chain.done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.publish(evt); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); + bus.publish(evt); + } + }).start(); + } + private void handle(CreateDataVolumeTemplateFromVolumeMsg msg) { CreateDataVolumeTemplateFromVolumeReply reply = new CreateDataVolumeTemplateFromVolumeReply(); createDataVolumeTemplateFromVolume(msg, msg.getVolumeUuid(), new ReturnValueCompletion(msg) { @@ -494,6 +576,10 @@ public void fail(ErrorCode errorCode) { private void handleApiMessage(Message msg) { if (msg instanceof APIAddImageMsg) { handle((APIAddImageMsg) msg); + } else if (msg instanceof APIExpungeImageGroupMsg) { + handle((APIExpungeImageGroupMsg) msg); + } else if (msg instanceof APICloneImageMsg) { + handle((APICloneImageMsg) msg); } else if (msg instanceof APIGetUploadImageJobDetailsMsg) { handle((APIGetUploadImageJobDetailsMsg) msg); } else if (msg instanceof APICreateRootVolumeTemplateFromRootVolumeMsg) { @@ -504,11 +590,510 @@ private void handleApiMessage(Message msg) { handle((APICreateDataVolumeTemplateFromVolumeMsg) msg); } else if (msg instanceof APICreateDataVolumeTemplateFromVolumeSnapshotMsg) { handle((APICreateDataVolumeTemplateFromVolumeSnapshotMsg) msg); + } else if (msg instanceof APICreateImageGroupFromVmInstanceMsg){ + handle((APICreateImageGroupFromVmInstanceMsg) msg); + } else if (msg instanceof APICreateImageGroupFromImageMsg){ + handle((APICreateImageGroupFromImageMsg) msg); + } else if (msg instanceof APICreateImageGroupFromSnapshotMsg){ + handle((APICreateImageGroupFromSnapshotMsg) msg); } else { bus.dealWithUnknownMessage(msg); } } + private void handle(APICreateImageGroupFromSnapshotMsg msg) { + APICreateImageGroupFromSnapshotEvent evt = new APICreateImageGroupFromSnapshotEvent(msg.getId()); + createImageGroupFromSnapshot(msg, new ReturnValueCompletion(evt) { + @Override + public void success(ImageGroupInventory imageGroup) { + evt.setInventory(imageGroup); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); + } + + private void handle(APICreateImageGroupFromVmInstanceMsg msg) { + APICreateImageGroupFromVmInstanceEvent evt = new APICreateImageGroupFromVmInstanceEvent(msg.getId()); + createImageGroupFromVmInstance(msg, msg.getVmInstanceUuid(), new ReturnValueCompletion(evt) { + @Override + public void success(ImageGroupInventory imageGroup) { + evt.setInventory(imageGroup); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); + } + + private void handle(APICreateImageGroupFromImageMsg msg) { + APICreateImageGroupFromImageEvent evt = new APICreateImageGroupFromImageEvent(msg.getId()); + + ImageGroupVO gvo = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + List dataVolumeTemplateUuids = msg.getDataVolumeTemplateUuids(); + List volumesUuids = new ArrayList<>(); + volumesUuids.add(msg.getRootVolumeTemplateUuid()); + String groupUuid = Platform.getUuid(); + ImageGroupVO vo = new ImageGroupVO(); + vo.setUuid(groupUuid); + vo.setName(msg.getName()); + vo.setStatus(ImageStatus.Ready); + vo.setDescription(msg.getDescription()); + vo.setImageCount(1); + if (!CollectionUtils.isEmpty(dataVolumeTemplateUuids)) { + vo.setImageCount(1 + dataVolumeTemplateUuids.size()); + volumesUuids.addAll(msg.getDataVolumeTemplateUuids()); + } + vo = persist(vo); + + new HashSet(volumesUuids).forEach( + uuid -> { + ImageVO image = q(ImageVO.class) + .eq(ImageVO_.uuid, uuid) + .find(); + + ImageGroupRefVO refVO = new ImageGroupRefVO(); + refVO.setImageGroupUuid(groupUuid); + refVO.setImageUuid(uuid); + persist(refVO); + } + ); + return vo; + } + }.execute(); + evt.setInventory(ImageGroupInventory.valueOf(gvo)); + bus.publish(evt); + } + + private void createImageGroupFromSnapshot(APICreateImageGroupFromSnapshotMsg msg, ReturnValueCompletion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("create-image-group-from-snapshot-%s", msg.getRootVolumeSnapshotUuid())); + chain.then(new ShareFlow() { + ImageGroupVO imageGroupVO = new ImageGroupVO(); + String rootVolumeSnapshotUuid = msg.getRootVolumeSnapshotUuid(); + List dataVolumeSnapshotUuids = msg.getDataVolumeSnapshotUuids(); + List newImageUuids = new ArrayList(); + + @Override + public void setup() { + flow(new Flow() { + String __name__ = "prepare-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + String groupUuid = StringUtils.isEmpty(msg.getResourceUuid()) ? Platform.getUuid() : msg.getResourceUuid(); + ImageGroupVO vo = new ImageGroupVO(); + vo.setUuid(groupUuid); + vo.setName(msg.getName()); + vo.setStatus(ImageStatus.Creating); + vo.setDescription(msg.getDescription()); + vo.setImageCount(1); + if (!CollectionUtils.isEmpty(dataVolumeSnapshotUuids)) { + vo.setImageCount(1 + dataVolumeSnapshotUuids.size()); + } + vo = persist(vo); + return vo; + } + }.execute(); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(imageGroupVO.getUuid(), ImageGroupVO.class); + trigger.rollback(); + } + }); + flow(new Flow() { + String __name__ = "create-root-template-from-snapshot"; + + @Override + public void run(FlowTrigger trigger, Map data) { + CreateRootVolumeTemplateFromVolumeSnapshotMsg cmsg = new CreateRootVolumeTemplateFromVolumeSnapshotMsg(); + cmsg.setName("create-from-snap-" + rootVolumeSnapshotUuid); + cmsg.setSnapshotUuid(rootVolumeSnapshotUuid); + cmsg.setSession(msg.getSession()); + bus.makeLocalServiceId(cmsg, ImageConstant.SERVICE_ID); + bus.send(cmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + + CreateRootVolumeTemplateFromVolumeSnapshotReply reply = r.castReply(); + ImageInventory imageInv = ((CreateRootVolumeTemplateFromVolumeSnapshotReply) reply).getInventory(); + newImageUuids.add(imageInv.getUuid()); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newImageUuids)) { + trigger.rollback(); + return; + } + for (String uuid : new ArrayList<>(newImageUuids)) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newImageUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new Flow() { + String __name__ = "create-data-templates-from-snapshots"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (CollectionUtils.isEmpty(dataVolumeSnapshotUuids)) { + trigger.next(); + return; + } + + List errors = new ArrayList<>(); + new While<>(dataVolumeSnapshotUuids).each((iUuid, compl) -> { + CreateDataVolumeTemplateFromVolumeSnapshotMsg csmsg = new CreateDataVolumeTemplateFromVolumeSnapshotMsg(); + csmsg.setName(String.format("create-from-snapshot-%s", iUuid)); + csmsg.setSnapshotUuid(iUuid); + csmsg.setSession(msg.getSession()); + bus.makeLocalServiceId(csmsg, ImageConstant.SERVICE_ID); + bus.send(csmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + errors.add(reply.getError()); + compl.allDone(); + } + + ImageInventory imageInv = ((CreateDataVolumeTemplateFromVolumeSnapshotReply) reply).getInventory(); + newImageUuids.add(imageInv.getUuid()); + compl.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errors.isEmpty()) { + trigger.fail(errors.get(0)); + return; + } + trigger.next(); + } + }); + + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newImageUuids)) { + trigger.rollback(); + return; + } + for (String uuid : new ArrayList<>(newImageUuids)) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newImageUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + String __name__ = "create-image-group-in-database"; + + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + ImageGroupVO vo = findByUuid(imageGroupVO.getUuid(), ImageGroupVO.class); + vo.setStatus(ImageStatus.Ready); + vo = merge(vo); + + new HashSet(newImageUuids).forEach( + resourceUuid -> { + ImageGroupRefVO refVO = new ImageGroupRefVO(); + refVO.setImageGroupUuid(imageGroupVO.getUuid()); + refVO.setImageUuid(resourceUuid); + persist(refVO); + } + ); + return vo; + } + }.execute(); + trigger.next(); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + ImageGroupInventory inv = ImageGroupInventory.valueOf(imageGroupVO); + completion.success(inv); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + + private void createImageGroupFromVmInstance(APICreateImageGroupFromVmInstanceMsg msg, String vmUuid, ReturnValueCompletion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("create-image-group-from-vm-instance-%s", vmUuid)); + chain.then(new ShareFlow() { + ImageGroupVO imageGroupVO = new ImageGroupVO(); + String rootVolumeUuid; + List dataVolumeUuids = new ArrayList(); + List newVolumeUuids = new ArrayList(); + + @Override + public void setup() { + flow(new Flow() { + String __name__ = "prepare-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + List volumes = Q.New(VolumeVO.class).eq(VolumeVO_.vmInstanceUuid, vmUuid).list(); + if (CollectionUtils.isEmpty(volumes)) { + trigger.fail(operr("vm instance[uuid:%s] has no volume", vmUuid)); + return; + } + + for (VolumeVO vol : volumes) { + if (vol.getType() == VolumeType.Root) { + rootVolumeUuid = vol.getUuid(); + } else { + dataVolumeUuids.add(vol.getUuid()); + } + } + + if (rootVolumeUuid == null) { + trigger.fail(operr("vm instance[uuid:%s] has no root volume", vmUuid)); + return; + } + + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + String groupUuid = StringUtils.isEmpty(msg.getResourceUuid()) ? Platform.getUuid() : msg.getResourceUuid(); + ImageGroupVO vo = new ImageGroupVO(); + vo.setUuid(groupUuid); + vo.setName(msg.getName()); + vo.setStatus(ImageStatus.Creating); + vo.setDescription(msg.getDescription()); + vo.setImageCount(1); + if (!CollectionUtils.isEmpty(dataVolumeUuids)) { + vo.setImageCount(1 + dataVolumeUuids.size()); + } + vo = persist(vo); + return vo; + } + }.execute(); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(imageGroupVO.getUuid(), ImageGroupVO.class); + trigger.rollback(); + } + }); + + flow(new Flow() { + String __name__ = "create-root-template-from-volume"; + + @Override + public void run(FlowTrigger trigger, Map data) { + VmInstanceVO vmVO = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmUuid).find(); + CreateRootVolumeTemplateFromRootVolumeMsg crtMsg = new CreateRootVolumeTemplateFromRootVolumeMsg(); + crtMsg.setRootVolumeUuid(rootVolumeUuid); + crtMsg.setName(String.format("create-from-root-volume-%s", rootVolumeUuid)); + crtMsg.setArchitecture(vmVO.getArchitecture()); + crtMsg.setPlatform(vmVO.getPlatform()); + crtMsg.setGuestOsType(vmVO.getGuestOsType()); + crtMsg.setDescription(msg.getDescription()); + crtMsg.setSession(msg.getSession()); + bus.makeLocalServiceId(crtMsg, ImageConstant.SERVICE_ID); + bus.send(crtMsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + ImageInventory imageInv = ((CreateRootVolumeTemplateFromRootVolumeReply) reply).getInventory(); + newVolumeUuids.add(imageInv.getUuid()); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newVolumeUuids)) { + trigger.rollback(); + return; + } + for (String uuid : newVolumeUuids) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newVolumeUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new Flow() { + String __name__ = "create-data-templates-from-volumes"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (CollectionUtils.isEmpty(dataVolumeUuids)) { + trigger.next(); + return; + } + + List errors = new ArrayList<>(); + new While<>(dataVolumeUuids).each((volUuid, compl) -> { + CreateDataVolumeTemplateFromVolumeMsg cdtMsg = new CreateDataVolumeTemplateFromVolumeMsg(); + cdtMsg.setVolumeUuid(volUuid); + cdtMsg.setName(String.format("create-from-data-volume-%s", volUuid)); + cdtMsg.setDescription(msg.getDescription()); + cdtMsg.setSession(msg.getSession()); + bus.makeLocalServiceId(cdtMsg, ImageConstant.SERVICE_ID); + bus.send(cdtMsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + errors.add(reply.getError()); + compl.allDone(); + } + + ImageInventory imageInv = ((CreateDataVolumeTemplateFromVolumeReply) reply).getInventory(); + newVolumeUuids.add(imageInv.getUuid()); + compl.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errors.isEmpty()) { + trigger.fail(errors.get(0)); + return; + } + trigger.next(); + } + }); + + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (CollectionUtils.isEmpty(newVolumeUuids)) { + trigger.rollback(); + return; + } + for (String uuid : newVolumeUuids) { + ImageDeletionMsg delMsg = new ImageDeletionMsg(); + delMsg.setImageUuid(uuid); + delMsg.setDeletionPolicy(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()); + delMsg.setForceDelete(true); + bus.makeTargetServiceIdByResourceUuid(delMsg, ImageConstant.SERVICE_ID, uuid); + bus.send(delMsg); + newVolumeUuids.remove(uuid); + } + trigger.rollback(); + } + }); + + flow(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + String __name__ = "create-image-group-ref-in-database"; + + imageGroupVO = new SQLBatchWithReturn() { + @Override + protected ImageGroupVO scripts() { + ImageGroupVO vo = findByUuid(imageGroupVO.getUuid(), ImageGroupVO.class); + vo.setStatus(ImageStatus.Ready); + vo = merge(vo); + + new HashSet(newVolumeUuids).forEach( + resourceUuid -> { + ImageVO image = q(ImageVO.class) + .eq(ImageVO_.uuid, resourceUuid) + .find(); + + ImageGroupRefVO refVO = new ImageGroupRefVO(); + refVO.setImageGroupUuid(imageGroupVO.getUuid()); + refVO.setImageUuid(resourceUuid); + persist(refVO); + } + ); + return vo; + } + }.execute(); + trigger.next(); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + ImageGroupInventory inv = ImageGroupInventory.valueOf(imageGroupVO); + completion.success(inv); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + private void handle(final APICreateDataVolumeTemplateFromVolumeMsg msg) { APICreateDataVolumeTemplateFromVolumeEvent evt = new APICreateDataVolumeTemplateFromVolumeEvent(msg.getId()); createDataVolumeTemplateFromVolume(msg, msg.getVolumeUuid(), new ReturnValueCompletion(evt) { @@ -806,6 +1391,87 @@ private void handle(final APIAddImageMsg msg) { handleAddImageMsg(data, evt); } + private void handle(final APICloneImageMsg msg) { + APICloneImageEvent evt = new APICloneImageEvent(msg.getId()); + Set copiedRefs; + ImageVO sourceImage = dbf.findByUuid(msg.getImageUuid(), ImageVO.class); + if (sourceImage == null) { + throw new OperationFailureException(operr("source image [%s] not existed", msg.getImageUuid())); + } + if (sourceImage.getStatus() != ImageStatus.Ready) { + throw new OperationFailureException(operr("cannot clone image, because image [%s] status is not ready", msg.getImageUuid())); + } + + ImageVO vo = new ImageVO(); + if (msg.getResourceUuid() != null) { + dbf.eoCleanup(ImageVO.class, msg.getResourceUuid()); + vo.setUuid(msg.getResourceUuid()); + } else { + vo.setUuid(Platform.getUuid()); + } + vo.setName(String.format("Clone-from-%s", sourceImage.getName())); + vo.setDescription(sourceImage.getDescription()); + vo.setStatus(ImageStatus.Ready); + vo.setState(sourceImage.getState()); + vo.setSize(sourceImage.getSize()); + vo.setActualSize(sourceImage.getActualSize()); + vo.setMd5Sum(sourceImage.getMd5Sum()); + vo.setPlatform(sourceImage.getPlatform()); + vo.setType(sourceImage.getType()); + vo.setFormat(sourceImage.getFormat()); + vo.setUrl(sourceImage.getUrl()); + vo.setSystem(sourceImage.isSystem()); + vo.setMediaType(sourceImage.getMediaType()); + vo.setCreateDate(sourceImage.getCreateDate()); + vo.setLastOpDate(sourceImage.getLastOpDate()); + vo.setGuestOsType(sourceImage.getGuestOsType()); + vo.setArchitecture(sourceImage.getArchitecture()); + vo.setVirtio(sourceImage.getVirtio()); + vo.setAccountUuid(sourceImage.getAccountUuid()); + copiedRefs = sourceImage.getBackupStorageRefs(); + + ImageFactory factory = getImageFacotry(ImageType.valueOf(sourceImage.getType())); + final ImageVO ivo = new SQLBatchWithReturn() { + @Override + protected ImageVO scripts() { + Set rvos = new HashSet<>(); + vo.setAccountUuid(sourceImage.getAccountUuid()); + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), ImageVO.class.getSimpleName()); + ImageVO ivo = factory.createImage(vo); + for (ImageBackupStorageRefVO ref : copiedRefs) { + ImageBackupStorageRefVO rvo = copyImageBackupStorageRefVO(ref); + rvo.setImageUuid(vo.getUuid()); + + persist(rvo); + rvos.add(rvo); + } + + ivo.setBackupStorageRefs(rvos); + ivo = merge(ivo); + return ivo; + } + }.execute(); + + evt.setInventory(ImageInventory.valueOf(ivo)); + bus.publish(evt); + } + + private static ImageBackupStorageRefVO copyImageBackupStorageRefVO(ImageBackupStorageRefVO original) { + if (original == null) { + return null; + } + + ImageBackupStorageRefVO copy = new ImageBackupStorageRefVO(); + copy.setBackupStorageUuid(original.getBackupStorageUuid()); + copy.setStatus(original.getStatus()); + copy.setInstallPath(original.getInstallPath()); + Timestamp now = Timestamp.valueOf(LocalDateTime.now()); + copy.setCreateDate(now); + copy.setLastOpDate(now); + + return copy; + } + @Override public String getId() { return bus.makeLocalServiceId(ImageConstant.SERVICE_ID); @@ -1067,7 +1733,7 @@ public List reportQuota() { quota.addQuotaMessageChecker(new QuotaMessageHandler<>(APIAddImageMsg.class) .addCounterQuota(ImageQuotaConstant.IMAGE_NUM) - .addMessageRequiredQuotaHandler(ImageQuotaConstant.IMAGE_SIZE, (msg) -> new ImageQuotaUtil().getLocalImageSizeOnBackupStorage(msg))); + .addMessageRequiredQuotaHandler(ImageQuotaConstant.IMAGE_SIZE, (msg) -> new ImageQuotaUtil().getImageActualSizeOnBs(msg.getUrl().trim(), msg.getBackupStorageUuids()))); quota.addQuotaMessageChecker(new QuotaMessageHandler<>(APIRecoverImageMsg.class) .addMessageRequiredQuotaHandler(ImageQuotaConstant.IMAGE_SIZE, (msg) -> { ImageVO image = dbf.getEntityManager().find(ImageVO.class, msg.getImageUuid()); @@ -1181,6 +1847,9 @@ void reply(Message reply) { vo.setPlatform(ImagePlatform.valueOf(msgData.getPlatform())); } + long asize = new ImageQuotaUtil().getImageActualSizeOnBs(msgData.getUrl().trim(), msgData.getBackupStorageUuids()); + vo.setActualSize(asize); + ImageFactory factory = getImageFacotry(ImageType.valueOf(imageType)); final ImageVO ivo = new SQLBatchWithReturn() { @Override diff --git a/image/src/main/java/org/zstack/image/ImageQuotaUtil.java b/image/src/main/java/org/zstack/image/ImageQuotaUtil.java index c1d8dc42ced..df45e2f1a39 100644 --- a/image/src/main/java/org/zstack/image/ImageQuotaUtil.java +++ b/image/src/main/java/org/zstack/image/ImageQuotaUtil.java @@ -9,20 +9,17 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.errorcode.ErrorFacade; -import org.zstack.header.apimediator.ApiMessageInterceptionException; -import org.zstack.header.core.BypassWhenUnitTest; import org.zstack.header.errorcode.OperationFailureException; -import org.zstack.header.identity.Quota; -import org.zstack.header.image.APIAddImageMsg; import org.zstack.header.image.ImageVO; import org.zstack.header.rest.RESTFacade; -import org.zstack.header.storage.backup.*; -import org.zstack.identity.QuotaUtil; +import org.zstack.header.storage.backup.BackupStorageConstant; +import org.zstack.header.storage.backup.GetLocalFileSizeOnBackupStorageMsg; +import org.zstack.header.storage.backup.GetLocalFileSizeOnBackupStorageReply; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import javax.persistence.TypedQuery; -import java.util.Map; +import java.util.List; /** * Created by miao on 16-10-9. @@ -85,25 +82,21 @@ public long getUsedImageSize(String accountUuid) { return imageSize; } - - public long getLocalImageSizeOnBackupStorage(APIAddImageMsg msg) { + public long getImageActualSizeOnBs(String url, List bsUuids) { long imageSizeAsked = 0; if (CoreGlobalProperty.UNIT_TEST_ON) { - return imageSizeAsked; + return 1; } - final String url = msg.getUrl().trim(); if (url.startsWith("file:///")) { GetLocalFileSizeOnBackupStorageMsg gmsg = new GetLocalFileSizeOnBackupStorageMsg(); - String bsUuid = msg.getBackupStorageUuids().get(0); - gmsg.setBackupStorageUuid(bsUuid); + gmsg.setBackupStorageUuid(bsUuids.get(0)); gmsg.setUrl(url.split("://")[1]); - bus.makeTargetServiceIdByResourceUuid(gmsg, BackupStorageConstant.SERVICE_ID, bsUuid); + bus.makeTargetServiceIdByResourceUuid(gmsg, BackupStorageConstant.SERVICE_ID, bsUuids.get(0)); GetLocalFileSizeOnBackupStorageReply reply = (GetLocalFileSizeOnBackupStorageReply) bus.call(gmsg); if (!reply.isSuccess()) { - logger.warn(String.format("cannot get image. The image url : %s. description: %s.name: %s", - url, msg.getDescription(), msg.getName())); + logger.warn(String.format("cannot get image. The image url: %s", url)); throw new OperationFailureException(reply.getError()); } else { imageSizeAsked = reply.getSize(); @@ -114,8 +107,7 @@ public long getLocalImageSizeOnBackupStorage(APIAddImageMsg msg) { try { len = header.getFirst("Content-Length"); } catch (Exception e) { - logger.warn(String.format("cannot get image. The image url : %s. description: %s.name: %s", - url, msg.getDescription(), msg.getName())); + logger.warn(String.format("cannot get image. The image url: %s", url)); } imageSizeAsked = len == null ? 0 : Long.parseLong(len); } diff --git a/longjob/pom.xml b/longjob/pom.xml index e1c3a70ea3d..867476237b4 100755 --- a/longjob/pom.xml +++ b/longjob/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. longjob diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java index 1752bdf16e1..a755a0b9270 100755 --- a/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobManagerImpl.java @@ -476,9 +476,14 @@ private void handle(APISubmitLongJobMsg msg) { bus.send(smsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply rly) { - SubmitLongJobReply reply = rly.castReply(); - evt.setInventory(reply.getInventory()); - evt.setNeedAudit(reply.isNeedAudit()); + if (rly.isSuccess()) { + SubmitLongJobReply reply = rly.castReply(); + evt.setInventory(reply.getInventory()); + evt.setNeedAudit(reply.isNeedAudit()); + } else { + evt.setError(rly.getError()); + } + bus.publish(evt); } }); diff --git a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java index 675f208e41a..c99cd6589e0 100644 --- a/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java +++ b/longjob/src/main/java/org/zstack/longjob/LongJobUtils.java @@ -112,7 +112,8 @@ public static boolean jobCompleted(LongJobVO vo) { } static LongJobVO updateByUuid(String uuid, Consumer consumer) { - return new SQLBatchWithReturn(){ + final boolean[] jobCompleted = {false}; + LongJobVO job = new SQLBatchWithReturn(){ @Override protected LongJobVO scripts() { @@ -123,7 +124,7 @@ protected LongJobVO scripts() { if (jobCompleted(job)) { setExecuteTimeIfNeed(job); - cleanProgress(job); + jobCompleted[0] = true; } if (originState != newState) { @@ -134,6 +135,10 @@ protected LongJobVO scripts() { return job; } }.execute(); + if (jobCompleted[0]) { + cleanProgress(job); + } + return job; } static LongJobVO changeState(String uuid, LongJobStateEvent stateEvent) { diff --git a/network/pom.xml b/network/pom.xml index 167dc077619..009efab142c 100755 --- a/network/pom.xml +++ b/network/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. network diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java index dcdde3cef17..b67aea2b6ef 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkApiInterceptor.java @@ -1,5 +1,7 @@ package org.zstack.network.l2; +import org.apache.commons.lang.StringUtils; +import org.apache.poi.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; @@ -75,16 +77,18 @@ private void validate(final APIAttachL2NetworkToClusterMsg msg) { /* current ovs only support vlan, vxlan*/ L2NetworkVO l2 = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); - /* find l2 network with same physical interface, but different vswitch Type */ - List otherL2s = Q.New(L2NetworkVO.class).select(L2NetworkVO_.uuid) - .eq(L2NetworkVO_.physicalInterface, l2.getPhysicalInterface()) - .notEq(L2NetworkVO_.vSwitchType, l2.getvSwitchType()).listValues(); - if (!otherL2s.isEmpty()) { - if (Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) - .in(L2NetworkClusterRefVO_.l2NetworkUuid, otherL2s).isExists()) { - throw new ApiMessageInterceptionException(argerr("could not attach l2 network, because there "+ - "is another network [uuid:%s] on physical interface [%s] with different vswitch type", - otherL2s.get(0), l2.getPhysicalInterface())); + if (!StringUtils.isEmpty(l2.getPhysicalInterface())) { + /* find l2 network with same physical interface, but different vswitch Type */ + List otherL2s = Q.New(L2NetworkVO.class).select(L2NetworkVO_.uuid) + .eq(L2NetworkVO_.physicalInterface, l2.getPhysicalInterface()) + .notEq(L2NetworkVO_.vSwitchType, l2.getvSwitchType()).listValues(); + if (!otherL2s.isEmpty()) { + if (Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) + .in(L2NetworkClusterRefVO_.l2NetworkUuid, otherL2s).isExists()) { + throw new ApiMessageInterceptionException(argerr("could not attach l2 network, because there " + + "is another network [uuid:%s] on physical interface [%s] with different vswitch type", + otherL2s.get(0), l2.getPhysicalInterface())); + } } } } @@ -111,7 +115,9 @@ private void validate(APICreateL2NetworkMsg msg) { throw new ApiMessageInterceptionException(argerr("unsupported l2Network type[%s]", msg.getType())); } - if (!VSwitchType.hasType(msg.getvSwitchType())) { + try { + VSwitchType.valueOf(msg.getvSwitchType()); + } catch (Exception e) { throw new ApiMessageInterceptionException(argerr("unsupported vSwitch type[%s]", msg.getvSwitchType())); } } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java b/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java index bc9c073ada4..309fb83477e 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkCascadeExtension.java @@ -9,6 +9,7 @@ import org.zstack.core.cloudbus.CloudBusListCallBack; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.SQL; import org.zstack.core.db.SimpleQuery; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.core.Completion; @@ -16,6 +17,8 @@ import org.zstack.header.identity.AccountVO; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.*; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.zone.ZoneInventory; import org.zstack.header.zone.ZoneVO; import org.zstack.utils.CollectionUtils; @@ -178,7 +181,9 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { @Override public List getEdgeNames() { - return Arrays.asList(ZoneVO.class.getSimpleName(), AccountVO.class.getSimpleName()); + return Arrays.asList(ZoneVO.class.getSimpleName(), + AccountVO.class.getSimpleName(), + SdnControllerVO.class.getSimpleName()); } @Override @@ -228,6 +233,32 @@ public List call() { if (!vos.isEmpty()) { ret = L2NetworkInventory.valueOf(vos); } + } else if (SdnControllerVO.class.getSimpleName().equals(action.getParentIssuer())) { + List controllerUuids = CollectionUtils.transformToList((List) action.getParentIssuerContext(), new Function() { + @Override + public String call(SdnControllerInventory arg) { + return arg.getUuid(); + } + }); + if (controllerUuids.isEmpty()) { + return null; + } + + ret = new ArrayList<>(); + for (String controllerUuid : controllerUuids) { + String tag = String.format("%s::%s", L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, controllerUuid); + List l2Vos = SQL.New("select l2 from L2NetworkVO l2, SystemTagVO tag " + + "where tag.resourceUuid=l2.uuid " + + "and tag.resourceType='L2NetworkVO' " + + "and tag.tag=:tag", L2NetworkVO.class) + .param("tag", tag).list(); + if (!l2Vos.isEmpty()) { + ret.addAll(L2NetworkInventory.valueOf(l2Vos)); + } + } + if (ret.isEmpty()) { + ret = null; + } } return ret; diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java b/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java index 0c712ec3d87..953219f6a30 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkGlobalConfig.java @@ -15,4 +15,10 @@ public class L2NetworkGlobalConfig { @GlobalConfigValidation public static GlobalConfig L2IsolatedWithPhysicalSwitch = new GlobalConfig(CATEGORY, "l2.isolated"); + + @GlobalConfigValidation + public static GlobalConfig IGMPVersion = new GlobalConfig(CATEGORY, "igmp.version"); + + @GlobalConfigValidation + public static GlobalConfig MLDVersion = new GlobalConfig(CATEGORY, "mld.version"); } diff --git a/network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java b/network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java new file mode 100644 index 00000000000..77d38d03e69 --- /dev/null +++ b/network/src/main/java/org/zstack/network/l2/L2NetworkSystemTags.java @@ -0,0 +1,11 @@ +package org.zstack.network.l2; + +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.tag.TagDefinition; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class L2NetworkSystemTags { + public static String L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN = "SdnControllerUuid"; + public static PatternedSystemTag L2_NETWORK_SDN_CONTROLLER_UUID = new PatternedSystemTag(String.format("SdnControllerUuid::{%s}", L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN), L2NetworkVO.class); +} diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java index b35f08bbd3c..3d5720ccd26 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanL2NetworkFactory.java @@ -1,10 +1,18 @@ package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.Component; +import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.network.l2.*; import org.zstack.network.service.NetworkServiceGlobalConfig; import org.zstack.resourceconfig.ResourceConfigFacade; @@ -12,6 +20,8 @@ import org.zstack.utils.data.FieldPrinter; import org.zstack.utils.logging.CLogger; +import java.util.Map; + public class L2NoVlanL2NetworkFactory implements L2NetworkFactory, Component, L2NetworkDefaultMtu, L2NetworkGetVniExtensionPoint { private static L2NetworkType type = new L2NetworkType(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE); private static CLogger logger = Utils.getLogger(L2NoVlanL2NetworkFactory.class); @@ -23,6 +33,8 @@ public class L2NoVlanL2NetworkFactory implements L2NetworkFactory, Component, L2 private DatabaseFacade dbf; @Autowired private ResourceConfigFacade rcf; + @Autowired + protected PluginRegistry pluginRgty; @Override public L2NetworkType getType() { @@ -31,10 +43,64 @@ public L2NetworkType getType() { @Override public void createL2Network(L2NetworkVO vo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { - vo = dbf.persistAndRefresh(vo); - L2NetworkInventory inv = L2NetworkInventory.valueOf(vo); - logger.debug("Successfully created NoVlanL2Network: " + printer.print(inv)); - completion.success(inv); + + FlowChain chain = new SimpleFlowChain(); + chain.setName("create-no-vlan-network"); + chain.then(new Flow() { + String __name__ = "write-db"; + @Override + public void run(FlowTrigger trigger, Map data) { + dbf.persist(vo); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(vo.getUuid(), L2NetworkVO.class); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "create-l2-network-extension"; + + @Override + public void run(FlowTrigger trigger, Map data) { + new While<>(pluginRgty.getExtensionList(L2NetworkCreateExtensionPoint.class)) + .each((exp, wcompl) -> exp.postCreateL2Network(L2NetworkInventory.valueOf(vo), msg, new Completion(trigger) { + @Override + public void success() { + wcompl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcompl.addError(errorCode); + wcompl.allDone(); + } + })).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + L2NetworkInventory inv = L2NetworkInventory.valueOf( + dbf.findByUuid(vo.getUuid(), L2NetworkVO.class)); + logger.debug("Successfully created NoVlanL2Network: " + printer.print(inv)); + completion.success(inv); + } + }).start(); } @Override diff --git a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java index 4e8ff5b35f8..c3449db0145 100755 --- a/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java +++ b/network/src/main/java/org/zstack/network/l2/L2NoVlanNetwork.java @@ -18,8 +18,10 @@ import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.workflow.*; @@ -43,6 +45,7 @@ import javax.transaction.Transactional; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -83,6 +86,10 @@ protected L2NetworkInventory getSelfInventory() { return L2NetworkInventory.valueOf(self); } + public VSwitchType getVSwitchType() { + return VSwitchType.valueOf(self.getvSwitchType()); + } + @Override public void handleMessage(Message msg) { try { @@ -142,15 +149,6 @@ public void fail(ErrorCode errorCode) { }); } - protected boolean checkPhysicalInterfaceForAttach() { - return true; - } - - protected boolean realizeDataPlaneForAttach() { - return true; - } - - private void handle(DeleteL2NetworkMsg msg) { DeleteL2NetworkReply reply = new DeleteL2NetworkReply(); final String issuer = L2NetworkVO.class.getSimpleName(); @@ -242,7 +240,8 @@ private void syncManagementServiceType(ServiceTypeExtensionPoint ext, L2NetworkV } private void handle(DetachL2NetworkFromClusterMsg msg) { - if (!L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class)) { + if (!L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class) || + !getVSwitchType().isAttachToCluster()) { SQL.New(L2NetworkClusterRefVO.class) .eq(L2NetworkClusterRefVO_.clusterUuid, msg.getClusterUuid()) .eq(L2NetworkClusterRefVO_.l2NetworkUuid, msg.getL2NetworkUuid()) @@ -313,7 +312,6 @@ private void handle(final CheckL2NetworkOnHostMsg msg) { String htype = q.findValue(); final HypervisorType hvType = HypervisorType.valueOf(htype); final L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - final VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); L2NetworkHostRefInventory hostRef = l2NetworkHostHelper.getL2NetworkHostRef(msg.getL2NetworkUuid(), msg.getHostUuid()); String providerType = null; @@ -323,7 +321,7 @@ private void handle(final CheckL2NetworkOnHostMsg msg) { final CheckL2NetworkOnHostReply reply = new CheckL2NetworkOnHostReply(); // TODO: this should be fixed - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.check(getSelfInventory(), msg.getHostUuid(), new Completion(msg) { @Override public void success() { @@ -342,19 +340,63 @@ private void handle(L2NetworkDeletionMsg msg) { L2NetworkInventory inv = L2NetworkInventory.valueOf(self); extpEmitter.beforeDelete(inv); L2NetworkDeletionReply reply = new L2NetworkDeletionReply(); - deleteHook(new Completion(msg) { + + FlowChain chain = new SimpleFlowChain(); + chain.setName("delete-l2-network-" + inv.getUuid()); + chain.then(new NoRollbackFlow() { + String __name__ = "delete-l2-network-extension"; + @Override - public void success() { - extpEmitter.afterDelete(inv); - bus.reply(msg, reply); + public void run(FlowTrigger trigger, Map data) { + new While<>(pluginRgty.getExtensionList(L2NetworkDeleteExtensionPoint.class)) + .each((exp, wcompl) -> exp.deleteL2Network(inv, new NoErrorCompletion(trigger) { + @Override + public void done() { + wcompl.done(); + } + })).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); } + }).then(new NoRollbackFlow() { + String __name__ = "delete-l2-network"; @Override - public void fail(ErrorCode errorCode) { - reply.setError(errorCode); + public void run(FlowTrigger trigger, Map data) { + deleteHook(new Completion(msg) { + @Override + public void success() { + extpEmitter.afterDelete(inv); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + trigger.fail(errorCode); + } + }); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); bus.reply(msg, reply); } - }); + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + } + }).start(); } private void handleApiMessage(APIMessage msg) { @@ -472,15 +514,13 @@ public void fail(ErrorCode errorCode) { protected void updateVlanNetwork(L2NetworkInventory oldl2, L2NetworkInventory newl2, String hostUuid, String htype, Completion completion) { final HypervisorType hvType = HypervisorType.valueOf(htype); final L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - final VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.update(oldl2, newl2, hostUuid, completion); } protected void realizeNetwork(String hostUuid, String htype, String providerType, Completion completion) { final HypervisorType hvType = HypervisorType.valueOf(htype); final L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - final VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.realize(getSelfInventory(), hostUuid, completion); } @@ -537,7 +577,7 @@ private void changeL2NetworkVlanId(final APIChangeL2NetworkVlanIdMsg msg, final chain.then(new ShareFlow() { @Override public void setup() { - final List updatedHosts = new ArrayList<>(); + final Map updatedHosts = new ConcurrentHashMap<>(); L2NetworkInventory oldInv = self.toInventory(); L2NetworkInventory newInv = self.toInventory(); if (msg.getType() != null) { @@ -556,18 +596,20 @@ public void run(final FlowTrigger trigger, Map data) { updateVlanNetwork(oldInv, newInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { - updatedHosts.add(host); + logger.debug(String.format("successfully updated l2 network vlan on host[uuid:%s]", host.getUuid())); + updatedHosts.put(host, true); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { logger.error(String.format("update l2 network in host:[%s] failed", host.getUuid())); + updatedHosts.put(host, false); whileCompletion.addError(errorCode); - whileCompletion.allDone(); + whileCompletion.done(); } }); - }, 10).run(new WhileDoneCompletion(trigger) { + }, 5).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { @@ -581,22 +623,35 @@ public void done(ErrorCodeList errorCodeList) { @Override public void rollback(FlowRollback trigger, Map data) { - new While<>(updatedHosts).step((host, whileCompletion) -> { + List successfulHosts = updatedHosts.entrySet().stream() + .filter(Map.Entry::getValue) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + if(successfulHosts.isEmpty()) { + trigger.rollback(); + return; + } + logger.debug(String.format("rollback l2 network vlan changes on %d hosts", successfulHosts.size())); + new While<>(successfulHosts).step((host, whileCompletion) -> { + logger.debug(String.format("rolling back l2 network vlan on host[uuid:%s]", host.getUuid())); updateVlanNetwork(newInv, oldInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { + logger.debug(String.format("successfully rolled back l2 network vlan on host[uuid:%s]", host.getUuid())); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { - logger.error(String.format("rollback l2 network in host:[%s] failed", host.getUuid())); + logger.error(String.format("failed to rollback l2 network vlan on host[uuid:%s], because %s", + host.getUuid(), errorCode.toString())); whileCompletion.done(); } }); - }, updatedHosts.size()).run(new WhileDoneCompletion(trigger) { + }, 5).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { + logger.debug("finished rolling back l2 network vlan changes"); trigger.rollback(); } }); @@ -620,13 +675,13 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - private void prepareL2NetworkOnHosts(final List hosts, String providerType, final Completion completion) { + protected void prepareL2NetworkOnHosts(final List hosts, String providerType, final Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("prepare-l2-%s-on-hosts", self.getUuid())); chain.then(new NoRollbackFlow() { @Override public boolean skip(Map data) { - return !checkPhysicalInterfaceForAttach(); + return !getVSwitchType().isAttachToCluster(); } @Override @@ -663,7 +718,7 @@ public void run(List replies) { @Override public boolean skip(Map data) { - return !realizeDataPlaneForAttach(); + return !getVSwitchType().isAttachToCluster(); } @Override @@ -682,7 +737,7 @@ public void fail(ErrorCode errorCode) { whileCompletion.allDone(); } }); - },10).run(new WhileDoneCompletion(trigger) { + },L2NetworkConstant.MAX_PARALLEL_HOST_MSG).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { @@ -962,7 +1017,8 @@ public void fail(ErrorCode errorCode) { @Override public void deleteHook(Completion completion) { - if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class)) { + if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class) + && getVSwitchType().isAttachToCluster()) { deleteL2Bridge(completion); } else { completion.success(); @@ -973,7 +1029,7 @@ protected void deleteL2Bridge(Completion completion) { deleteL2Bridge(null, completion); } - private void deleteL2Bridge(List clusterUuids, Completion completion) { + protected void deleteL2Bridge(List clusterUuids, Completion completion) { if (clusterUuids == null) { L2NetworkInventory l2NetworkInventory = getSelfInventory(); clusterUuids = l2NetworkInventory.getAttachedClusterUuids(); @@ -994,13 +1050,9 @@ private void deleteL2Bridge(List clusterUuids, Completion completion) { } List hostss = new ArrayList<>(); - Map hostL2ProviderMap = new HashMap<>(); for (Map.Entry> e : providerClusterMap.entrySet()) { List hosts = Q.New(HostVO.class) .in(HostVO_.clusterUuid, e.getValue()).list(); - for (HostVO h: hosts) { - hostL2ProviderMap.put(h.getUuid(), e.getKey()); - } hostss.addAll(hosts); } @@ -1008,8 +1060,7 @@ private void deleteL2Bridge(List clusterUuids, Completion completion) { new While<>(hostss).step((host,compl) -> { HypervisorType hvType = HypervisorType.valueOf(host.getHypervisorType()); L2NetworkType l2Type = L2NetworkType.valueOf(self.getType()); - VSwitchType vSwitchType = VSwitchType.valueOf(self.getvSwitchType()); - L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, vSwitchType, hvType); + L2NetworkRealizationExtensionPoint ext = l2Mgr.getRealizationExtension(l2Type, getVSwitchType(), hvType); ext.delete(getSelfInventory(), host.getUuid(), new Completion(compl){ @Override public void success() { @@ -1023,7 +1074,7 @@ public void fail(ErrorCode errorCode) { } }); - },10).run((new WhileDoneCompletion(completion) { + },L2NetworkConstant.MAX_PARALLEL_HOST_MSG).run((new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { if (errs.size() > 0) { diff --git a/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java b/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java index 6b52dcff070..35c34f1799a 100755 --- a/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java +++ b/network/src/main/java/org/zstack/network/l2/L2VlanNetworkFactory.java @@ -1,13 +1,20 @@ package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.MessageSafe; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.AbstractService; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.network.l2.*; @@ -20,6 +27,7 @@ import org.zstack.utils.logging.CLogger; import java.util.List; +import java.util.Map; public class L2VlanNetworkFactory extends AbstractService implements L2NetworkFactory, L2NetworkDefaultMtu, L2NetworkGetVniExtensionPoint { private static CLogger logger = Utils.getLogger(L2VlanNetworkFactory.class); @@ -33,6 +41,8 @@ public class L2VlanNetworkFactory extends AbstractService implements L2NetworkFa private QueryFacade qf; @Autowired private ResourceConfigFacade rcf; + @Autowired + protected PluginRegistry pluginRgty; @Override public L2NetworkType getType() { @@ -41,15 +51,71 @@ public L2NetworkType getType() { @Override public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { - APICreateL2VlanNetworkMsg amsg = (APICreateL2VlanNetworkMsg) msg; - L2VlanNetworkVO vo = new L2VlanNetworkVO(ovo); - vo.setVlan(amsg.getVlan()); - vo.setVirtualNetworkId(vo.getVlan()); - vo = dbf.persistAndRefresh(vo); - L2VlanNetworkInventory inv = L2VlanNetworkInventory.valueOf(vo); - String info = String.format("successfully create L2VlanNetwork, %s", JSONObjectUtil.toJsonString(inv)); - logger.debug(info); - completion.success(inv); + FlowChain chain = new SimpleFlowChain(); + chain.setName("create-no-vlan-network"); + chain.then(new Flow() { + String __name__ = "write-db"; + @Override + public void run(FlowTrigger trigger, Map data) { + APICreateL2VlanNetworkMsg amsg = (APICreateL2VlanNetworkMsg) msg; + L2VlanNetworkVO vo = new L2VlanNetworkVO(ovo); + vo.setVlan(amsg.getVlan()); + vo.setVirtualNetworkId(vo.getVlan()); + dbf.persist(vo); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.removeByPrimaryKey(ovo.getUuid(), L2VlanNetworkVO.class); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "create-l2-network-extension"; + + @Override + public void run(FlowTrigger trigger, Map data) { + L2VlanNetworkInventory inv = L2VlanNetworkInventory.valueOf( + dbf.findByUuid(ovo.getUuid(), L2VlanNetworkVO.class)); + new While<>(pluginRgty.getExtensionList(L2NetworkCreateExtensionPoint.class)) + .each((exp, wcompl) -> exp.postCreateL2Network(inv, msg, new Completion(trigger) { + @Override + public void success() { + wcompl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcompl.addError(errorCode); + wcompl.allDone(); + } + })).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + L2VlanNetworkInventory inv = L2VlanNetworkInventory.valueOf( + dbf.findByUuid(ovo.getUuid(), L2VlanNetworkVO.class)); + logger.debug(String.format("Successfully created VlanL2Network[uuid:%s, name:%s]", + inv.getUuid(), inv.getName())); + completion.success(inv); + } + }).start(); + } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java b/network/src/main/java/org/zstack/network/l2/SdnControllerCascadeExtension.java similarity index 70% rename from plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java rename to network/src/main/java/org/zstack/network/l2/SdnControllerCascadeExtension.java index 265cae7f79e..2fd70fb4c7c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l2/SdnControllerCascadeExtension.java @@ -1,4 +1,4 @@ -package org.zstack.sdnController; +package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -9,16 +9,16 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.core.Completion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.host.HostInventory; +import org.zstack.header.host.HostVO; import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.message.MessageReply; -import org.zstack.sdnController.header.SdnControllerConstant; -import org.zstack.sdnController.header.SdnControllerDeletionMsg; -import org.zstack.sdnController.header.SdnControllerInventory; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; @@ -26,7 +26,6 @@ import javax.persistence.TypedQuery; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util.stream.Collectors; @@ -59,6 +58,51 @@ private void handleDeletionCleanup(CascadeAction action, Completion completion) } private void handleDeletion(final CascadeAction action, final Completion completion) { + if (HostVO.class.getSimpleName().equals(action.getParentIssuer())) { + List hosts = action.getParentIssuerContext(); + List hostUuids = hosts.stream().map(HostInventory::getUuid).collect(Collectors.toList()); + List refVOS = Q.New(SdnControllerHostRefVO.class) + .in(SdnControllerHostRefVO_.hostUuid, hostUuids).list(); + if (refVOS.isEmpty()) { + completion.success(); + return; + } + + List msgs = new ArrayList<>(); + for (SdnControllerHostRefVO ref : refVOS) { + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(ref.getSdnControllerUuid()); + msg.setHostUuid(ref.getHostUuid()); + msg.setvSwitchType(ref.getvSwitchType()); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, ref.getSdnControllerUuid()); + msgs.add(msg); + } + + new While<>(msgs).each((msg, wcomp) -> { + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.debug(String.format("delete host [uuid:%s] from sdn controller[uuid:%s] failed, error:%s", + msg.getHostUuid(), msg.getSdnControllerUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + completion.success(); + } else { + completion.fail(errorCodeList.getCauses().get(0)); + } + } + }); + + return; + } + final List sdnControllers = sdnControllerFromAction(action); if (sdnControllers == null) { completion.success(); @@ -100,7 +144,10 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { @Override public List getEdgeNames() { - return Arrays.asList(AccountVO.class.getSimpleName()); + List ret = new ArrayList<>(); + ret.add(AccountVO.class.getSimpleName()); + ret.add(HostVO.class.getSimpleName()); + return ret; } @Override diff --git a/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java b/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java index 1ae22e7a71c..aae2711248b 100644 --- a/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java +++ b/network/src/main/java/org/zstack/network/l3/AddressPoolIpRangeFactory.java @@ -5,11 +5,15 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SQLBatchWithReturn; +import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.message.APICreateMessage; import org.zstack.header.network.l3.*; import org.zstack.utils.CollectionUtils; import org.zstack.utils.function.ForEachFunction; +import java.util.ArrayList; +import java.util.List; + public class AddressPoolIpRangeFactory implements IpRangeFactory { @Autowired DatabaseFacade dbf; @@ -22,40 +26,45 @@ public IpRangeType getType() { } @Override - public IpRangeInventory createIpRange(IpRangeInventory ipr, APICreateMessage msg) { - AddressPoolVO vo = new SQLBatchWithReturn() { - @Override - protected AddressPoolVO scripts() { - AddressPoolVO vo = new AddressPoolVO(); - vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); - vo.setDescription(ipr.getDescription()); - vo.setEndIp(ipr.getEndIp()); - vo.setGateway(ipr.getStartIp()); - vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); - vo.setName(ipr.getName()); - vo.setNetmask(ipr.getNetmask()); - vo.setStartIp(ipr.getStartIp()); - vo.setNetworkCidr(ipr.getNetworkCidr()); - vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setIpVersion(ipr.getIpVersion()); - vo.setAddressMode(ipr.getAddressMode()); - vo.setPrefixLen(ipr.getPrefixLen()); - dbf.getEntityManager().persist(vo); - dbf.getEntityManager().flush(); - dbf.getEntityManager().refresh(vo); - - return vo; - } - }.execute(); - - final IpRangeInventory finalIpr = AddressPoolInventory.valueOf1(vo); - CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { - @Override - public void run(AfterAddIpRangeExtensionPoint ext) { - ext.afterAddIpRange(finalIpr, msg.getSystemTags()); - } - }); - - return finalIpr; + public void createIpRange(List iprs, APICreateMessage msg, ReturnValueCompletion> completion) { + List vos = new ArrayList<>(); + for (IpRangeInventory ipr : iprs) { + AddressPoolVO vo = new SQLBatchWithReturn() { + @Override + protected AddressPoolVO scripts() { + AddressPoolVO vo = new AddressPoolVO(); + vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); + vo.setDescription(ipr.getDescription()); + vo.setEndIp(ipr.getEndIp()); + vo.setGateway(ipr.getStartIp()); + vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); + vo.setName(ipr.getName()); + vo.setNetmask(ipr.getNetmask()); + vo.setStartIp(ipr.getStartIp()); + vo.setNetworkCidr(ipr.getNetworkCidr()); + vo.setAccountUuid(msg.getSession().getAccountUuid()); + vo.setIpVersion(ipr.getIpVersion()); + vo.setAddressMode(ipr.getAddressMode()); + vo.setPrefixLen(ipr.getPrefixLen()); + dbf.getEntityManager().persist(vo); + dbf.getEntityManager().flush(); + dbf.getEntityManager().refresh(vo); + + return vo; + } + }.execute(); + + vos.add(vo); + + final IpRangeInventory finalIpr = AddressPoolInventory.valueOf1(vo); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { + @Override + public void run(AfterAddIpRangeExtensionPoint ext) { + ext.afterAddIpRange(finalIpr, msg.getSystemTags()); + } + }); + } + + completion.success(IpRangeInventory.valueOf(vos)); } } diff --git a/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java b/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java index a44521582f0..115dea698ee 100755 --- a/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java +++ b/network/src/main/java/org/zstack/network/l3/IpRangeCascadeExtension.java @@ -66,7 +66,7 @@ private void deleteIpRanges(final CascadeAction action,List ip msgs.add(msg); } - new While<>(msgs).all((msg, compl) -> { + new While<>(msgs).each((msg, compl) -> { bus.send(msg, new CloudBusCallBack(compl) { @Override public void run(MessageReply reply) { diff --git a/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java b/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java index 7d428c0f73e..fffbff32665 100644 --- a/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java +++ b/network/src/main/java/org/zstack/network/l3/IpRangeHelper.java @@ -1,4 +1,5 @@ package org.zstack.network.l3; +import org.zstack.core.Platform; import org.zstack.header.exception.CloudRuntimeException; import javax.persistence.Tuple; @@ -262,4 +263,22 @@ public static boolean isIpAddressAllocationEnableOnL3(String l3Uuid) { } return l3NetworkVO.enableIpAddressAllocation(); } + + public static IpRangeVO fromIpRangeInventory(IpRangeInventory ipr, String accountUuid) { + NormalIpRangeVO vo = new NormalIpRangeVO(); + vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); + vo.setDescription(ipr.getDescription()); + vo.setEndIp(ipr.getEndIp()); + vo.setGateway(ipr.getGateway()); + vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); + vo.setName(ipr.getName()); + vo.setNetmask(ipr.getNetmask()); + vo.setStartIp(ipr.getStartIp()); + vo.setNetworkCidr(ipr.getNetworkCidr()); + vo.setAccountUuid(accountUuid); + vo.setIpVersion(ipr.getIpVersion()); + vo.setAddressMode(ipr.getAddressMode()); + vo.setPrefixLen(ipr.getPrefixLen()); + return vo; + } } diff --git a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java index 6d3fbdf92aa..19b9e530a59 100755 --- a/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java +++ b/network/src/main/java/org/zstack/network/l3/L3BasicNetwork.java @@ -13,6 +13,8 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; +import org.zstack.core.defer.Defer; +import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.retry.Retry; import org.zstack.core.retry.RetryCondition; @@ -60,8 +62,10 @@ import javax.persistence.Tuple; import java.math.BigInteger; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static org.codehaus.groovy.runtime.InvokerHelper.asList; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; @@ -97,8 +101,11 @@ public class L3BasicNetwork implements L3Network { private L3NetworkVO self; + protected String syncThreadName; + public L3BasicNetwork(L3NetworkVO vo) { this.self = vo; + syncThreadName = "l3-" + vo.getUuid(); } protected L3NetworkVO getSelf() { @@ -154,17 +161,25 @@ private void setIpRangeSharedResource(String L3NetworkUuid, String IpRangeUuid) private void handle(APIAddIpRangeMsg msg) { IpRangeInventory ipr = IpRangeInventory.fromMessage(msg); + APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - - tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); - - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + factory.createIpRange(Collections.singletonList(ipr), msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + bus.publish(evt); + } - APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); - evt.setInventory(inv); - bus.publish(evt); + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void handleLocalMessage(Message msg) { @@ -190,78 +205,277 @@ private void handle(CheckIpAvailabilityMsg msg) { bus.reply(msg, reply); } + private boolean isLastNormalIpRangeOfVersion(String ipRangeUuid, int ipVersion) { + List normalIpRanges = IpRangeHelper.getNormalIpRanges(self); + normalIpRanges = normalIpRanges.stream() + .filter(r -> r.getIpVersion() == ipVersion) + .collect(Collectors.toList()); + return normalIpRanges.size() == 1 && + normalIpRanges.get(0).getUuid().equals(ipRangeUuid); + } + private void handle(IpRangeDeletionMsg msg) { IpRangeDeletionReply reply = new IpRangeDeletionReply(); + doDeleteIpRange(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } - List exts = pluginRgty.getExtensionList(IpRangeDeletionExtensionPoint.class); - IpRangeVO iprvo = dbf.findByUuid(msg.getIpRangeUuid(), IpRangeVO.class); - if (iprvo == null) { - bus.reply(msg, reply); - return; - } - - final IpRangeInventory inv = IpRangeInventory.valueOf(iprvo); - - for (IpRangeDeletionExtensionPoint ext : exts) { - ext.preDeleteIpRange(inv); - } - - CollectionUtils.safeForEach(exts, new ForEachFunction() { @Override - public void run(IpRangeDeletionExtensionPoint arg) { - arg.beforeDeleteIpRange(inv); + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); } }); + } + private void doDeleteIpRange(IpRangeDeletionMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public void run(SyncTaskChain chainTask) { + List exts = pluginRgty.getExtensionList(IpRangeDeletionExtensionPoint.class); + IpRangeVO iprvo = dbf.findByUuid(msg.getIpRangeUuid(), IpRangeVO.class); + if (iprvo == null) { + completion.success(); + chainTask.next(); + return; + } - dbf.remove(iprvo); - IpRangeHelper.updateL3NetworkIpversion(iprvo); + final IpRangeInventory inv = IpRangeInventory.valueOf(iprvo); - CollectionUtils.safeForEach(exts, new ForEachFunction() { - @Override - public void run(IpRangeDeletionExtensionPoint arg) { - arg.afterDeleteIpRange(inv); + for (IpRangeDeletionExtensionPoint ext : exts) { + ext.preDeleteIpRange(inv); + } + + CollectionUtils.safeForEach(exts, new ForEachFunction() { + @Override + public void run(IpRangeDeletionExtensionPoint arg) { + arg.beforeDeleteIpRange(inv); + } + }); + + FlowChain chain = new SimpleFlowChain(); + chain.setName(String.format("del-ip-range-%s", inv.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "disable-sdn-dhcp"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean isLastIpRange = isLastNormalIpRangeOfVersion(msg.getIpRangeUuid(), inv.getIpVersion()); + data.put("isLastIpRange", isLastIpRange); + + if (!self.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(self.getUuid()); + if (sdnDhcp == null) { + trigger.next(); + return; + } + + if (isLastIpRange) { + sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), inv.getIpVersion(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } else { + trigger.next(); + } + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-ip-range"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SdnControllerL3 sdnL3 = l3NwMgr.getSdnControllerL3(self.getL2NetworkUuid()); + if (sdnL3 == null) { + trigger.next(); + return; + } + + boolean isLastIpRange = (boolean) data.get("isLastIpRange"); + if (isLastIpRange) { + sdnL3.deleteIpRange(inv, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.debug(String.format("delete ip range [uuid:%s] failed because %s", + inv.getUuid(), errorCode.getDetails())); + trigger.next(); + } + }); + } else { + trigger.next(); + } + } + }).then(new NoRollbackFlow() { + String __name__ = "remove-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + dbf.remove(iprvo); + IpRangeHelper.updateL3NetworkIpversion(iprvo); + + CollectionUtils.safeForEach(exts, new ForEachFunction() { + @Override + public void run(IpRangeDeletionExtensionPoint arg) { + arg.afterDeleteIpRange(inv); + } + }); + trigger.next(); + } + }).then(new NoRollbackFlow() { + String __name__ = "after-delete-ip-range"; + + @Override + public void run (FlowTrigger trigger, Map data){ + CollectionUtils.safeForEach( + pluginRgty.getExtensionList(AfterDeleteIpRangeExtensionPoint.class), + ext -> ext.afterDeleteIpRange(inv) + ); + trigger.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + @Deferred + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + chainTask.next(); + } + }).done(new FlowDoneHandler(msg) { + @Override + @Deferred + public void handle(Map data) { + completion.success(); + chainTask.next(); + } + }).start(); } - }); - bus.reply(msg, reply); + @Override + public String getSyncSignature() { + return syncThreadName; + } + @Override + public String getName() { + return "delete-ip-range"; + } + }); } private void handle(L3NetworkDeletionMsg msg) { - L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); - L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); - boolean isExistSystemL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.system, true) - .eq(L3NetworkVO_.l2NetworkUuid, l2NetworkVO.getUuid()).isExists(); - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) - .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); - if (isExistSystemL3) { - if (clusterUuids != null && !clusterUuids.isEmpty()) { - for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { - List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid).in(HostVO_.clusterUuid, clusterUuids).listValues(); - if (l2NetworkVO.getType().equals(L2NetworkConstant.VXLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.HARDWARE_VXLAN_NETWORK_TYPE)) { - ext.syncManagementServiceTypeExtensionPoint(hostUuids, "vxlan" + l2NetworkVO.getVirtualNetworkId(), null, true); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public void run(SyncTaskChain chain) { + L3NetworkDeletionReply reply = new L3NetworkDeletionReply(); + L3NetworkVO l3NetworkVO = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); + + FlowChain fchain = new SimpleFlowChain(); + fchain.setName(String.format("del-l3-network-%s", msg.getL3NetworkUuid())); + fchain.then(new NoRollbackFlow() { + String __name__ = "remove-from-sdn-controller"; + + @Override + @Deferred + public void run(FlowTrigger trigger, Map data) { + SdnControllerL3 controllerL3 = l3NwMgr.getSdnControllerL3(self.getL2NetworkUuid()); + if (controllerL3 == null) { + trigger.next(); + return; + } + + controllerL3.deleteL3Network(L3NetworkInventory.valueOf(l3NetworkVO), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next();//ignore error + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "remove-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean isExistSystemL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.system, true) + .eq(L3NetworkVO_.l2NetworkUuid, l2NetworkVO.getUuid()).isExists(); + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) + .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); + if (isExistSystemL3) { + if (clusterUuids != null && !clusterUuids.isEmpty()) { + for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { + List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid).in(HostVO_.clusterUuid, clusterUuids).listValues(); + if (l2NetworkVO.getType().equals(L2NetworkConstant.VXLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.HARDWARE_VXLAN_NETWORK_TYPE)) { + ext.syncManagementServiceTypeExtensionPoint(hostUuids, "vxlan" + l2NetworkVO.getVirtualNetworkId(), null, true); + } + if (l2NetworkVO.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { + ext.syncManagementServiceTypeExtensionPoint(hostUuids, l2NetworkVO.getPhysicalInterface(), l2NetworkVO.getVirtualNetworkId(), true); + } + } + } + } + + if (!self.getReservedIpRanges().isEmpty()) { + SQL.New(ReservedIpRangeVO.class) + .in(ReservedIpRangeVO_.uuid, self.getReservedIpRanges().stream().map(ReservedIpRangeVO::getUuid).collect(Collectors.toList())) + .delete(); + } + + L3NetworkInventory inv = L3NetworkInventory.valueOf(self); + extpEmitter.beforeDelete(inv); + deleteHook(); + extpEmitter.afterDelete(inv); + + trigger.next(); } - if (l2NetworkVO.getType().equals(L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE) || l2NetworkVO.getType().equals(L2NetworkConstant.L2_VLAN_NETWORK_TYPE)) { - ext.syncManagementServiceTypeExtensionPoint(hostUuids, l2NetworkVO.getPhysicalInterface(), l2NetworkVO.getVirtualNetworkId(), true); + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + chain.next(); } - } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + chain.next(); + } + }).start(); } - } - if (!self.getReservedIpRanges().isEmpty()) { - SQL.New(ReservedIpRangeVO.class) - .in(ReservedIpRangeVO_.uuid, self.getReservedIpRanges().stream().map(ReservedIpRangeVO::getUuid).collect(Collectors.toList())) - .delete(); - } + @Override + public String getSyncSignature() { + return getSyncId(); + } - L3NetworkInventory inv = L3NetworkInventory.valueOf(self); - extpEmitter.beforeDelete(inv); - deleteHook(); - extpEmitter.afterDelete(inv); + @Override + public String getName() { + return "delete-l3-network-" + msg.getL3NetworkUuid(); + } + }); - L3NetworkDeletionReply reply = new L3NetworkDeletionReply(); - bus.reply(msg, reply); } private void handle(ReturnIpMsg msg) { @@ -906,47 +1120,72 @@ private void handle(APIUpdateL3NetworkMsg msg) { private void handle(APIAddIpRangeByNetworkCidrMsg msg) { List iprs = IpRangeInventory.fromMessage(msg); - List ret = new ArrayList<>(); - for (IpRangeInventory ipr : iprs) { - IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); - ret.add(inv); - } - tagMgr.createTagsFromAPICreateMessage(msg, iprs.get(0).getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); APIAddIpRangeByNetworkCidrEvent evt = new APIAddIpRangeByNetworkCidrEvent(msg.getId()); - evt.setInventory(ret.get(0)); - evt.setInventories(ret); - bus.publish(evt); + + IpRangeFactory factory = l3NwMgr.getIpRangeFactory(iprs.get(0).getIpRangeType()); + factory.createIpRange(iprs, msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + evt.setInventories(invs); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void handle(APIAddIpv6RangeByNetworkCidrMsg msg) { IpRangeInventory ipr = IpRangeInventory.fromMessage(msg); - IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - - tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName());; + APIAddIpRangeByNetworkCidrEvent evt = new APIAddIpRangeByNetworkCidrEvent(msg.getId()); - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); + factory.createIpRange(Collections.singletonList(ipr), msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + bus.publish(evt); + } - APIAddIpRangeByNetworkCidrEvent evt = new APIAddIpRangeByNetworkCidrEvent(msg.getId()); - evt.setInventory(inv); - evt.setInventories(Collections.singletonList(inv)); - bus.publish(evt); + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void handle(APIAddIpv6RangeMsg msg) { IpRangeInventory ipr = IpRangeInventory.fromMessage(msg); - IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); - IpRangeInventory inv = factory.createIpRange(ipr, msg); - - tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); - setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + IpRangeFactory factory = l3NwMgr.getIpRangeFactory(ipr.getIpRangeType()); + factory.createIpRange(Collections.singletonList(ipr), msg, new ReturnValueCompletion>(msg) { + @Override + public void success(List invs) { + IpRangeInventory inv = invs.get(0); + tagMgr.createTagsFromAPICreateMessage(msg, inv.getL3NetworkUuid(), L3NetworkVO.class.getSimpleName()); + setIpRangeSharedResource(msg.getL3NetworkUuid(), inv.getUuid()); + evt.setInventory(inv); + bus.publish(evt); + } - APIAddIpRangeEvent evt = new APIAddIpRangeEvent(msg.getId()); - evt.setInventory(inv); - bus.publish(evt); + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } @@ -969,6 +1208,8 @@ private void handle(APIChangeL3NetworkStateMsg msg) { private void handle(final APIRemoveDnsFromL3NetworkMsg msg) { final APIRemoveDnsFromL3NetworkEvent evt = new APIRemoveDnsFromL3NetworkEvent(msg.getId()); + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(msg.getL3NetworkUuid()); + FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("remove-dns-%s-from-l3-%s", msg.getDns(), msg.getL3NetworkUuid())); chain.then(new ShareFlow() { @@ -991,10 +1232,50 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "remove-dns-from-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (!self.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + if (sdnDhcp == null) { + trigger.next(); + return; + } + + List iprs = IpRangeHelper.getNormalIpRanges(self); + if (iprs.isEmpty()) { + trigger.next(); + return; + } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + if (L3NetworkConstant.L3_BASIC_NETWORK_TYPE.equals(self.getType()) && !self.getNetworkServices().isEmpty()) { flow(new NoRollbackFlow() { String __name__ = "remove-dns-from-backend"; + @Override + public boolean skip(Map data) { + return sdnDhcp != null; + } + @Override public void run(final FlowTrigger trigger, Map data) { RemoveDnsMsg rmsg = new RemoveDnsMsg(); @@ -1037,6 +1318,8 @@ public void handle(ErrorCode errCode, Map data) { private void handle(final APIAddDnsToL3NetworkMsg msg) { final APIAddDnsToL3NetworkEvent evt = new APIAddDnsToL3NetworkEvent(msg.getId()); + SdnControllerDhcp sdnDhcp = l3NwMgr.getSdnControllerDhcp(msg.getL3NetworkUuid()); + FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("add-dns-%s-to-l3-%s", msg.getDns(), msg.getL3NetworkUuid())); chain.then(new ShareFlow() { @@ -1067,10 +1350,50 @@ public void rollback(FlowRollback trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-to-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (!self.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + if (sdnDhcp == null) { + trigger.next(); + return; + } + + List iprs = IpRangeHelper.getNormalIpRanges(self); + if (iprs.isEmpty()) { + trigger.next(); + return; + } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(self)), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + if (L3NetworkConstant.L3_BASIC_NETWORK_TYPE.equals(self.getType()) && !self.getNetworkServices().isEmpty()) { flow(new NoRollbackFlow() { String __name__ = "apply-to-backend"; + @Override + public boolean skip(Map data) { + return sdnDhcp != null; + } + @Override public void run(final FlowTrigger trigger, Map data) { AddDnsMsg amsg = new AddDnsMsg(); @@ -1418,33 +1741,16 @@ public void handle(ErrorCode errCode, Map data) { private void handle(APIDeleteL3NetworkMsg msg) { final APIDeleteL3NetworkEvent evt = new APIDeleteL3NetworkEvent(msg.getId()); - thdf.chainSubmit(new ChainTask(msg) { - @Override - public void run(SyncTaskChain chain) { - doDeleteL3Network(msg, new Completion(msg) { - @Override - public void success() { - bus.publish(evt); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - evt.setError(errorCode); - bus.publish(evt); - chain.next(); - } - }); - } - + doDeleteL3Network(msg, new Completion(msg) { @Override - public String getSyncSignature() { - return getSyncId(); + public void success() { + bus.publish(evt); } @Override - public String getName() { - return "delete-l3-network-" + msg.getL3NetworkUuid(); + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); } }); } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java b/network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java new file mode 100644 index 00000000000..3863c0bb4d6 --- /dev/null +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkHelper.java @@ -0,0 +1,35 @@ +package org.zstack.network.l3; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.db.Q; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.L2NetworkVO_; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.network.l2.L2NetworkSystemTags; + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class L3NetworkHelper { + + public static String getL3networkVSwitchType(String l3Uuid) { + String l2Uuid = Q.New(L3NetworkVO.class) + .select(L3NetworkVO_.l2NetworkUuid) + .eq(L3NetworkVO_.uuid, l3Uuid).findValue(); + return Q.New(L2NetworkVO.class) + .select(L2NetworkVO_.vSwitchType) + .eq(L2NetworkVO_.uuid, l2Uuid).findValue(); + } + + public static String getSdnControllerUuidFromL2Uuid(String l2Uuid) { + return L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2Uuid, L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + } + + public static String getSdnControllerUuidFromL3Uuid(String l3Uuid) { + String l2Uuid = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, l3Uuid) + .select(L3NetworkVO_.l2NetworkUuid).findValue(); + + return getSdnControllerUuidFromL2Uuid(l2Uuid); + } +} diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java index 5cbb69ad604..eebbb11b747 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManager.java @@ -2,6 +2,7 @@ import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.network.l3.*; +import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicVO; @@ -30,4 +31,14 @@ public interface L3NetworkManager { List filterVmNicByIpVersion(List vmNics, int ipVersion); boolean applyNetworkServiceWhenVmStateChange(String type); + + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); + + /** + * Resolve SDN controller L3 service bound to the given L2 network. + * + * @param l2Uuid L2Network UUID used to locate the SDN controller + * @return SdnControllerL3 implementation, or null if none is available + */ + SdnControllerL3 getSdnControllerL3(String l2Uuid); } diff --git a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java index f4b72057b40..7c1ee6da361 100755 --- a/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java +++ b/network/src/main/java/org/zstack/network/l3/L3NetworkManagerImpl.java @@ -10,9 +10,12 @@ import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; +import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; +import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.AbstractService; +import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.workflow.*; @@ -31,6 +34,8 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.network.l3.datatypes.IpCapacityData; +import org.zstack.header.network.service.GetSdnControllerExtensionPoint; +import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicVO; import org.zstack.header.vm.VmNicVO_; @@ -48,6 +53,7 @@ import org.zstack.utils.ExceptionDSL; import org.zstack.utils.ObjectUtils; import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; import org.zstack.utils.network.IPv6NetworkUtils; @@ -59,6 +65,7 @@ import java.math.BigInteger; import java.util.*; import java.util.concurrent.Callable; +import java.util.stream.Collectors; import static org.zstack.core.Platform.err; import static org.zstack.utils.CollectionDSL.*; @@ -137,6 +144,7 @@ private void handleApiMessage(APIMessage msg) { private void handle(final APISetL3NetworkMtuMsg msg) { final APISetL3NetworkMtuEvent evt = new APISetL3NetworkMtuEvent(msg.getId()); + String oldmtu = NetworkServiceSystemTag.L3_MTU.getTokenByResourceUuid(msg.getL3NetworkUuid(), NetworkServiceSystemTag.MTU_TOKEN); NetworkServiceSystemTag.L3_MTU.delete(msg.getL3NetworkUuid()); SystemTagCreator creator = NetworkServiceSystemTag.L3_MTU.newSystemTagCreator(msg.getL3NetworkUuid()); creator.ignoreIfExisting = true; @@ -149,7 +157,66 @@ private void handle(final APISetL3NetworkMtuMsg msg) { ); creator.create(); - bus.publish(evt); + L3NetworkVO l3Vo = dbf.findByUuid(msg.getL3NetworkUuid(), L3NetworkVO.class); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName("change-l3-network-mtu"); + chain.then(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + if (!l3Vo.enableIpAddressAllocation()) { + trigger.next(); + return; + } + + SdnControllerDhcp dhcp = getSdnControllerDhcp(msg.getL3NetworkUuid()); + if (dhcp == null) { + trigger.next(); + return; + } + + List iprs = IpRangeHelper.getNormalIpRanges(l3Vo); + if (iprs.isEmpty()) { + trigger.next(); + return; + } + + dhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3Vo)), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + bus.publish(evt); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + if (oldmtu != null) { + NetworkServiceSystemTag.L3_MTU.delete(msg.getL3NetworkUuid()); + SystemTagCreator creator = NetworkServiceSystemTag.L3_MTU.newSystemTagCreator(msg.getL3NetworkUuid()); + creator.recreate = true; + creator.inherent = false; + creator.setTagByTokens( + map( + e(NetworkServiceSystemTag.MTU_TOKEN, oldmtu), + e(NetworkServiceSystemTag.L3_UUID_TOKEN, msg.getL3NetworkUuid()) + ) + ); + creator.create(); + } + evt.setError(errCode); + bus.publish(evt); + } + }).start(); } private void handle(final APIGetL3NetworkMtuMsg msg) { @@ -432,6 +499,8 @@ private void syncManagementServiceTypeWhileCreate(ServiceTypeExtensionPoint ext, } private void handle(APICreateL3NetworkMsg msg) { + APICreateL3NetworkEvent evt = new APICreateL3NetworkEvent(msg.getId()); + L2NetworkVO l2Vo = Q.New(L2NetworkVO.class).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).find(); assert l2Vo.getZoneUuid() != null; @@ -456,37 +525,83 @@ private void handle(APICreateL3NetworkMsg msg) { } else { vo.setIpVersion(IPv6Constants.IPv4); } + vo.setInternalId((int)dbf.generateSequenceNumber(L3NetworkSequenceNumberVO.class)); + + FlowChain fchain = new SimpleFlowChain(); + fchain.setName(String.format("create-l3-network-%s", vo.getUuid())); + fchain.then(new NoRollbackFlow() { + String __name__ = "add-l3-to-sdn-controller"; - L3NetworkFactory factory = getL3NetworkFactory(L3NetworkType.valueOf(msg.getType())); - L3NetworkInventory inv = new SQLBatchWithReturn() { @Override - protected L3NetworkInventory scripts() { - vo.setAccountUuid(msg.getSession().getAccountUuid()); - L3NetworkInventory inv = factory.createL3Network(vo, msg); - tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), L3NetworkVO.class.getSimpleName()); - return inv; - } - }.execute(); - - if (msg.isSystem()) { - L2NetworkVO l2NetworkVO = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) - .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); - if (clusterUuids != null && !clusterUuids.isEmpty()) { - List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid) - .in(HostVO_.clusterUuid, clusterUuids).listValues(); - for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { - syncManagementServiceTypeWhileCreate(ext, l2NetworkVO, hostUuids); + @Deferred + public void run(FlowTrigger trigger, Map data) { + SdnControllerL3 controllerL3 = getSdnControllerL3(msg.getL2NetworkUuid()); + if (controllerL3 == null) { + trigger.next(); + return; } + + controllerL3.createL3Network(L3NetworkInventory.valueOf(vo), msg.getSystemTags(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); } - } + }).then(new NoRollbackFlow() { + String __name__ = "save-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + L3NetworkFactory factory = getL3NetworkFactory(L3NetworkType.valueOf(msg.getType())); + L3NetworkInventory inv = new SQLBatchWithReturn() { + @Override + protected L3NetworkInventory scripts() { + vo.setAccountUuid(msg.getSession().getAccountUuid()); + L3NetworkInventory inv = factory.createL3Network(vo, msg); + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), L3NetworkVO.class.getSimpleName()); + return inv; + } + }.execute(); + + if (msg.isSystem()) { + L2NetworkVO l2NetworkVO = dbf.findByUuid(msg.getL2NetworkUuid(), L2NetworkVO.class); + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).select(L2NetworkClusterRefVO_.clusterUuid) + .eq(L2NetworkClusterRefVO_.l2NetworkUuid, l2NetworkVO.getUuid()).listValues(); + if (clusterUuids != null && !clusterUuids.isEmpty()) { + List hostUuids = Q.New(HostVO.class).select(HostVO_.uuid) + .in(HostVO_.clusterUuid, clusterUuids).listValues(); + for (ServiceTypeExtensionPoint ext : pluginRgty.getExtensionList(ServiceTypeExtensionPoint.class)) { + syncManagementServiceTypeWhileCreate(ext, l2NetworkVO, hostUuids); + } + } + } - extpEmitter.afterCreate(inv); + extpEmitter.afterCreate(inv); + evt.setInventory(inv); + + trigger.next(); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); + bus.publish(evt); + } + }).done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + logger.debug(String.format("Successfully created L3Network[name:%s, uuid:%s]", vo.getName(), vo.getUuid())); + bus.publish(evt); + } + }).start(); - APICreateL3NetworkEvent evt = new APICreateL3NetworkEvent(msg.getId()); - evt.setInventory(inv); - logger.debug(String.format("Successfully created L3Network[name:%s, uuid:%s]", inv.getName(), inv.getUuid())); - bus.publish(evt); } @Override @@ -916,4 +1031,22 @@ public void check(CheckIpAvailabilityMsg msg, ReturnValueCompletion() { + public void createIpRange(List iprs, APICreateMessage msg, ReturnValueCompletion> completion) { + FlowChain chain = new SimpleFlowChain(); + chain.setName(String.format("add-iprange-to-l3-%s", iprs.get(0).getL3NetworkUuid())); + chain.then(new Flow() { + String __name__ = "save-db"; @Override - protected NormalIpRangeVO scripts() { - NormalIpRangeVO vo = new NormalIpRangeVO(); - vo.setUuid(ipr.getUuid() == null ? Platform.getUuid() : ipr.getUuid()); - vo.setDescription(ipr.getDescription()); - vo.setEndIp(ipr.getEndIp()); - vo.setGateway(ipr.getGateway()); - vo.setL3NetworkUuid(ipr.getL3NetworkUuid()); - vo.setName(ipr.getName()); - vo.setNetmask(ipr.getNetmask()); - vo.setStartIp(ipr.getStartIp()); - vo.setNetworkCidr(ipr.getNetworkCidr()); - vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setIpVersion(ipr.getIpVersion()); - vo.setAddressMode(ipr.getAddressMode()); - vo.setPrefixLen(ipr.getPrefixLen()); - dbf.getEntityManager().persist(vo); - dbf.getEntityManager().flush(); - dbf.getEntityManager().refresh(vo); - - return vo; - } - }.execute(); + public void run(FlowTrigger trigger, Map data) { + List vos = new ArrayList<>(); + for (IpRangeInventory ipr : iprs) { + NormalIpRangeVO vo = new SQLBatchWithReturn() { + @Override + protected NormalIpRangeVO scripts() { + NormalIpRangeVO vo = (NormalIpRangeVO) IpRangeHelper + .fromIpRangeInventory(ipr, msg.getSession().getAccountUuid()); + dbf.getEntityManager().persist(vo); + dbf.getEntityManager().flush(); + dbf.getEntityManager().refresh(vo); + + return vo; + } + }.execute(); + + IpRangeHelper.updateL3NetworkIpversion(vo); + + List usedIpVos = Q.New(UsedIpVO.class) + .eq(UsedIpVO_.l3NetworkUuid, vo.getL3NetworkUuid()) + .eq(UsedIpVO_.ipVersion, vo.getIpVersion()).list(); + List updateVos = new ArrayList<>(); + for (UsedIpVO ipvo : usedIpVos) { + if (ipvo.getIpVersion() == IPv6Constants.IPv4) { + if (NetworkUtils.isInRange(ipvo.getIp(), vo.getStartIp(), vo.getEndIp())) { + ipvo.setIpRangeUuid(vo.getUuid()); + updateVos.add(ipvo); + } + } else { + if (IPv6NetworkUtils.isIpv6InRange(ipvo.getIp(), vo.getStartIp(), vo.getEndIp())) { + ipvo.setIpRangeUuid(vo.getUuid()); + updateVos.add(ipvo); + } + } + } + + if (!updateVos.isEmpty()) { + dbf.updateCollection(updateVos); + } - IpRangeHelper.updateL3NetworkIpversion(ipr); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { + @Override + public void run(AfterAddIpRangeExtensionPoint ext) { + ext.afterAddIpRange(IpRangeInventory.valueOf(vo), msg.getSystemTags()); + } + }); + + vos.add(vo); + } + + data.put("IpRangeVO", vos); + trigger.next(); + } - final IpRangeInventory finalIpr = NormalIpRangeInventory.valueOf1(vo); - CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAddIpRangeExtensionPoint.class), new ForEachFunction() { @Override - public void run(AfterAddIpRangeExtensionPoint ext) { - ext.afterAddIpRange(finalIpr, msg.getSystemTags()); + public void rollback(FlowRollback trigger, Map data) { + List vos = (List) data.get("IpRangeVO"); + dbf.removeCollection(vos, IpRangeVO.class); + trigger.rollback(); } - }); - - List usedIpVos = Q.New(UsedIpVO.class) - .eq(UsedIpVO_.l3NetworkUuid, finalIpr.getL3NetworkUuid()) - .eq(UsedIpVO_.ipVersion, finalIpr.getIpVersion()).list(); - List updateVos = new ArrayList<>(); - for (UsedIpVO ipvo : usedIpVos) { - if (ipvo.getIpVersion() == IPv6Constants.IPv4) { - if (NetworkUtils.isInRange(ipvo.getIp(), finalIpr.getStartIp(), finalIpr.getEndIp())) { - ipvo.setIpRangeUuid(finalIpr.getUuid()); - updateVos.add(ipvo); + }).then(new NoRollbackFlow() { + String __name__ = "enable-sdn-dhcp"; + + @Override + public void run(FlowTrigger trigger, Map data) { + L3NetworkVO l3vo = dbf.findByUuid(iprs.get(0).getL3NetworkUuid(), L3NetworkVO.class); + if (!l3vo.enableIpAddressAllocation()) { + trigger.next(); + return; } - } else { - if (IPv6NetworkUtils.isIpv6InRange(ipvo.getIp(), finalIpr.getStartIp(), finalIpr.getEndIp())) { - ipvo.setIpRangeUuid(finalIpr.getUuid()); - updateVos.add(ipvo); + + SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3vo.getUuid()); + if (sdnDhcp == null) { + trigger.next(); + return; } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3vo)), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); } - } + }).then(new NoRollbackFlow() { + String __name__ = "add-sdn-subnet"; + + @Override + public void run(FlowTrigger trigger, Map data) { + L3NetworkVO l3vo = dbf.findByUuid(iprs.get(0).getL3NetworkUuid(), L3NetworkVO.class); + SdnControllerL3 sdnL3 = l3Mgr.getSdnControllerL3(l3vo.getL2NetworkUuid()); + if (sdnL3 == null) { + trigger.next(); + return; + } - if (!updateVos.isEmpty()) { - dbf.updateCollection(updateVos); - } + List vos = (List) data.get("IpRangeVO"); + sdnL3.createIpRange(IpRangeInventory.valueOf(vos.get(0)), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } - return finalIpr; + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + List vos = (List) data.get("IpRangeVO"); + completion.success(IpRangeInventory.valueOf(vos)); + } + }).start(); } } diff --git a/network/src/main/java/org/zstack/network/service/DhcpExtension.java b/network/src/main/java/org/zstack/network/service/DhcpExtension.java index a1239db4f99..0dfbb39c1a5 100755 --- a/network/src/main/java/org/zstack/network/service/DhcpExtension.java +++ b/network/src/main/java/org/zstack/network/service/DhcpExtension.java @@ -12,14 +12,12 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.network.l3.*; -import org.zstack.header.network.service.DhcpStruct; -import org.zstack.header.network.service.NetworkServiceDhcpBackend; -import org.zstack.header.network.service.NetworkServiceProviderType; -import org.zstack.header.network.service.NetworkServiceType; +import org.zstack.header.network.service.*; import org.zstack.header.vm.*; import org.zstack.header.vm.VmInstanceSpec.HostName; import org.zstack.network.l3.IpRangeHelper; import org.zstack.network.l3.L3NetworkGlobalConfig; +import org.zstack.network.l3.L3NetworkManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; @@ -43,6 +41,8 @@ public class DhcpExtension extends AbstractNetworkServiceExtension implements Co @Autowired private PluginRegistry pluginRgty; + @Autowired + private L3NetworkManager l3Mgr; private final Map dhcpBackends = new HashMap(); @@ -297,6 +297,10 @@ private Map> workoutDhcp(VmInstanceS for (Map.Entry> e : providerMap.entrySet()) { NetworkServiceProviderType ptype = e.getKey(); + if (!ptype.isCreateDhcpNameSpace()) { + continue; + } + List lst = new ArrayList(); List nics = new ArrayList<>(); @@ -391,6 +395,18 @@ public void fail(ErrorCode errorCode) { @Override public void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, List systemTags, Completion completion) { + SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3VO.getUuid()); + if (sdnDhcp != null) { + List normalIpRange = IpRangeHelper.getNormalIpRanges(l3VO); + if (normalIpRange.isEmpty()) { + completion.success(); + return; + } + + sdnDhcp.allocateDhcpAndEnableDhcp(l3VO, systemTags, completion); + return; + } + NetworkServiceDhcpBackend bkd = dhcpBackends.get(providerType); if (bkd == null) { completion.fail(operr("unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); @@ -402,6 +418,18 @@ public void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType pr @Override public void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, Completion completion) { + SdnControllerDhcp sdnDhcp = l3Mgr.getSdnControllerDhcp(l3VO.getUuid()); + if (sdnDhcp != null) { + List normalIpRange = IpRangeHelper.getNormalIpRanges(l3VO); + if (normalIpRange.isEmpty()) { + completion.success(); + return; + } + + sdnDhcp.disableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), IPv6Constants.DUAL_STACK, completion); + return; + } + NetworkServiceDhcpBackend bkd = dhcpBackends.get(providerType); if (bkd == null) { completion.fail(operr("unable to find NetworkServiceDhcpBackend[provider type: %s]", providerType)); diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java b/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java index 4047e7a99d9..2347ea2ff2f 100644 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceHelper.java @@ -11,6 +11,14 @@ public class NetworkServiceHelper { public static class HostRouteInfo { public String prefix; public String nexthop; + + @Override + public String toString() { + return "HostRouteInfo{" + + "prefix='" + prefix + '\'' + + ", nexthop='" + nexthop + '\'' + + '}'; + } } public static List getL3NetworkHostRoute(String l3NetworkUuid){ diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java b/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java index c6f7e14dd81..cd80c9b184f 100755 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceManager.java @@ -8,6 +8,7 @@ import org.zstack.header.vm.VmInstanceSpec; import java.util.List; +import java.util.Set; public interface NetworkServiceManager { NetworkServiceProviderType getTypeOfNetworkServiceProviderForService(String l3NetworkUuid, NetworkServiceType serviceType); @@ -21,4 +22,6 @@ void enableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerT NetworkServiceType nsType, List systemTags, Completion completion); void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType providerType, NetworkServiceType nsType, Completion completion); + + Set getSupportedVmTypes(); } diff --git a/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java b/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java index eac256b19cd..787ee313cd6 100755 --- a/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java +++ b/network/src/main/java/org/zstack/network/service/NetworkServiceManagerImpl.java @@ -53,8 +53,7 @@ public class NetworkServiceManagerImpl extends AbstractService implements Networ private Set supportedVmTypes = new HashSet<>(); private List nsExts = new ArrayList(); - - private void populateExtensions() { + private void populateExtensions() { for (NetworkServiceProviderFactory extp : pluginRgty.getExtensionList(NetworkServiceProviderFactory.class)) { NetworkServiceProviderFactory old = providerFactories.get(extp.getType().toString()); if (old != null) { @@ -536,4 +535,9 @@ public void disableNetworkService(L3NetworkVO l3VO, NetworkServiceProviderType p logger.debug(String.format("there is no backend[provideType:%s, serviceType:%S] to disable service", providerType.toString(), nsType.toString())); completion.success(); } + + @Override + public Set getSupportedVmTypes() { + return supportedVmTypes; + } } diff --git a/plugin/acl/pom.xml b/plugin/acl/pom.xml index c64059720b8..1af18880f15 100644 --- a/plugin/acl/pom.xml +++ b/plugin/acl/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java index b953caef9c3..5e90711f200 100644 --- a/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java +++ b/plugin/acl/src/main/java/org/zstack/acl/AccessControlListManagerImpl.java @@ -73,6 +73,8 @@ public void handleMessage(Message msg) { protected void handleApiMessage(APIMessage msg) { if (msg instanceof APICreateAccessControlListMsg) { handle((APICreateAccessControlListMsg) msg); + } else if (msg instanceof APIUpdateAccessControlListMsg) { + handle((APIUpdateAccessControlListMsg) msg); } else if (msg instanceof APIDeleteAccessControlListMsg) { handle((APIDeleteAccessControlListMsg) msg); } else if (msg instanceof APIAddAccessControlListEntryMsg) { @@ -119,6 +121,26 @@ protected void scripts() { bus.publish(evt); } + private void handle(APIUpdateAccessControlListMsg msg) { + AccessControlListVO vo = dbf.findByUuid(msg.getUuid(), AccessControlListVO.class); + boolean update = false; + if (msg.getName() != null) { + vo.setName(msg.getName()); + update = true; + } + if (msg.getDescription() != null) { + vo.setDescription(msg.getDescription()); + update = true; + } + if (update) { + vo = dbf.updateAndRefresh(vo); + } + + APIUpdateAccessControlListEvent event = new APIUpdateAccessControlListEvent(msg.getId()); + event.setInventory(vo.toInventory()); + bus.publish(event); + } + private void handle(APIDeleteAccessControlListMsg msg) { APIDeleteAccessControlListEvent evt = new APIDeleteAccessControlListEvent(msg.getId()); deleteAccessControlList(msg.getUuid(), msg.getDeletionMode(), new Completion(msg) { @@ -411,6 +433,18 @@ public void fail(ErrorCode errorCode) { fchain.done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { + // Call extensions before deleting entries + List entries = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.aclUuid, aclVO.getUuid()).list(); + + entries.forEach(entry -> { + CollectionUtils.safeForEach(pluginRgty.getExtensionList(RefreshAccessControlListExtensionPoint.class), + ext -> { + logger.debug(String.format("execute before del acl ip entry extension point %s", ext)); + ext.beforeDeleteIpEntry(aclVO.toInventory(), entry.toInventory()); + }); + }); + new SQLBatch() { @Override protected void scripts() { @@ -419,6 +453,14 @@ protected void scripts() { if (!entrys.isEmpty()) { entrys.forEach( entry-> remove(entry)); } + // Call extensions after deleting entries + entries.forEach(entry -> { + CollectionUtils.safeForEach(pluginRgty.getExtensionList(RefreshAccessControlListExtensionPoint.class), + ext -> { + logger.debug(String.format("execute after del acl ip entry extension point %s", ext)); + ext.afterDeleteIpEntry(aclVO.toInventory(), entry.toInventory()); + }); + }); remove(aclVO); } }.execute(); diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java index f84f4e7e9ae..eab75961dfd 100644 --- a/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIChangeAccessControlListRedirectRuleMsg.java @@ -41,4 +41,11 @@ public void setName(String name) { public Result audit(APIMessage msg, APIEvent rsp) { return null; } + + public static APIChangeAccessControlListRedirectRuleMsg __example__() { + APIChangeAccessControlListRedirectRuleMsg msg = new APIChangeAccessControlListRedirectRuleMsg(); + msg.setUuid(uuid()); + msg.setName("redirectRule"); + return msg; + } } diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java new file mode 100644 index 00000000000..5fe80081dcc --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEvent.java @@ -0,0 +1,37 @@ +package org.zstack.header.acl; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +/** + * Created by boce.wang on 05/13/2025. + */ +@RestResponse(allTo = "inventory") +public class APIUpdateAccessControlListEvent extends APIEvent { + private AccessControlListInventory inventory; + + public APIUpdateAccessControlListEvent() { } + + public APIUpdateAccessControlListEvent(String apiId) { + super(apiId); + } + + public void setInventory(AccessControlListInventory inventory) { + this.inventory = inventory; + } + + public AccessControlListInventory getInventory() { + return inventory; + } + + public static APIUpdateAccessControlListEvent __example__() { + APIUpdateAccessControlListEvent event = new APIUpdateAccessControlListEvent(); + AccessControlListInventory inv = new AccessControlListInventory(); + + inv.setName("acl-group"); + inv.setIpVersion(4); + + event.setInventory(inv); + return event; + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..fae86438d4a --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.acl + +import org.zstack.header.acl.AccessControlListInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "访问控制策略组清单" + + ref { + name "inventory" + path "org.zstack.header.acl.APIUpdateAccessControlListEvent.inventory" + desc "更新后的访问控制策略组详细信息" + type "AccessControlListInventory" + since "5.3.28" + clz AccessControlListInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.header.acl.APIUpdateAccessControlListEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java new file mode 100644 index 00000000000..5525b72adf4 --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsg.java @@ -0,0 +1,65 @@ +package org.zstack.header.acl; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.other.APIAuditor; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 05/13/2025. + */ + +@Action(category = AccessControlListConstants.ACTION_CATEGORY) +@RestRequest( + path = "/access-control-lists/{uuid}/actions", + method = HttpMethod.PUT, + responseClass = APIUpdateAccessControlListEvent.class, + isAction = true +) +public class APIUpdateAccessControlListMsg extends APIMessage implements APIAuditor { + @APIParam(resourceType = AccessControlListVO.class, checkAccount = true) + private String uuid; + @APIParam(required = false, maxLength = 255, emptyString = false) + private String name; + @APIParam(maxLength = 2048, required = false) + private String description; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public Result audit(APIMessage msg, APIEvent rsp) { + return new Result(rsp.isSuccess() ? ((APIUpdateAccessControlListEvent)rsp).getInventory().getUuid() : "", AccessControlListVO.class); + } + + public static APIUpdateAccessControlListMsg __example__() { + APIUpdateAccessControlListMsg msg = new APIUpdateAccessControlListMsg(); + msg.setName("acl-1"); + msg.setDescription("acl-1 description"); + return msg; + } +} diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..31f76a1c9f0 --- /dev/null +++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIUpdateAccessControlListMsgDoc_zh_cn.groovy @@ -0,0 +1,76 @@ +package org.zstack.header.acl + +import org.zstack.header.acl.APIUpdateAccessControlListEvent + +doc { + title "UpdateAccessControlList" + + category "acl" + + desc """更新访问控制策略组""" + + rest { + request { + url "PUT /v1/access-control-lists/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIUpdateAccessControlListMsg.class + + desc """用于更新指定UUID的访问控制策略组的名称和描述""" + + params { + + column { + name "uuid" + enclosedIn "updateAccessControlList" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.3.28" + } + column { + name "name" + enclosedIn "updateAccessControlList" + desc "资源名称" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "description" + enclosedIn "updateAccessControlList" + desc "资源的详细描述" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.28" + } + } + } + + response { + clz APIUpdateAccessControlListEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/applianceVm/pom.xml b/plugin/applianceVm/pom.xml index cc95d84ab98..d6529929856 100755 --- a/plugin/applianceVm/pom.xml +++ b/plugin/applianceVm/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 .. applianceVm diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java index f9ce38942e8..5f2b1e29088 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmAllocateNicFlow.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.annotation.Transactional; +import org.zstack.compute.vm.MacOperator; import org.zstack.compute.vm.VmInstanceManager; import org.zstack.compute.vm.VmNicManager; import org.zstack.core.Platform; @@ -86,28 +87,15 @@ private VmNicInventory makeNicInventory(VmInstanceSpec vmSpec, ApplianceVmNicSpe inv.setDeviceId(deviceId[0]); inv.setMetaData(nicSpec.getMetaData()); inv.setInternalName(VmNicVO.generateNicInternalName(vmSpec.getVmInventory().getInternalId(), inv.getDeviceId())); - inv.setMac(NetworkUtils.generateMacWithDeviceId((short) inv.getDeviceId())); + inv.setMac(MacOperator.generateMacWithDeviceId((short) inv.getDeviceId())); inv.setHypervisorType(vmSpec.getVmInventory().getHypervisorType()); inv.setDriverType(ImagePlatform.valueOf(vmSpec.getVmInventory().getPlatform()).isParaVirtualization() ? nicManager.getDefaultPVNicDriver() : nicManager.getDefaultNicDriver()); inv.setState(VmNicState.enable.toString()); L3NetworkVO l3NetworkVO = dbf.findByUuid(nicSpec.getL3NetworkUuid(), L3NetworkVO.class); - L2NetworkVO l2NetworkVO = dbf.findByUuid(l3NetworkVO.getL2NetworkUuid(), L2NetworkVO.class); - - // set vnic type based on enableSRIOV system tag & enableVhostUser globalConfig - boolean enableSriov = Q.New(SystemTagVO.class) - .eq(SystemTagVO_.resourceType, VmInstanceVO.class.getSimpleName()) - .eq(SystemTagVO_.resourceUuid, vmSpec.getVmInventory().getUuid()) - .eq(SystemTagVO_.tag, String.format("enableSRIOV::%s", nicSpec.getL3NetworkUuid())) - .isExists(); - boolean enableVhostUser = NetworkServiceGlobalConfig.ENABLE_VHOSTUSER.value(Boolean.class); - - VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); - VmNicType vmNicType = vSwitchType.getVmNicTypeWithCondition(enableSriov, enableVhostUser); - if (vmNicType == null) { - throw new OperationFailureException(Platform.operr("there is no available nicType on L2 network [%s]", l2NetworkVO.getUuid())); - } + VmNicType vmNicType = nicManager.getVmNicType(vmSpec.getVmInventory().getUuid(), + L3NetworkInventory.valueOf(l3NetworkVO)); inv.setType(vmNicType.toString()); inv.setUsedIps(new ArrayList<>()); diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java index de24b6746ff..6f3f6e09242 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmBase.java @@ -430,10 +430,6 @@ protected FlowChain getStopVmWorkFlowChain(VmInstanceInventory inv) { @Override public void run(FlowTrigger trigger, Map data) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s stopped", - getSelf().getUuid())); - } trigger.next(); } @@ -468,7 +464,7 @@ protected void fireServiceUnhealthyCanonicalEvent(ErrorCode err) { data.setHealthy(false); data.setReason(err); - evtf.fire(ApplianceVmCanonicalEvents.SERVICE_UNHEALTHY_PATH, data); + evtf.fire(ApplianceVmCanonicalEvents.SERVICE_HEALTHY_PATH, data); } protected void fireServicehealthyCanonicalEvent() { @@ -498,7 +494,7 @@ protected FlowChain getDestroyVmWorkFlowChain(VmInstanceInventory inv) { ApplianceVmStatus originStatus = getSelf().getStatus(); public void run(FlowTrigger trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Disconnected); + changeApplianceVmStatus(ApplianceVmStatus.Destroying); trigger.next(); } @@ -560,21 +556,12 @@ protected void provisionAfterRebootVm(VmInstanceSpec spec, NoErrorCompletion com @Override public void run(FlowTrigger trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Connecting); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot", - getSelf().getUuid())); - } + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); trigger.next(); } @Override public void rollback(FlowRollback trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -640,10 +627,6 @@ public void run(FlowTrigger trigger, Map data) { @Override public void rollback(FlowRollback trigger, Map data) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s start failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -708,21 +691,12 @@ protected FlowChain getRebootVmWorkFlowChain(VmInstanceInventory inv) { @Override public void run(FlowTrigger trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Connecting); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot", - getSelf().getUuid())); - } + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); trigger.next(); } @Override public void rollback(FlowRollback trigger, Map data) { - changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s reboot failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -781,10 +755,6 @@ public void run(FlowTrigger trigger, Map data) { @Override public void rollback(FlowRollback trigger, Map data) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); - if (originStatus.equals(ApplianceVmStatus.Connected)) { - fireDisconnectedCanonicalEvent(operr("appliance vm %s start failed", - getSelf().getUuid())); - } trigger.rollback(); } }); @@ -819,10 +789,6 @@ public void run(FlowTrigger trigger, Map data) { } private FlowChain addBootstrapFlows(FlowChain chain, HypervisorType hvType) { - if (upgradeChecker.skipInnerDeployOrInitOnCurrentAgent(self.getUuid())) { - return chain; - } - for (Flow flow : createBootstrapFlows(hvType)) { chain.then(flow); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java index bef8e06bddc..d2134ad3f8c 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmCascadeExtension.java @@ -74,6 +74,8 @@ public class ApplianceVmCascadeExtension extends AbstractAsyncCascadeExtension { private PluginRegistry pluginRgty; @Autowired protected ThreadFacade thdf; + @Autowired + private ApplianceVmFacade apvmFacade; private static String NAME = ApplianceVmVO.class.getSimpleName(); @@ -287,10 +289,22 @@ private void handleL2NetworkDetach(CascadeAction action, final Completion comple .map(VmInstanceVO::getUuid).collect(Collectors.toList())).list(); if (!applianceVmVOS.isEmpty()) { - for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { - applianceVmVOS = ext.filterApplianceVmCascade(applianceVmVOS, action, action.getParentIssuer(), l3uuids, - new ArrayList<>(), new ArrayList<>()); + List toMigrateVms = new ArrayList<>(); + Map> apvmsByType = applianceVmVOS.stream() + .collect(Collectors.groupingBy(ApplianceVmVO::getApplianceVmType)); + + for (Map.Entry> entry : apvmsByType.entrySet()) { + ApplianceVmType vmType = ApplianceVmType.valueOf(entry.getKey()); + List vmsOfType = entry.getValue(); + + ApvmCascadeFilterExtensionPoint ext = apvmFacade.getApvmCascadeFilterExtensionPoint(vmType); + if (ext != null) { + vmsOfType = ext.filterApplianceVmCascade(vmsOfType, action, action.getParentIssuer(), l3uuids, + new ArrayList<>(), new ArrayList<>()); + } + toMigrateVms.addAll(vmsOfType); } + applianceVmVOS = toMigrateVms; } if (applianceVmVOS.isEmpty()) { @@ -788,12 +802,32 @@ public String call(L3NetworkInventory arg) { q.setParameter("l3Uuids", l3uuids); List apvms = q.getResultList(); if (!apvms.isEmpty()) { - for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { - apvms = ext.filterApplianceVmCascade(apvms, action, action.getParentIssuer(), l3uuids, - toDeleteNics, toDeleteIps); + List toDeleteVms = new ArrayList<>(); + List vmNics = new ArrayList<>(); + List ips = new ArrayList<>(); + Map> apvmsByType = apvms.stream() + .collect(Collectors.groupingBy(ApplianceVmVO::getApplianceVmType)); + + for (Map.Entry> entry : apvmsByType.entrySet()) { + ApplianceVmType vmType = ApplianceVmType.valueOf(entry.getKey()); + List vmsOfType = entry.getValue(); + + ApvmCascadeFilterExtensionPoint ext = apvmFacade.getApvmCascadeFilterExtensionPoint(vmType); + if (ext != null) { + vmsOfType = ext.filterApplianceVmCascade(vmsOfType, action, action.getParentIssuer(), l3uuids, + vmNics, ips); + if (!vmNics.isEmpty()) { + toDeleteNics.addAll(vmNics); + } + if (!ips.isEmpty()) { + toDeleteIps.addAll(ips); + } + } + toDeleteVms.addAll(vmsOfType); } - if (!apvms.isEmpty()) { - ret = ApplianceVmInventory.valueOf1(apvms); + + if (!toDeleteVms.isEmpty()) { + ret = ApplianceVmInventory.valueOf1(toDeleteVms); } } } else if (IpRangeVO.class.getSimpleName().equals(action.getParentIssuer())) { @@ -857,13 +891,32 @@ public List call() { } } } - for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { - vmvos = ext.filterApplianceVmCascade(vmvos, action, action.getParentIssuer(), ipruuids, - toDeleteNics, toDeleteIps); + + List toDeleteVms = new ArrayList<>(); + Map> vmvosByType = vmvos.stream() + .collect(Collectors.groupingBy(ApplianceVmVO::getApplianceVmType)); + + for (Map.Entry> entry : vmvosByType.entrySet()) { + ApplianceVmType vmType = ApplianceVmType.valueOf(entry.getKey()); + List vmsOfType = entry.getValue(); + List vmNics = new ArrayList<>(); + List ips = new ArrayList<>(); + ApvmCascadeFilterExtensionPoint ext = apvmFacade.getApvmCascadeFilterExtensionPoint(vmType); + if (ext != null) { + vmsOfType = ext.filterApplianceVmCascade(vmsOfType, action, action.getParentIssuer(), ipruuids, + vmNics, ips); + if (!vmNics.isEmpty()) { + toDeleteNics.addAll(vmNics); + } + if (!ips.isEmpty()) { + toDeleteIps.addAll(ips); + } + } + toDeleteVms.addAll(vmsOfType); } - if (!vmvos.isEmpty()) { - ret = ApplianceVmInventory.valueOf1(vmvos); + if (!toDeleteVms.isEmpty()) { + ret = ApplianceVmInventory.valueOf1(toDeleteVms); } } else if (AccountVO.class.getSimpleName().equals(action.getParentIssuer())) { final List auuids = CollectionUtils.transformToList((List) action.getParentIssuerContext(), new Function() { diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java index 1e23cf2e014..7aaa282d77d 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmConstant.java @@ -11,6 +11,7 @@ public class ApplianceVmConstant { public static final String SERVICE_ID = "applianceVm"; public static final String KVM_CHANNEL_AGENT_PATH = "/var/lib/zstack/kvm/agentSocket"; + public static final String KVM_CHANNEL_QEMU_GA_PATH = "/var/lib/libvirt/qemu"; public static final String ANSIBLE_PLAYBOOK_NAME = "appliancevm.py"; @@ -19,6 +20,8 @@ public class ApplianceVmConstant { public static final String APPLIANCE_VM_ABNORMAL_FILE_REPORT = "/appliancevm/abnormalfiles/report"; public static final String ABNORMAL_FILE_MAX_SIZE = "abnormalFileMaxSize"; + public static final String APPLIANCE_VM_CPUMODE = "cpuMode"; + public enum BootstrapParams { managementNic, additionalNics, diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java index 261c1ee638e..fa8411218ca 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacade.java @@ -43,4 +43,6 @@ public interface ApplianceVmFacade { void attachApplianceVmToHaGroup(String vmUuid, String haGroupUuid); void dettachVmInstanceFromAffinityGroup(String vmUuid); void detachVirtualRouterFromHaGroup(String vmUuid, String haGroupUuid); + + ApvmCascadeFilterExtensionPoint getApvmCascadeFilterExtensionPoint(ApplianceVmType applianceVmType); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java index 9ae61e10c78..9a415a48bfe 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmFacadeImpl.java @@ -40,15 +40,12 @@ import org.zstack.network.service.MtuGetter; import org.zstack.header.vm.hooks.VmInstanceAfterCreateHook; import org.zstack.header.vm.hooks.VmInstanceAfterDestroyHook; -import org.zstack.header.vm.hooks.VmInstanceBeforeCreateHook; import org.zstack.header.vm.hooks.VmInstanceBeforeDestroyHook; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; -import org.zstack.utils.zsha2.ZSha2Helper; -import org.zstack.utils.zsha2.ZSha2Info; import javax.persistence.Query; import java.util.*; @@ -88,6 +85,7 @@ public class ApplianceVmFacadeImpl extends AbstractService implements ApplianceV private FlowChainBuilder createApplianceVmWorkFlowBuilder; private Map bootstrapInfoFlowFactories = new HashMap(); private Map l2NetworkGetVniExtensionPointMap = new HashMap<>(); + private Map apvmCascadeFilterExtensionPointMap = new HashMap<>(); private String OWNER = String.format("ApplianceVm.%s", Platform.getManagementServerId()); @@ -224,6 +222,18 @@ private void populateExtensions() { l2NetworkGetVniExtensionPointMap.put(ext.getL2NetworkVniType(), ext); logger.debug(String.format("add new l2NetworkGetVniExtensionPoint, %s: %s", ext.getL2NetworkVniType(), ext.getClass().getCanonicalName())); } + + for (ApvmCascadeFilterExtensionPoint ext : pluginRgty.getExtensionList(ApvmCascadeFilterExtensionPoint.class)) { + ApplianceVmType type = ext.getApplianceVmType(); + ApvmCascadeFilterExtensionPoint old = apvmCascadeFilterExtensionPointMap.get(type); + if (old != null) { + throw new CloudRuntimeException(String.format("two extensions[%s, %s] declare ApvmCascadeFilterExtensionPoint for appliance vm type[%s]", old.getClass().getName(), ext.getClass().getName(), type)); + } + + apvmCascadeFilterExtensionPointMap.put(type, ext); + logger.debug(String.format("add new apvmCascadeFilterExtensionPoint, %s: %s", type, ext.getClass().getCanonicalName())); + + } } private void deployAnsible() { @@ -627,4 +637,8 @@ public void detachVirtualRouterFromHaGroup(String vmUuid, String haGroupUuid) { ext.detachVirtualRouterFromHaGroup(vmUuid, haGroupUuid); } } + + public ApvmCascadeFilterExtensionPoint getApvmCascadeFilterExtensionPoint(ApplianceVmType type) { + return apvmCascadeFilterExtensionPointMap.get(type); + } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java index 536ff50dcf7..6658e2608fe 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmGlobalProperty.java @@ -11,7 +11,7 @@ public class ApplianceVmGlobalProperty { public static boolean NO_ROLLBACK_ON_POST_FAILURE; @GlobalProperty(name = "ApplianceVm.connectVerbose", defaultValue = "false") public static boolean CONNECT_VERBOSE; - @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.2.0.tar.gz") + @GlobalProperty(name="ApplianceVm.agentPackageName", defaultValue = "appliancevm-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="ApplianceVm.agentPort", defaultValue = "7759") public static int AGENT_PORT; diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java index de36360860d..35deb659c11 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmKvmBackend.java @@ -27,14 +27,24 @@ public void addAddon(KVMHostInventory host, VmInstanceSpec spec, KVMAgentCommand } KVMAddons.Channel chan = new KVMAddons.Channel(); + KVMAddons.Channel chan_vr = new KVMAddons.Channel(); cmd.setEmulateHyperV(false); + chan.setSocketPath(makeChannelSocketPath(spec.getVmInventory().getUuid())); chan.setTargetName("applianceVm.vport"); cmd.getAddons().put(KVMAddons.Channel.NAME, chan); logger.debug(String.format("make kvm channel device[path:%s, target:%s]", chan.getSocketPath(), chan.getTargetName())); + + chan_vr.setSocketPath(makeChannelVRSocketPath(spec.getVmInventory().getUuid())); + chan_vr.setTargetName("org.qemu.guest_agent.0"); // this channel name must keep org.qemu.guest_agent to use qemu-ga + cmd.getAddons().put(KVMAddons.Channel.VR_NAME, chan_vr); + logger.debug(String.format("make kvm channel device[path:%s, target:%s]", chan_vr.getSocketPath(), chan_vr.getTargetName())); } public String makeChannelSocketPath(String apvmuuid) { return PathUtil.join(ApplianceVmConstant.KVM_CHANNEL_AGENT_PATH, String.format("applianceVm.%s", apvmuuid)); } + private String makeChannelVRSocketPath(String apvmuuid) { + return PathUtil.join(ApplianceVmConstant.KVM_CHANNEL_QEMU_GA_PATH, apvmuuid); + } } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java index ea511d8cb56..354a68e340c 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmPriorityUpgradeConfigExtensionPoint.java @@ -1,13 +1,12 @@ package org.zstack.appliancevm; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.compute.vm.VmPriorityGlobalProperty; +import org.zstack.compute.vm.VmGlobalProperty; import org.zstack.compute.vm.VmPriorityOperator; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.*; import org.zstack.core.db.Q; import org.zstack.header.Component; -import org.zstack.header.core.NopeNoErrorCompletion; import org.zstack.header.core.NopeWhileDoneCompletion; import org.zstack.header.core.WhileCompletion; import org.zstack.header.errorcode.ErrorCode; @@ -103,7 +102,7 @@ public void run(MessageReply reply) { } private void initRunningApplianceVmPriority() { - if (!VmPriorityGlobalProperty.initRunningApplianceVmPriority) { + if (!VmGlobalProperty.initRunningApplianceVmPriority) { return; } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java index 5c865dfb25a..363036b4650 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmStatus.java @@ -5,5 +5,6 @@ public enum ApplianceVmStatus { Connecting, Connected, - Disconnected + Disconnected, + Destroying } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java index b2efff75d25..f6433296b5e 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSyncConfigToHaGroupFlow.java @@ -42,6 +42,7 @@ public void run(final FlowTrigger chain, Map data) { List exps = pluginRgty.getExtensionList(ApplianceVmSyncConfigToHaGroupExtensionPoint.class); if (exps == null || exps.isEmpty()) { + logger.debug(String.format("there is no exp for ApplianceVmSyncConfigToHaGroupExtensionPoint")); chain.next(); return; } @@ -50,11 +51,13 @@ public void run(final FlowTrigger chain, Map data) { if (spec.getMessage() instanceof APIStartVmInstanceMsg) { systemTags = ((APIStartVmInstanceMsg)spec.getMessage()).getSystemTags(); } else { + logger.debug("msg is not APIStartVmInstanceMsg"); chain.next(); return; } if (systemTags == null || systemTags.isEmpty()) { + logger.debug("there is no systemTags"); chain.next(); return; } @@ -63,6 +66,7 @@ public void run(final FlowTrigger chain, Map data) { ApplianceVmVO applianceVmVO = dbf.findByUuid(inv.getUuid(), ApplianceVmVO.class); /* only handle first join ha group */ if (applianceVmVO.isHaEnabled()) { + logger.debug(String.format("applianceVm[uuid:%s] is in hastatus", inv.getUuid())); chain.next(); return; } @@ -77,6 +81,7 @@ public void run(final FlowTrigger chain, Map data) { haUuid = token.get(ApplianceVmSystemTags.APPLIANCEVM_HA_UUID_TOKEN); } if (haUuid == null) { + logger.debug(String.format("there is not ha group uuid")); chain.next(); return; } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java index d04a9eb52c8..4dafb10c8ba 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApplianceVmSystemTags.java @@ -2,6 +2,7 @@ import org.zstack.header.tag.TagDefinition; import org.zstack.tag.PatternedSystemTag; +import org.zstack.tag.SystemTag; /** * Created by shixin on 2019/06/11 @@ -22,4 +23,7 @@ public class ApplianceVmSystemTags { public static String APPLIANCEVM_STATIC_IP_L3_TOKEN = "l3Uuid"; public static PatternedSystemTag APPLIANCEVM_STATIC_IP = new PatternedSystemTag(String.format( "staticIp::{%s}::{%s}", APPLIANCEVM_STATIC_IP_L3_TOKEN, APPLIANCEVM_STATIC_IP_TOKEN), ApplianceVmVO.class); + + public static SystemTag APPLIANCEVM_DEPLOY_AGENT_ON_START = + new SystemTag("needDeployAgentOnStart", ApplianceVmVO.class); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java index be9ab31b221..cd6d8903599 100644 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/ApvmCascadeFilterExtensionPoint.java @@ -3,16 +3,35 @@ import org.zstack.core.cascade.CascadeAction; import org.zstack.header.network.l3.UsedIpInventory; import org.zstack.header.vm.VmNicInventory; -import org.zstack.network.service.vip.VipInventory; import java.util.List; /** + * Appliance VM cascade deletion filter extension point - Factory pattern + * Each implementation handles cascade deletion logic for specific appliance VM type + * * Created by weiwang on 22/10/2017 */ public interface ApvmCascadeFilterExtensionPoint { + /** + * Filter appliance VMs that need to be cascade deleted + * + * @param applianceVmVOS appliance VM list to process + * @param action cascade action + * @param parentIssuer parent resource type + * @param parentIssuerUuids parent resource UUID list + * @param toDeleteNics nics to be deleted (output parameter) + * @param toDeleteIps IPs to be deleted (output parameter) + * @return filtered VM list to delete + */ List filterApplianceVmCascade(List applianceVmVOS, CascadeAction action, String parentIssuer, List parentIssuerUuids, List toDeleteNics, List toDeleteIps); + + /** + * Check if this factory supports the specified appliance VM type + * @return true if supported, false otherwise + */ + ApplianceVmType getApplianceVmType(); } diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java index db42d420500..f25d80f4818 100755 --- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java +++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/CreateApplianceVmJob.java @@ -145,6 +145,12 @@ protected ApplianceVmVO scripts() { rc.updateValue(finalAvo1.getUuid(), Boolean.TRUE.toString()); } + String cpuMode = spec.getExtensionData(ApplianceVmConstant.APPLIANCE_VM_CPUMODE, String.class); + if (cpuMode != null) { + ResourceConfig rc = rcf.getResourceConfig(KVMGlobalConfig.NESTED_VIRTUALIZATION.getIdentity()); + rc.updateValue(finalAvo1.getUuid(), cpuMode); + } + return reload(vo); } }.execute(); diff --git a/plugin/cbd/pom.xml b/plugin/cbd/pom.xml index fba1a93b15c..cdd77c86b4b 100644 --- a/plugin/cbd/pom.xml +++ b/plugin/cbd/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 cbd diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java index 7e44395645f..c08f5c37c66 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/AddonInfo.java @@ -1,5 +1,6 @@ package org.zstack.cbd; +import java.util.ArrayList; import java.util.List; /** @@ -7,7 +8,17 @@ * @date 2024/4/1 18:12 */ public class AddonInfo { - public List mdsInfos; + private ClusterInfo clusterInfo; + private List mdsInfos = new ArrayList<>(); + private List logicalPoolInfos = new ArrayList<>(); + + public ClusterInfo getClusterInfo() { + return clusterInfo; + } + + public void setClusterInfo(ClusterInfo clusterInfo) { + this.clusterInfo = clusterInfo; + } public List getMdsInfos() { return mdsInfos; @@ -16,4 +27,12 @@ public List getMdsInfos() { public void setMdsInfos(List mdsInfos) { this.mdsInfos = mdsInfos; } + + public List getLogicalPoolInfos() { + return logicalPoolInfos; + } + + public void setLogicalPoolInfos(List logicalPoolInfos) { + this.logicalPoolInfos = logicalPoolInfos; + } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java new file mode 100644 index 00000000000..6907f7e7e0a --- /dev/null +++ b/plugin/cbd/src/main/java/org/zstack/cbd/ClusterInfo.java @@ -0,0 +1,26 @@ +package org.zstack.cbd; + +/** + * @author Xingwei Yu + * @date 2025/8/8 14:03 + */ +public class ClusterInfo { + private String uuid; + private String version; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java new file mode 100644 index 00000000000..8725ca0aaa3 --- /dev/null +++ b/plugin/cbd/src/main/java/org/zstack/cbd/LogicalPoolInfo.java @@ -0,0 +1,173 @@ +package org.zstack.cbd; + +/** + * @author Xingwei Yu + * @date 2025/1/7 13:17 + */ +public class LogicalPoolInfo { + private long physicalPoolID; + private RedundanceAndPlaceMentPolicy redundanceAndPlaceMentPolicy; + private long logicalPoolID; + private long usedSize; + private long quota; + private long createTime; + private int type; + private long rawWalUsedSize; + private int allocateStatus; + private long rawUsedSize; + private String physicalPoolName; + private long capacity; + private String logicalPoolName; + private String userPolicy; + private long allocatedSize; + + public long getPhysicalPoolID() { + return physicalPoolID; + } + + public void setPhysicalPoolID(long physicalPoolID) { + this.physicalPoolID = physicalPoolID; + } + + public RedundanceAndPlaceMentPolicy getRedundanceAndPlaceMentPolicy() { + return redundanceAndPlaceMentPolicy; + } + + public void setRedundanceAndPlaceMentPolicy(RedundanceAndPlaceMentPolicy redundanceAndPlaceMentPolicy) { + this.redundanceAndPlaceMentPolicy = redundanceAndPlaceMentPolicy; + } + + public long getLogicalPoolID() { + return logicalPoolID; + } + + public void setLogicalPoolID(long logicalPoolID) { + this.logicalPoolID = logicalPoolID; + } + + public long getUsedSize() { + return usedSize; + } + + public void setUsedSize(long usedSize) { + this.usedSize = usedSize; + } + + public long getQuota() { + return quota; + } + + public void setQuota(long quota) { + this.quota = quota; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public long getRawWalUsedSize() { + return rawWalUsedSize; + } + + public void setRawWalUsedSize(long rawWalUsedSize) { + this.rawWalUsedSize = rawWalUsedSize; + } + + public int getAllocateStatus() { + return allocateStatus; + } + + public void setAllocateStatus(int allocateStatus) { + this.allocateStatus = allocateStatus; + } + + public long getRawUsedSize() { + return rawUsedSize; + } + + public void setRawUsedSize(long rawUsedSize) { + this.rawUsedSize = rawUsedSize; + } + + public String getPhysicalPoolName() { + return physicalPoolName; + } + + public void setPhysicalPoolName(String physicalPoolName) { + this.physicalPoolName = physicalPoolName; + } + + public long getCapacity() { + return capacity; + } + + public void setCapacity(long capacity) { + this.capacity = capacity; + } + + public String getLogicalPoolName() { + return logicalPoolName; + } + + public void setLogicalPoolName(String logicalPoolName) { + this.logicalPoolName = logicalPoolName; + } + + public String getUserPolicy() { + return userPolicy; + } + + public void setUserPolicy(String userPolicy) { + this.userPolicy = userPolicy; + } + + public long getAllocatedSize() { + return allocatedSize; + } + + public void setAllocatedSize(long allocatedSize) { + this.allocatedSize = allocatedSize; + } + + public static class RedundanceAndPlaceMentPolicy { + private int copysetNum; + private int replicaNum; + private int zoneNum; + + public int getCopysetNum() { + return copysetNum; + } + + public void setCopysetNum(int copysetNum) { + this.copysetNum = copysetNum; + } + + public int getReplicaNum() { + return replicaNum; + } + + public void setReplicaNum(int replicaNum) { + this.replicaNum = replicaNum; + } + + public int getZoneNum() { + return zoneNum; + } + + public void setZoneNum(int zoneNum) { + this.zoneNum = zoneNum; + } + } +} diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java index d35182c76c9..a41fff09303 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsInfo.java @@ -1,71 +1,81 @@ package org.zstack.cbd; +import java.util.Objects; + /** * @author Xingwei Yu * @date 2024/4/10 23:18 */ public class MdsInfo { - public String sshUsername; - public String sshPassword; - public int sshPort = 22; - public String mdsAddr; - public int mdsPort = 6666; - public MdsStatus mdsStatus; - public String mdsVersion; - - public String getSshUsername() { - return sshUsername; + private String username; + private String password; + private int port = 22; + private String addr; + private String externalAddr; + private MdsStatus status; + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + + MdsInfo other = (MdsInfo) obj; + return Objects.equals(addr, other.addr) && + Objects.equals(port, other.port) && + Objects.equals(username, other.username) && + Objects.equals(password, other.password); } - public void setSshUsername(String sshUsername) { - this.sshUsername = sshUsername; + @Override + public int hashCode() { + return Objects.hash(addr, port, username, password); } - public String getSshPassword() { - return sshPassword; + public String getUsername() { + return username; } - public void setSshPassword(String sshPassword) { - this.sshPassword = sshPassword; + public void setUsername(String username) { + this.username = username; } - public String getMdsAddr() { - return mdsAddr; + public String getPassword() { + return password; } - public void setMdsAddr(String mdsAddr) { - this.mdsAddr = mdsAddr; + public void setPassword(String password) { + this.password = password; } - public int getSshPort() { - return sshPort; + public int getPort() { + return port; } - public void setSshPort(int sshPort) { - this.sshPort = sshPort; + public void setPort(int port) { + this.port = port; } - public int getMdsPort() { - return mdsPort; + public String getAddr() { + return addr; } - public void setMdsPort(int mdsPort) { - this.mdsPort = mdsPort; + public void setAddr(String addr) { + this.addr = addr; } - public MdsStatus getMdsStatus() { - return mdsStatus; + public String getExternalAddr() { + return externalAddr; } - public void setMdsStatus(MdsStatus mdsStatus) { - this.mdsStatus = mdsStatus; + public void setExternalAddr(String externalAddr) { + this.externalAddr = externalAddr; } - public String getMdsVersion() { - return mdsVersion; + public MdsStatus getStatus() { + return status; } - public void setMdsVersion(String mdsVersion) { - this.mdsVersion = mdsVersion; + public void setStatus(MdsStatus status) { + this.status = status; } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java b/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java index 11141eabcb5..9fef3451b01 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/MdsUri.java @@ -11,6 +11,7 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; /** @@ -21,8 +22,8 @@ public class MdsUri { private String hostname; private int mdsPort = DEFAULT_MDS_PORT; private int sshPort = DEFAULT_SSH_PORT; - private String sshUsername; - private String sshPassword; + private String username; + private String password; private static final String MDS_URL_FORMAT = "sshUsername:sshPassword@hostname:[sshPort]/?[mdsPort=]"; private static final Integer DEFAULT_MDS_PORT = 6666; @@ -56,36 +57,38 @@ public MdsUri(String url) { try { int at = url.lastIndexOf("@"); if (at == -1) { - throw new OperationFailureException(errorCode(String.format("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + - " in format of %s", url, MDS_URL_FORMAT))); + throw new OperationFailureException(operr("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + + " in format of %s", url, MDS_URL_FORMAT)); } String userInfo = url.substring(0, at); if (!userInfo.contains(":")) { - throw new OperationFailureException(errorCode(String.format("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + - " in format of %s", url, MDS_URL_FORMAT))); + throw new OperationFailureException(operr("invalid mdsUrl[%s], the sshUsername:sshPassword part is invalid. A valid mdsUrl is" + + " in format of %s", url, MDS_URL_FORMAT)); } - String rest = url.substring(at+1, url.length()); - String[] ssh = userInfo.split(":"); - sshUsername = ssh[0]; - sshPassword = ssh[1]; + String rest = url.substring(at+1); + String[] ssh = userInfo.split(":", 2); + if (ssh.length != 2 || ssh[0].isEmpty() || ssh[1].isEmpty()) { + throw new OperationFailureException(operr("invalid mdsUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MDS_URL_FORMAT)); + } + + username = ssh[0]; + password = ssh[1]; URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); if (hostname == null) { - throw new OperationFailureException(errorCode( - String.format("invalid mdsUrl[%s], hostname cannot be null. A valid mdsUrl is" + + throw new OperationFailureException(operr("invalid mdsUrl[%s], hostname cannot be null. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT) - )); + ); } sshPort = uri.getPort() == -1 ? sshPort : uri.getPort(); if (sshPort < 1 || sshPort > 65535) { - throw new OperationFailureException(errorCode( - String.format("invalid mdsUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid mdsUrl is" + + throw new OperationFailureException(operr("invalid mdsUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid mdsUrl is" + " in format of %s", url, MDS_URL_FORMAT) - )); + ); } String v = getQueryValue(uri, CbdConstants.MDS_PARAM_MDS_PORT); mdsPort = v == null ? mdsPort : Integer.parseInt(v); @@ -110,20 +113,20 @@ public void setMdsPort(int mdsPort) { this.mdsPort = mdsPort; } - public String getSshUsername() { - return sshUsername; + public String getUsername() { + return username; } - public void setSshUsername(String sshUsername) { - this.sshUsername = sshUsername; + public void setUsername(String username) { + this.username = username; } - public String getSshPassword() { - return sshPassword; + public String getPassword() { + return password; } - public void setSshPassword(String sshPassword) { - this.sshPassword = sshPassword; + public void setPassword(String password) { + this.password = password; } public int getSshPort() { diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java index 22d9cdbd38d..52653a0bc40 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdCommands.java @@ -10,8 +10,9 @@ * @date 2024/4/10 15:40 */ public class KvmCbdCommands { - public static final String CBD_CONFIGURE_CLIENT_PATH = "/cbd/configure/client"; - public static final String CBD_SETUP_SELF_FENCER_PATH = "/ha/cbd/setupselffencer"; + public static final String SETUP_CBD_SELF_FENCER_PATH = "/ha/cbd/setupselffencer"; + public static final String CANCEL_CBD_SELF_FENCER_PATH = "/ha/cbd/cancelselffencer"; + public static final String CBD_CHECK_VMSTATE_PATH = "/cbd/check/vmstate"; public static class AgentRsp { public boolean success = true; @@ -19,7 +20,7 @@ public static class AgentRsp { } public static class KvmUpdateClientConfCmd extends AgentCmd { - public List mdsInfos; + private List mdsInfos; public List getMdsInfos() { return mdsInfos; @@ -43,6 +44,9 @@ public static class KvmSetupSelfFencerCmd extends AgentCmd { public List fencers; } + public static class KvmCancelSelfFencerCmd extends AgentCmd { + } + public static class AgentCmd extends KVMAgentCommands.AgentCommand { public String uuid; } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index 3b431ab3774..006d7260547 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -1,16 +1,15 @@ package org.zstack.cbd.kvm; -import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.cbd.AddonInfo; -import org.zstack.cbd.CbdConstants; -import org.zstack.cbd.MdsInfo; +import org.zstack.cbd.kvm.KvmCbdCommands.AgentRsp; +import org.zstack.cbd.kvm.KvmCbdCommands.KvmSetupSelfFencerCmd; +import org.zstack.cbd.kvm.KvmCbdCommands.KvmCancelSelfFencerCmd; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; -import org.zstack.externalStorage.primary.ExternalStorageConstant; import org.zstack.header.Component; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; @@ -20,25 +19,21 @@ import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.message.MessageReply; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO; import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO_; import org.zstack.header.volume.VolumeProtocol; import org.zstack.kvm.KVMAgentCommands; import org.zstack.kvm.KVMHostAsyncHttpCallMsg; import org.zstack.kvm.KVMHostAsyncHttpCallReply; import org.zstack.kvm.KvmSetupSelfFencerExtensionPoint; +import org.zstack.storage.addon.primary.ExternalHostIdGetter; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; -import org.zstack.cbd.kvm.KvmCbdCommands.AgentRsp; -import org.zstack.cbd.kvm.KvmCbdCommands.KvmSetupSelfFencerCmd; -import org.zstack.cbd.kvm.KvmCbdCommands.KvmUpdateClientConfCmd; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; -import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import static org.zstack.core.Platform.operr; @@ -84,30 +79,13 @@ public void kvmSetupSelfFencer(KvmSetupSelfFencerParam param, Completion complet @Override public void setup() { flow(new NoRollbackFlow() { - final String __name__ = "configure-cbd-client-on-kvm"; + final String __name__ = "deploy-client"; @Override public void run(FlowTrigger trigger, Map data) { - ExternalPrimaryStorageVO vo = dbf.findByUuid(param.getPrimaryStorage().getUuid(), ExternalPrimaryStorageVO.class); - if (vo == null) { - trigger.fail(operr("not found primary storage[uuid:%s].", param.getPrimaryStorage().getUuid())); - return; - } - - KvmUpdateClientConfCmd cmd = new KvmUpdateClientConfCmd(); - AddonInfo addonInfo = StringUtils.isEmpty(vo.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(vo.getAddonInfo(), AddonInfo.class); - List mdsInfos = new ArrayList<>(); - for (MdsInfo mdsInfo : addonInfo.getMdsInfos()) { - MdsInfo info = new MdsInfo(); - info.mdsAddr = mdsInfo.mdsAddr; - info.mdsPort = mdsInfo.mdsPort; - mdsInfos.add(info); - } - cmd.setMdsInfos(mdsInfos); - - httpCall(KvmCbdCommands.CBD_CONFIGURE_CLIENT_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { + nodeSvc.deployClient(host, new Completion(trigger) { @Override - public void success(AgentRsp returnValue) { + public void success() { trigger.next(); } @@ -144,6 +122,15 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { + ExternalPrimaryStorageHostRefVO ref = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, param.getHostUuid()) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, param.getPrimaryStorage().getUuid()) + .find(); + if (ref == null || ref.getHostId() == 0) { + logger.warn(String.format("not found hostId for hostUuid[%s] and primaryStorageUuid[%s]", param.getHostUuid(), param.getPrimaryStorage().getUuid())); + ref = new ExternalHostIdGetter(999).getOrAllocateHostIdRef(param.getHostUuid(), param.getPrimaryStorage().getUuid()); + } + KvmSetupSelfFencerCmd cmd = new KvmSetupSelfFencerCmd(); cmd.interval = param.getInterval(); cmd.maxAttempts = param.getMaxAttempts(); @@ -152,11 +139,11 @@ public void run(FlowTrigger trigger, Map data) { cmd.storageCheckerTimeout = param.getStorageCheckerTimeout(); cmd.heartbeatRequiredSpace = heartbeatVol.getHeartbeatRequiredSpace(); cmd.hostUuid = param.getHostUuid(); + cmd.hostId = ref.getHostId(); cmd.strategy = param.getStrategy(); cmd.uuid = param.getPrimaryStorage().getUuid(); cmd.fencers = param.getFencers(); - - httpCall(KvmCbdCommands.CBD_SETUP_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { + httpCall(KvmCbdCommands.SETUP_CBD_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(AgentRsp returnValue) { trigger.next(); @@ -189,7 +176,19 @@ public void handle(ErrorCode errCode, Map data) { @Override public void kvmCancelSelfFencer(KvmCancelSelfFencerParam param, Completion completion) { + KvmCancelSelfFencerCmd cmd = new KvmCancelSelfFencerCmd(); + cmd.uuid = param.getPrimaryStorage().getUuid(); + httpCall(KvmCbdCommands.CANCEL_CBD_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(AgentRsp rsp) { + completion.success(); + } + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); } protected void httpCall(String path, final String hostUuid, KVMAgentCommands.AgentCommand cmd, final Class respType, final ReturnValueCompletion completion) { diff --git a/plugin/ceph/pom.xml b/plugin/ceph/pom.xml index 28729b1e5de..4bf8fde202f 100755 --- a/plugin/ceph/pom.xml +++ b/plugin/ceph/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java index 5c74a79266f..4219f67cc33 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/CephGlobalProperty.java @@ -18,13 +18,13 @@ public class CephGlobalProperty { public static String PRIMARY_STORAGE_AGENT_URL_ROOT_PATH; @GlobalProperty(name="Ceph.primaryStorageAgent.port", defaultValue = "7762") public static int PRIMARY_STORAGE_AGENT_PORT; - @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.2.0.tar.gz") + @GlobalProperty(name="Ceph.backupStorage.agentPackageName", defaultValue = "cephbackupstorage-5.4.0.tar.gz") public static String BACKUP_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.backupStorage.ansiblePlaybook", defaultValue = "cephb.py") public static String BACKUP_STORAGE_PLAYBOOK_NAME; @GlobalProperty(name="Ceph.backupStorage.ansibleModulePath", defaultValue = "ansible/cephb") public static String BACKUP_STORAGE_MODULE_PATH; - @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.2.0.tar.gz") + @GlobalProperty(name="Ceph.primaryStorage.agentPackageName", defaultValue = "cephprimarystorage-5.4.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name="Ceph.primaryStorage.ansiblePlaybook", defaultValue = "cephp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java index c15efe2cc76..b60166d657c 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/MonUri.java @@ -11,6 +11,7 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; import static org.zstack.utils.CollectionDSL.list; /** @@ -62,36 +63,38 @@ public MonUri(String url) { try { int at = url.lastIndexOf("@"); if (at == -1) { - throw new OperationFailureException(errorCode(String.format("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + - " in format of %s", url, MON_URL_FORMAT))); + throw new OperationFailureException(operr("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + + " in format of %s", url, MON_URL_FORMAT)); } String userInfo = url.substring(0, at); if (!userInfo.contains(":")) { - throw new OperationFailureException(errorCode(String.format("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + - " in format of %s", url, MON_URL_FORMAT))); + throw new OperationFailureException(operr("invalid monUrl[%s], the sshUsername:sshPassword part is invalid. A valid monUrl is" + + " in format of %s", url, MON_URL_FORMAT)); + } + + String rest = url.substring(at+1); + String[] ssh = userInfo.split(":", 2); + if (ssh.length != 2 || ssh[0].isEmpty() || ssh[1].isEmpty()) { + throw new OperationFailureException(operr("invalid monUrl[%s]. SSH username and password must be separated by ':' and cannot be empty. A valid monUrl format is %s", url, MON_URL_FORMAT)); } - String rest = url.substring(at+1, url.length()); - String[] ssh = userInfo.split(":"); sshUsername = ssh[0]; sshPassword = ssh[1]; URI uri = new URI(String.format("ssh://%s", rest)); hostname = uri.getHost(); if (hostname == null) { - throw new OperationFailureException(errorCode( - String.format("invalid monUrl[%s], hostname cannot be null. A valid monUrl is" + + throw new OperationFailureException(operr("invalid monUrl[%s], hostname cannot be null. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT) - )); + ); } sshPort = uri.getPort() == -1 ? sshPort : uri.getPort(); if (sshPort < 1 || sshPort > 65535) { - throw new OperationFailureException(errorCode( - String.format("invalid monUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid monUrl is" + + throw new OperationFailureException(operr("invalid monUrl[%s], the ssh port is greater than 65535 or smaller than 1. A valid monUrl is" + " in format of %s", url, MON_URL_FORMAT) - )); + ); } String v = getQueryValue(uri, CephConstants.MON_PARAM_MON_PORT); monPort = v == null ? monPort : Integer.parseInt(v); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java index 3b6ee13a97c..9dba4c22ad4 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java @@ -1225,7 +1225,8 @@ protected void handle(GetLocalFileSizeOnBackupStorageMsg msg) { GetLocalFileSizeOnBackupStorageReply reply = new GetLocalFileSizeOnBackupStorageReply(); GetLocalFileSizeCmd cmd = new GetLocalFileSizeCmd(); cmd.path = msg.getUrl(); - httpCall(GET_LOCAL_FILE_SIZE, cmd, GetLocalFileSizeRsp.class, new ReturnValueCompletion(msg) { + String apiId = ThreadContext.get(Constants.THREAD_CONTEXT_API); + new HttpCaller<>(GET_LOCAL_FILE_SIZE, cmd, GetLocalFileSizeRsp.class, new ReturnValueCompletion(msg) { @Override public void fail(ErrorCode err) { reply.setError(err); @@ -1237,7 +1238,7 @@ public void success(GetLocalFileSizeRsp ret) { reply.setSize(ret.size); bus.reply(msg, reply); } - }); + }).tryNext().specifyOrder(apiId).call(); } @Override diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java new file mode 100644 index 00000000000..4d09485cd95 --- /dev/null +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeChainGC.java @@ -0,0 +1,61 @@ +package org.zstack.storage.ceph.primary; + +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.gc.GC; +import org.zstack.core.gc.GCCompletion; +import org.zstack.core.gc.TimeBasedGarbageCollector; +import org.zstack.header.message.MessageReply; +import org.zstack.header.storage.primary.DeleteVolumeChainOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.DeleteVolumeChainOnPrimaryStorageReply; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.List; + +public class CephDeleteVolumeChainGC extends TimeBasedGarbageCollector { + @GC + public String primaryStorageUuid; + @GC + public List installPaths; + @GC + public String chainTop; + + private static final CLogger logger = Utils.getLogger(CephDeleteVolumeChainGC.class); + + @Override + protected void triggerNow(GCCompletion completion) { + if (!dbf.isExist(primaryStorageUuid, PrimaryStorageVO.class) || CollectionUtils.isEmpty(installPaths)) { + completion.cancel(); + return; + } + + DeleteVolumeChainOnPrimaryStorageMsg msg = new DeleteVolumeChainOnPrimaryStorageMsg(); + msg.setPrimaryStorageUuid(primaryStorageUuid); + msg.setChainTop(chainTop); + msg.setInstallPaths(installPaths); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, primaryStorageUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + DeleteVolumeChainOnPrimaryStorageReply r = reply.castReply(); + if (CollectionUtils.isEmpty(r.getUndeletedInstallPaths())) { + completion.success(); + } else { + installPaths = r.getUndeletedInstallPaths(); + updateContext(); + completion.fail(Platform.operr("delete volume chain error, continue to delete")); + } + } + }); + } +} + diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java index 45df50b4ad6..33f5fdf0a6c 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephDeleteVolumeGC.java @@ -12,6 +12,7 @@ import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.volume.VolumeInventory; import org.zstack.storage.volume.VolumeErrors; +import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -46,7 +47,7 @@ protected void triggerNow(GCCompletion completion) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE)) { + if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE) && !VolumeSystemTags.FAST_REVERT.hasTag(volume.getUuid())) { logger.warn(String.format("unable to delete path:%s right now, cancel this GC job because it's in use", msg.getInstallPath())); completion.cancel(); return; diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java index ed35ef32043..81cec9a040c 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephImageCacheCleaner.java @@ -7,6 +7,7 @@ import org.zstack.header.storage.primary.ImageCacheVO; import org.zstack.storage.ceph.CephConstants; import org.zstack.storage.ceph.CephGlobalConfig; +import org.zstack.storage.primary.ImageCacheCleanParam; import org.zstack.storage.primary.ImageCacheCleaner; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -32,8 +33,8 @@ protected GlobalConfig cleanupIntervalConfig() { @Transactional @Override - protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid) { - List staleImageCacheIds = getStaleImageCacheIds(psUuid); + protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid, ImageCacheCleanParam param) { + List staleImageCacheIds = getStaleImageCacheIds(psUuid, false); if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { return null; } diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java index 8ef87175bbe..6579e941392 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java @@ -72,14 +72,14 @@ import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase.PingOperationFailure; import org.zstack.storage.ceph.primary.capacity.CephOsdGroupCapacityHelper; import org.zstack.storage.primary.*; +import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC; +import org.zstack.storage.snapshot.VolumeSnapshotGlobalConfig; import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.tag.SystemTag; import org.zstack.tag.SystemTagCreator; -import org.zstack.utils.CollectionDSL; -import org.zstack.utils.CollectionUtils; -import org.zstack.utils.DebugUtils; -import org.zstack.utils.Utils; +import org.zstack.tag.TagManager; +import org.zstack.utils.*; import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -121,6 +121,8 @@ public class CephPrimaryStorageBase extends PrimaryStorageBase { private PoolUsageReport poolUsageCollector; @Autowired protected PrimaryStoragePhysicalCapacityManager psPhysicalCapacityMgr; + @Autowired + private TagManager tagMgr; public CephPrimaryStorageBase() { @@ -370,6 +372,7 @@ public static class CreateEmptyVolumeCmd extends AgentCommand { long size; boolean shareable; boolean skipIfExisting; + String format = VolumeConstant.VOLUME_FORMAT_RAW; public boolean isShareable() { return shareable; @@ -402,6 +405,14 @@ public void setSkipIfExisting(boolean skipIfExisting) { public boolean isSkipIfExisting() { return skipIfExisting; } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } } public static class CreateEmptyVolumeRsp extends AgentResponse { @@ -1017,6 +1028,7 @@ public static class DeleteVolumeChainCmd extends AgentCommand { } public static class DeleteVolumeChainRsp extends AgentResponse { + public List undeletedInstallPaths; } public static class CleanTrashCmd extends AgentCommand { @@ -1745,9 +1757,10 @@ private void createEmptyVolume(final InstantiateVolumeOnPrimaryStorageMsg msg) { cmd.size = msg.getVolume().getSize(); cmd.setShareable(msg.getVolume().isShareable()); cmd.skipIfExisting = msg.isSkipIfExisting(); + cmd.format = msg.hasSystemTag(VolumeSystemTags.FORMAT_QCOW2.getTagFormat()) ? VolumeConstant.VOLUME_FORMAT_QCOW2 : VolumeConstant.VOLUME_FORMAT_RAW ; final InstantiateVolumeOnPrimaryStorageReply reply = new InstantiateVolumeOnPrimaryStorageReply(); - + httpCall(CREATE_VOLUME_PATH, cmd, CreateEmptyVolumeRsp.class, new ReturnValueCompletion(msg) { @Override public void fail(ErrorCode err) { @@ -1824,6 +1837,7 @@ public void run(MessageReply reply) { logger.info(String.format("Deleted volume %s in Trash.", inv.getInstallPath())); } else { logger.warn(String.format("Failed to delete volume %s in Trash.", inv.getInstallPath())); + submitCephDeleteVolumeGC(inv, self); } trigger.next(); } @@ -1919,6 +1933,7 @@ public void run(MessageReply reply) { logger.info(String.format("Deleted volume %s in Trash.", inv.getInstallPath())); } else { logger.warn(String.format("Failed to delete volume %s in Trash.", inv.getInstallPath())); + submitCephDeleteVolumeGC(inv, self); } trigger.next(); } @@ -1959,6 +1974,18 @@ public void done(ErrorCodeList errorCodeList) { }); } + private void submitCephDeleteVolumeGC(InstallPathRecycleInventory inv, PrimaryStorageVO self) { + CephDeleteVolumeGC gc = new CephDeleteVolumeGC(); + gc.NAME = String.format("gc-ceph-%s-volume-path-%s", self.getUuid(), inv.getInstallPath()); + gc.primaryStorageUuid = self.getUuid(); + VolumeInventory volume = new VolumeInventory(); + volume.setUuid(inv.getResourceUuid()); + volume.setInstallPath(inv.getInstallPath()); + volume.setSize(inv.getSize()); + gc.volume = volume; + gc.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + } + protected void handle(final CleanUpTrashOnPrimaryStroageMsg msg) { MessageReply reply = new MessageReply(); thdf.chainSubmit(new ChainTask(msg) { @@ -2107,7 +2134,7 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } @@ -2234,7 +2261,7 @@ private void createFromVolumeSnapshot(FlowTrigger trigger) { cmd.srcPath = snapshot.getPrimaryStorageInstallPath(); cmd.dstPath = dstPath; cmd.shareable = false; - httpCall(CP_PATH, cmd, CpRsp.class, new ReturnValueCompletion(completion) { + httpCall(CP_PATH, cmd, CpRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(CpRsp rsp) { if (rsp.actualSize != null) { @@ -2368,10 +2395,13 @@ public void fail(ErrorCode errorCode) { } }); - done(new FlowDoneHandler(completion) { + flow(new Flow() { + String __name__ = "persist-db"; + + ImageCacheVO cvo = new ImageCacheVO(); + @Override - public void handle(Map data) { - ImageCacheVO cvo = new ImageCacheVO(); + public void run(final FlowTrigger trigger, Map data) { cvo.setMd5sum("not calculated"); cvo.setSize(image.getInventory().getActualSize()); cvo.setInstallUrl(snapshotPath); @@ -2381,9 +2411,23 @@ public void handle(Map data) { cvo.setState(ImageCacheState.ready); cvo.setSize(actualSize); cvo = dbf.persistAndRefresh(cvo); + data.put(ImageCacheVO.class.getSimpleName(),cvo); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + dbf.remove(cvo); + trigger.rollback(); + } + }); - ImageCacheVO finalCvo = cvo; + flow(new NoRollbackFlow() { + String __name__ = "save-encryption-Integrity-after-create-image-cache"; + @Override + public void run(final FlowTrigger trigger, Map data) { + ImageCacheVO finalCvo = (ImageCacheVO) (data.get(ImageCacheVO.class.getSimpleName())); new While<>(pluginRgty.getExtensionList(AfterCreateImageCacheExtensionPoint.class)).each((ext, whileCompletion) -> { ext.saveEncryptAfterCreateImageCache(null, ImageCacheInventory.valueOf(finalCvo), new Completion(whileCompletion) { @Override @@ -2401,14 +2445,22 @@ public void fail(ErrorCode errorCode) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { - logger.warn(String.format("failed to saveEncryptAfterCreateImageCache: %s", errorCodeList.getCauses().get(0))); + trigger.fail(operr(String.format("failed to saveEncryptAfterCreateImageCache: %s", errorCodeList.getCauses().get(0)))); + return; } - completion.success(finalCvo); + trigger.next(); } }); } }); + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success((ImageCacheVO) (data.get(ImageCacheVO.class.getSimpleName()))); + } + }); + error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { @@ -3005,12 +3057,14 @@ public void rollback(FlowRollback trigger, Map data) { trigger.rollback(); return; } - - UndoSnapshotCreationMsg cmsg = new UndoSnapshotCreationMsg(); - cmsg.setVolumeUuid(snapshot.getVolumeUuid()); - cmsg.setSnapShot(snapshot); - bus.makeTargetServiceIdByResourceUuid(cmsg, VolumeConstant.SERVICE_ID, snapshot.getVolumeUuid()); - bus.send(cmsg, new CloudBusCallBack(trigger) { + VolumeSnapshotDeletionMsg dmsg = new VolumeSnapshotDeletionMsg(); + dmsg.setTreeUuid(snapshot.getTreeUuid()); + dmsg.setVolumeUuid(snapshot.getVolumeUuid()); + dmsg.setSnapshotUuid(snapshot.getUuid()); + dmsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); + dmsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, snapshot.getUuid()); + bus.send(dmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply reply) { trigger.rollback(); @@ -3056,26 +3110,26 @@ public void run(MessageReply r) { }); flow(new NoRollbackFlow() { - String __name__ = "undo-snapshot-creation"; + String __name__ = "delete-temp-snapshot"; @Override public boolean skip(Map data) { - if (msg instanceof CreateTemplateFromVolumeSnapshotOnPrimaryStorageMsg || - !PrimaryStorageGlobalConfig.UNDO_TEMP_SNAPSHOT.value(Boolean.class)) { - return true; - } - - return false; + return msg instanceof CreateTemplateFromVolumeSnapshotOnPrimaryStorageMsg || + !PrimaryStorageGlobalConfig.UNDO_TEMP_SNAPSHOT.value(Boolean.class); } @Override public void run(FlowTrigger trigger, Map data) { TaskProgressRange stage = markTaskStage(parentStage, UNDO_SNAPSHOT_CREATION_STAGE); - UndoSnapshotCreationMsg cmsg = new UndoSnapshotCreationMsg(); - cmsg.setVolumeUuid(snapshot.getVolumeUuid()); - cmsg.setSnapShot(snapshot); - bus.makeTargetServiceIdByResourceUuid(cmsg, VolumeConstant.SERVICE_ID, snapshot.getVolumeUuid()); - bus.send(cmsg, new CloudBusCallBack(trigger) { + + VolumeSnapshotDeletionMsg dmsg = new VolumeSnapshotDeletionMsg(); + dmsg.setTreeUuid(snapshot.getTreeUuid()); + dmsg.setVolumeUuid(snapshot.getVolumeUuid()); + dmsg.setSnapshotUuid(snapshot.getUuid()); + dmsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + dmsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); + bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, snapshot.getUuid()); + bus.send(dmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { @@ -3112,30 +3166,6 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { - VolumeSnapshotDeletionMsg dmsg = new VolumeSnapshotDeletionMsg(); - dmsg.setTreeUuid(msg.getSnapshot().getTreeUuid()); - dmsg.setVolumeUuid(msg.getSnapshot().getVolumeUuid()); - dmsg.setSnapshotUuid(msg.getSnapshot().getUuid()); - dmsg.setVolumeDeletion(false); - bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, msg.getSnapshot().getUuid()); - bus.send(dmsg, new CloudBusCallBack(msg) { - @Override - public void run(MessageReply reply) { - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - if (!reply.isSuccess()) { - ret.setError(reply.getError()); - bus.reply(msg, ret); - return; - } - - ret.setNewVolumeInstallPath(msg.getVolume().getInstallPath()); - ret.setSize(msg.getVolume().getActualSize()); - bus.reply(msg, ret); - } - }); - } - @Override protected void handle(CancelJobOnPrimaryStorageMsg msg) { inQueue().name(String.format("cancel-job-on-primarystorage-%s", self.getUuid())) @@ -3290,6 +3320,8 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { cap.setSupport(true); cap.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); + cap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); + cap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); } else if (VolumeType.Memory.toString().equals(volumeType)) { cap.setSupport(false); } else { @@ -4137,6 +4169,11 @@ private void handle(APIDeleteCephPrimaryStoragePoolMsg msg) { CephPrimaryStoragePoolVO vo = dbf.findByUuid(msg.getUuid(), CephPrimaryStoragePoolVO.class); dbf.remove(vo); osdHelper.recalculateAvailableCapacity(); + + for(CephPrimaryStorageMonAfterModifiedExtensionPoint ext : pluginRgty.getExtensionList(CephPrimaryStorageMonAfterModifiedExtensionPoint.class)) { + ext.afterModified(getSelf()); + } + bus.publish(evt); } @@ -4176,6 +4213,11 @@ private void addCephPrimaryStoragePool(APIAddCephPrimaryStoragePoolMsg msg, fina @Override public void success(AddPoolRsp rsp) { osdHelper.recalculateAvailableCapacity(); + + for(CephPrimaryStorageMonAfterModifiedExtensionPoint ext : pluginRgty.getExtensionList(CephPrimaryStorageMonAfterModifiedExtensionPoint.class)) { + ext.afterModified(getSelf()); + } + evt.setInventory(CephPrimaryStoragePoolInventory.valueOf(finalVo)); bus.publish(evt); completion.done(); @@ -4458,8 +4500,6 @@ protected void handleLocalMessage(Message msg) { handle((GetPrimaryStorageUsageReportMsg) msg); } else if (msg instanceof CleanUpStorageTrashOnPrimaryStorageMsg) { handle((CleanUpStorageTrashOnPrimaryStorageMsg)msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -4683,7 +4723,7 @@ private void deleteImageCacheOnPrimaryStorage(DeleteImageCacheOnPrimaryStorageMs DeleteImageCacheCmd cmd = new DeleteImageCacheCmd(); cmd.setFsId(getSelf().getFsid()); cmd.setUuid(self.getUuid()); - cmd.imagePath = msg.getInstallPath().split("@")[0]; + cmd.imagePath = getVolumePathFromSnapshot(msg.getInstallPath()); cmd.snapshotPath = msg.getInstallPath(); httpCall(DELETE_IMAGE_CACHE, cmd, AgentResponse.class, new ReturnValueCompletion(msg) { @Override @@ -4953,23 +4993,27 @@ private void checkHostStorageConnection(List hostUuids, final Completion new While<>(msgs).each((msg, wc) -> bus.send(msg, new CloudBusCallBack(wc) { @Override public void run(MessageReply reply) { - KVMHostAsyncHttpCallReply kr = reply.castReply(); - CheckHostStorageConnectionRsp rsp = kr.toResponse(CheckHostStorageConnectionRsp.class); - UpdatePrimaryStorageHostStatusMsg umsg = new UpdatePrimaryStorageHostStatusMsg(); umsg.setHostUuid(msg.getHostUuid()); umsg.setPrimaryStorageUuid(self.getUuid()); - - if (rsp == null) { - wc.addError(operr("operation error, because: failed to get response")); + if (!reply.isSuccess()) { + wc.addError(reply.getError()); umsg.setStatus(PrimaryStorageHostStatus.Disconnected); } else { - ErrorCode errorCode = rsp.buildErrorCode(); - if (errorCode != null) { - wc.addError(operr("operation error, because:%s", errorCode)); + KVMHostAsyncHttpCallReply kr = reply.castReply(); + CheckHostStorageConnectionRsp rsp = kr.toResponse(CheckHostStorageConnectionRsp.class); + + if (rsp == null) { + wc.addError(operr("operation error, because: failed to get response")); umsg.setStatus(PrimaryStorageHostStatus.Disconnected); } else { - umsg.setStatus(PrimaryStorageHostStatus.Connected); + ErrorCode errorCode = rsp.buildErrorCode(); + if (errorCode != null) { + wc.addError(operr("operation error, because:%s", errorCode)); + umsg.setStatus(PrimaryStorageHostStatus.Disconnected); + } else { + umsg.setStatus(PrimaryStorageHostStatus.Connected); + } } } @@ -5126,21 +5170,36 @@ protected void handle(final RevertVolumeFromSnapshotOnPrimaryStorageMsg msg) { chain.then(new ShareFlow() { @Override public void setup() { + boolean fastRevert = VolumeSnapshotGlobalConfig.ENABLE_FAST_REVERT.value(Boolean.class); + String snapShotPath = msg.getSnapshot().getPrimaryStorageInstallPath(); // get volume path from snapshot path, just split @ - String volumePath = msg.getSnapshot().getPrimaryStorageInstallPath().split("@")[0]; + String volumePath = getVolumePathFromSnapshot(snapShotPath); + final String newVolumePath = makeVolumeInstallPathByTargetPool(Platform.getUuid(), getTargetPoolNameFromAllocatedUrl(snapShotPath)); flow(new NoRollbackFlow() { + String __name__ = "revert-volume-from-snapshot"; + + @Override + public boolean skip(Map data) { + return fastRevert; + } + @Override public void run(FlowTrigger trigger, Map data) { TaskProgressRange stage = markTaskStage(parentStage, UNDO_SNAPSHOT_CREATION_STAGE); RollbackSnapshotCmd cmd = new RollbackSnapshotCmd(); - cmd.snapshotPath = msg.getSnapshot().getPrimaryStorageInstallPath(); + cmd.snapshotPath = snapShotPath; cmd.capacityThreshold = psPhysicalCapacityMgr.getRatio(getSelf().getUuid()); httpCall(ROLLBACK_SNAPSHOT_PATH, cmd, RollbackSnapshotRsp.class, new ReturnValueCompletion(msg) { @Override public void success(RollbackSnapshotRsp returnValue) { + Long trashId = trash.getTrashId(self.getUuid(), volumePath); + if (trashId != null) { + trash.removeFromDb(trashId); + } reply.setSize(returnValue.getSize()); + reply.setNewVolumeInstallPath(volumePath); reportProgress(stage.getEnd().toString()); trigger.next(); } @@ -5153,15 +5212,41 @@ public void fail(ErrorCode errorCode) { } }); + + flow(new NoRollbackFlow() { + String __name__ = "fast-revert-volume-from-snapshot"; + + @Override + public boolean skip(Map data) { + return !fastRevert; + } + + @Override + public void run(final FlowTrigger trigger, Map data) { + TaskProgressRange stage = markTaskStage(parentStage, UNDO_SNAPSHOT_CREATION_STAGE); + + VolumeSnapshotInventory sp = msg.getSnapshot(); + cloneAndProtectSnaphost(sp.getPrimaryStorageInstallPath(), newVolumePath, new ReturnValueCompletion(trigger) { + @Override + public void success(CloneRsp rsp) { + reply.setNewVolumeInstallPath(newVolumePath); + reply.setSize(rsp.size); + tagMgr.createNonInherentSystemTag(sp.getVolumeUuid(), VolumeSystemTags.FAST_REVERT.getTagFormat(), VolumeVO.class.getSimpleName()); + reportProgress(stage.getEnd().toString()); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(msg) { @Override public void handle(Map data) { - Long trashId = trash.getTrashId(self.getUuid(), volumePath); - if (trashId != null) { - trash.removeFromDb(trashId); - } - - reply.setNewVolumeInstallPath(volumePath); bus.reply(msg, reply); } }); @@ -5360,7 +5445,13 @@ public void success(DeleteSnapshotRsp returnValue) { @Override public void fail(ErrorCode errorCode) { - reply.setError(errorCode); + // ceph has trash, so children may not be deleted immediately. + DeleteVolumeSnapshotGC snapshotGC = new DeleteVolumeSnapshotGC(); + snapshotGC.NAME = String.format("gc-ceph-%s-volumesnapshot-path-%s", self.getUuid(), cmd.snapshotPath); + snapshotGC.primaryStorageUuid = self.getUuid(); + snapshotGC.volumeSnapshot = msg.getSnapshot(); + snapshotGC.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + reply.setGcSubmitted(true); bus.reply(msg, reply); completion.done(); } @@ -5942,14 +6033,31 @@ protected void handle(DeleteVolumeChainOnPrimaryStorageMsg msg) { DeleteVolumeChainOnPrimaryStorageReply reply = new DeleteVolumeChainOnPrimaryStorageReply(); DeleteVolumeChainCmd cmd = new DeleteVolumeChainCmd(); cmd.installPaths = msg.getInstallPaths(); - new HttpCaller<>(DELETE_VOLUME_CHAIN_PATH, cmd, AgentResponse.class, new ReturnValueCompletion(msg) { + new HttpCaller<>(DELETE_VOLUME_CHAIN_PATH, cmd, DeleteVolumeChainRsp.class, new ReturnValueCompletion(msg) { + private void submitGcForUndeletedInstallPaths(List undeletedInstallPaths) { + CephDeleteVolumeChainGC volumeChainGC = new CephDeleteVolumeChainGC(); + volumeChainGC.primaryStorageUuid = self.getUuid(); + volumeChainGC.installPaths = undeletedInstallPaths; + volumeChainGC.NAME = String.format("gc-ceph-%s-volume-chain-%s", self.getUuid(), msg.getChainTop()); + volumeChainGC.chainTop = msg.getChainTop(); + volumeChainGC.deduplicateSubmit(CephGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + logger.debug(String.format("unable to delete installPaths %s, now add GC to delete", undeletedInstallPaths)); + } + @Override - public void success(AgentResponse rsp) { + public void success(DeleteVolumeChainRsp rsp) { + if (CollectionUtils.isEmpty(rsp.undeletedInstallPaths)) { + bus.reply(msg, reply); + return; + } + submitGcForUndeletedInstallPaths(rsp.undeletedInstallPaths); + reply.setUndeletedInstallPaths(rsp.undeletedInstallPaths); bus.reply(msg, reply); } @Override public void fail(ErrorCode errorCode) { + submitGcForUndeletedInstallPaths(cmd.installPaths); reply.setError(errorCode); bus.reply(msg, reply); } @@ -5971,6 +6079,18 @@ private void handle(GetPrimaryStorageUsageReportMsg msg) { bus.reply(msg, reply); } + @Override + protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { + GetOwningVolumePathFromInternalSnapshotReply reply = new GetOwningVolumePathFromInternalSnapshotReply(); + if (msg.getSnapshotPaths() != null) { + for (String snapshotPath : msg.getSnapshotPaths()) { + reply.putOwningVolumePath(snapshotPath, getVolumePathFromSnapshot(snapshotPath)); + } + } + + bus.reply(msg, reply); + } + protected void handle(CleanUpStorageTrashOnPrimaryStorageMsg msg) { CleanUpStorageTrashOnPrimaryStorageReply reply = new CleanUpStorageTrashOnPrimaryStorageReply(); thdf.singleFlightSubmit(new SingleFlightTask(msg) @@ -6035,6 +6155,10 @@ private String makeCephPath(String originPath) { return String.format("ceph://%s", originPath); } + private static String getVolumePathFromSnapshot(String snapshotPath) { + return snapshotPath.split("@")[0]; + } + protected String getTargetPoolNameFromAllocatedUrl(String allocatedUrl) { if (allocatedUrl == null) { throw new OperationFailureException(operr("allocated url not found")); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index 6b3dfc4a3a4..cb7dde9c5cc 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -89,7 +89,8 @@ public class CephPrimaryStorageFactory implements PrimaryStorageFactory, CephCap KvmSetupSelfFencerExtensionPoint, KVMPreAttachIsoExtensionPoint, Component, PostMarkRootVolumeAsSnapshotExtension, BeforeTakeLiveSnapshotsOnVolumes, VmInstanceCreateExtensionPoint, CreateDataVolumeExtensionPoint, InstanceOfferingUserConfigValidator, DiskOfferingUserConfigValidator, MarkRootVolumeAsSnapshotExtension, - VmCapabilitiesExtensionPoint, PreVmInstantiateResourceExtensionPoint, PSCapacityExtensionPoint, RecalculatePrimaryStorageCapacityExtensionPoint { + VmCapabilitiesExtensionPoint, PreVmInstantiateResourceExtensionPoint, PSCapacityExtensionPoint, + RecalculatePrimaryStorageCapacityExtensionPoint { private static final CLogger logger = Utils.getLogger(CephPrimaryStorageFactory.class); public static final PrimaryStorageType type = new PrimaryStorageType(CephConstants.CEPH_PRIMARY_STORAGE_TYPE); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java index af991e60f1b..c08a1528399 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephSnapshotProtector.java @@ -1,7 +1,6 @@ package org.zstack.storage.ceph.primary; import org.zstack.header.core.Completion; -import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.storage.snapshot.VolumeSnapshotDeletionProtector; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.storage.ceph.CephConstants; @@ -29,7 +28,7 @@ public void protect(VolumeSnapshotInventory snapshot, Completion completion) { completion.success(); } - if (volUuids.stream().noneMatch(it -> snapshot.getPrimaryStorageInstallPath().contains(it))) { + if (volUuids.stream().noneMatch(it -> snapshot.getPrimaryStorageInstallPath().contains(it)) && !VolumeSystemTags.FAST_REVERT.hasTag(snapshot.getVolumeUuid())) { completion.fail(inerr("the snapshot[name:%s, uuid:%s, path: %s] seems not belong to the volume[uuid:%s]", snapshot.getName(), snapshot.getUuid(), snapshot.getPrimaryStorageInstallPath(), snapshot.getVolumeUuid())); return; diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java index 0dbffe4e008..71287bce671 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephVolumeSnapshotAfterDeleteExtension.java @@ -7,6 +7,7 @@ import org.zstack.core.db.SQL; import org.zstack.core.trash.StorageTrash; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; import org.zstack.header.storage.primary.PrimaryStorageConstant; import org.zstack.header.storage.snapshot.VolumeSnapshotAfterDeleteExtensionPoint; @@ -30,12 +31,8 @@ public class CephVolumeSnapshotAfterDeleteExtension implements VolumeSnapshotAft private static final CLogger logger = Utils.getLogger(CephVolumeSnapshotAfterDeleteExtension.class); @Override - public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, Completion completion) { - completion.success(); - } - - @Override - public void volumeSnapshotAfterFailedDeleteExtensionPoint(VolumeSnapshotInventory snapshot) { + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { + completion.done(); } private String getVolumeInstallPathFromSnapshot(String snapshotInstallPath) { diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java index ddd4c2f9901..1ca0a262c1d 100644 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/capacity/CephOsdGroupCapacityHelper.java @@ -1,6 +1,7 @@ package org.zstack.storage.ceph.primary.capacity; import org.apache.commons.collections.CollectionUtils; +import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; @@ -238,7 +239,7 @@ public Long calculateAvailableCapacityByRatio(CephOsdGroupVO osdGroup, String pr for (String poolName : poolNames) { String installPathPrefix = String.format("ceph://%s", poolName); long volSize = volumes.parallelStream() - .filter(v -> v.getInstallPath() != null && v.getInstallPath() + .filter(v -> Strings.isNotEmpty(v.getInstallPath()) && v.getInstallPath() .substring(0, v.getInstallPath().lastIndexOf("/")) .equals((installPathPrefix))) .map(VolumeVO::getSize) @@ -246,7 +247,7 @@ public Long calculateAvailableCapacityByRatio(CephOsdGroupVO osdGroup, String pr .reduce(0L, Long::sum); long imageCacheSize = imageCaches.parallelStream() - .filter(v -> v.getInstallUrl() != null && v.getInstallUrl() + .filter(v -> Strings.isNotEmpty(v.getInstallUrl()) && v.getInstallUrl() .substring(0, v.getInstallUrl().lastIndexOf("/")) .equals((installPathPrefix))) .map(ImageCacheVO::getSize) @@ -254,7 +255,7 @@ public Long calculateAvailableCapacityByRatio(CephOsdGroupVO osdGroup, String pr .reduce(0L, Long::sum); long snapShotSize = snapshots.parallelStream() - .filter(v -> v.getPrimaryStorageInstallPath() != null && v.getPrimaryStorageInstallPath() + .filter(v -> Strings.isNotEmpty(v.getPrimaryStorageInstallPath()) && v.getPrimaryStorageInstallPath() .substring(0, v.getPrimaryStorageInstallPath().lastIndexOf("/")) .equals((installPathPrefix))) .map(VolumeSnapshotVO::getSize) diff --git a/plugin/directory/pom.xml b/plugin/directory/pom.xml index 1d17e27b2e5..17d8f511076 100644 --- a/plugin/directory/pom.xml +++ b/plugin/directory/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/eip/pom.xml b/plugin/eip/pom.xml index 46c6b7f79d6..08aa87feb87 100755 --- a/plugin/eip/pom.xml +++ b/plugin/eip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java index da4a2d5f799..9fc0614c5d0 100755 --- a/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java +++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/EipApiInterceptor.java @@ -32,6 +32,7 @@ import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; import org.zstack.utils.network.IPv6NetworkUtils; +import org.zstack.utils.network.NetworkUtils; import javax.persistence.Tuple; import javax.persistence.TypedQuery; @@ -101,26 +102,16 @@ private void validate(APIGetEipAttachableVmNicsMsg msg) { } boolean isAddressPool = false; - boolean isIpv6 = false; if (msg.getVipUuid() != null) { VipVO vip = dbf.findByUuid(msg.getVipUuid(), VipVO.class); isAddressPool = Q.New(AddressPoolVO.class).eq(AddressPoolVO_.uuid, vip.getIpRangeUuid()).isExists(); - if (IPv6NetworkUtils.isIpv6Address(vip.getIp())) { - isIpv6 = true; - } } else if (msg.getEipUuid() != null) { EipVO eipVO = dbf.findByUuid(msg.getEipUuid(), EipVO.class); VipVO vip = dbf.findByUuid(eipVO.getVipUuid(), VipVO.class); isAddressPool = Q.New(AddressPoolVO.class).eq(AddressPoolVO_.uuid, vip.getIpRangeUuid()).isExists(); - if (IPv6NetworkUtils.isIpv6Address(vip.getIp())) { - isIpv6 = true; - } } if (isAddressPool) { msg.setNetworkServiceProvider("vrouter"); - } else if (isIpv6) { - /* TODO, temp hard code */ - msg.setNetworkServiceProvider("Flat"); } } @@ -155,16 +146,6 @@ private void validate(final APIAttachEipMsg msg) { msg.getEipUuid(), EipState.Enabled, state)); } - if (msg.getUsedIpUuid() == null) { - VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); - msg.setUsedIpUuid(nic.getUsedIpUuid()); - } else { - validateEipGuestIpUuid(msg.getVmNicUuid(), msg.getUsedIpUuid()); - } - - String vipUuid = t.get(2, String.class); - isVipInVmNicSubnet(vipUuid, msg.getUsedIpUuid()); - VipVO vip = new Callable() { @Override @Transactional(readOnly = true) @@ -179,6 +160,21 @@ public VipVO call() { } }.call(); + if (msg.getUsedIpUuid() == null) { + VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + UsedIpVO usedIp = nic.getUsedIps().stream() + .filter(usedIpVO -> usedIpVO.getIpVersion().equals(NetworkUtils.getIpversion(vip.getIp()))) + .findFirst() + .orElseThrow(() -> new ApiMessageInterceptionException(argerr("vm nic[uuid:%s] does not have a compatible usedIp for eip[uuid:%s]", + msg.getVmNicUuid(), msg.getEipUuid()))); + msg.setUsedIpUuid(usedIp.getUuid()); + } else { + validateEipGuestIpUuid(msg.getVmNicUuid(), msg.getUsedIpUuid()); + } + + String vipUuid = t.get(2, String.class); + isVipInVmNicSubnet(vipUuid, msg.getUsedIpUuid()); + VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); if (VmNicHelper.getL3Uuids(nic).contains(vip.getL3NetworkUuid())){ throw new ApiMessageInterceptionException(argerr("guest l3Network of vm nic[uuid:%s] and vip l3Network of EIP[uuid:%s] are the same network", diff --git a/plugin/expon/pom.xml b/plugin/expon/pom.xml index f1348e51de4..48c98522980 100644 --- a/plugin/expon/pom.xml +++ b/plugin/expon/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java b/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java index 84dfcf4ffb4..a75fb54f7fc 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponApiHelper.java @@ -328,7 +328,19 @@ public void deleteVolume(String volId, boolean force) { req.setForce(force); callErrorOut(req, DeleteVolumeResponse.class); } - + + public void deleteVolumeAndSnapshots(String volId, boolean force) { + List snaps = queryVolumeSnapshots(volId); + snaps.forEach(snap -> { + String addedIscsiClientId = getSnapshotAttachedIscsiClientGroups(snap.getId()).stream().findFirst().orElse(null); + if (addedIscsiClientId != null) { + removeSnapshotFromIscsiClientGroup(snap.getId(), addedIscsiClientId); + } + deleteVolumeSnapshot(snap.getId(), true); + }); + deleteVolume(volId, force); + } + public VolumeModule cloneVolume(String snapId, String name, ExponVolumeQos qos) { CloneVolumeRequest req = new CloneVolumeRequest(); req.setSnapshotId(snapId); @@ -420,6 +432,16 @@ public void deleteVolumeSnapshot(String snapId, boolean force) { callIgnoringSpecificErrors(req, DeleteVolumeSnapshotResponse.class, ExponError.SNAPSHOT_NOT_FOUND); } + public List queryVolumeSnapshots(String volId) { + QueryVolumeSnapshotRequest req = new QueryVolumeSnapshotRequest(); + req.addCond("volume_id", volId); + QueryVolumeSnapshotResponse rsp = queryErrorOut(req, QueryVolumeSnapshotResponse.class); + if (rsp.getTotal() == 0) { + return new ArrayList<>(); + } + return rsp.getSnaps().stream().filter(it -> it.getVolumeId().equals(volId)).collect(Collectors.toList()); + } + public VolumeSnapshotModule queryVolumeSnapshot(String name) { QueryVolumeSnapshotRequest req = new QueryVolumeSnapshotRequest(); req.addCond("name", name); diff --git a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java index 31d1d2f9567..2a3762f98ff 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java +++ b/plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java @@ -21,7 +21,7 @@ import org.zstack.expon.sdk.uss.UssGatewayModule; import org.zstack.expon.sdk.vhost.VhostControllerModule; import org.zstack.expon.sdk.volume.ExponVolumeQos; -import org.zstack.expon.sdk.volume.GetVolumeBoundPathResponse; +import org.zstack.expon.sdk.volume.VolumeLunModule; import org.zstack.expon.sdk.volume.VolumeModule; import org.zstack.expon.sdk.volume.VolumeSnapshotModule; import org.zstack.header.core.Completion; @@ -38,13 +38,12 @@ import org.zstack.header.storage.primary.ImageCacheInventory; import org.zstack.header.storage.primary.VolumeSnapshotCapability; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; -import org.zstack.header.volume.VolumeConstant; -import org.zstack.header.volume.VolumeInventory; -import org.zstack.header.volume.VolumeProtocol; -import org.zstack.header.volume.VolumeStats; +import org.zstack.header.volume.*; +import org.zstack.header.volume.block.BlockVolumeVO; import org.zstack.iscsi.IscsiUtils; import org.zstack.iscsi.kvm.IscsiHeartbeatVolumeTO; import org.zstack.iscsi.kvm.IscsiVolumeTO; +import org.zstack.kvm.KVMConstant; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -77,8 +76,6 @@ public class ExponStorageController implements PrimaryStorageControllerSvc, Prim private ExponConfig config; public ExponAddonInfo addonInfo; public final ExponApiHelper apiHelper; - @Autowired - private ExternalPrimaryStorageFactory extPsFactory; // TODO static nqn private final static String hostNqn = "nqn.2014-08.org.nvmexpress:uuid:zstack"; @@ -94,7 +91,10 @@ public class ExponStorageController implements PrimaryStorageControllerSvc, Prim VolumeSnapshotCapability scap = new VolumeSnapshotCapability(); scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); + scap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); scap.setSupportCreateOnHypervisor(false); + scap.setSupportLazyDelete(true); + scap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(true); @@ -238,6 +238,10 @@ public List getIscsiServers(String tianshuId) { private synchronized ActiveVolumeTO activeIscsiVolume(HostInventory h, BaseVolumeInfo vol, boolean shareable) { String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(h.getHypervisorType())) { + VolumeVO volume = dbf.findByUuid(vol.getUuid(), VolumeVO.class); + clientIqn = IscsiUtils.getBMInitiatorName(volume.getVmInstanceUuid()); + } if (clientIqn == null) { throw new RuntimeException(String.format("cannot get host[uuid:%s] initiator name", h.getUuid())); } @@ -492,6 +496,11 @@ public List getActiveVolumesLocation(HostInventory h) { return Collections.singletonList("file://" + PathUtil.join(vhostSocketDir, "volume-*")); } + @Override + public void deployClient(HostInventory h, Completion comp) { + comp.success(); + } + @Override public List getActiveClients(String installPath, String protocol) { if (VolumeProtocol.Vhost.toString().equals(protocol)) { @@ -527,6 +536,9 @@ public List getActiveClients(String installPath, String prot } else { c.setManagerIp(it); } + VolumeLunModule lunDetail = apiHelper.getVolumeLunDetail(getVolIdFromPath(installPath)); + // path: uuid/poolId/lunid + c.setPath(String.format("%s/%s/%s", lunDetail.getUuid(), lunDetail.getPoolId(), lunDetail.getLunId())); return c; }).collect(Collectors.toList()); } else { @@ -572,14 +584,13 @@ public void deactivate(String installPath, String protocol, HostInventory h, Com @Override public void deactivate(String installPath, String protocol, ActiveVolumeClient client, Completion comp) { - HostVO host = Q.New(HostVO.class).eq(HostVO_.managementIp, client.getManagerIp()).find(); - if (host != null) { - deactivate(installPath, protocol, HostInventory.valueOf(host), comp); - } else { - // bm instance InitiatorName + if (VolumeProtocol.iSCSI.toString().equals(protocol)) { deactivateIscsi(installPath, client.getQualifiedName()); comp.success(); + return; } + HostVO host = Q.New(HostVO.class).eq(HostVO_.managementIp, client.getManagerIp()).find(); + deactivate(installPath, protocol, HostInventory.valueOf(host), comp); } public void cleanActiveRecord(VolumeInventory vol) { @@ -745,6 +756,10 @@ private void deactivateVhost(String installPath, HostInventory h) { private void deactivateIscsi(String installPath, HostInventory h) { String iqn = IscsiUtils.getHostInitiatorName(h.getUuid()); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(h.getHypervisorType())) { + VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.installPath, installPath).find(); + iqn = IscsiUtils.getBMInitiatorName(volume.getLastVmInstanceUuid()); + } if (iqn == null) { throw new RuntimeException(String.format("cannot get host[uuid:%s] initiator name", h.getUuid())); } @@ -949,10 +964,10 @@ private void setNodeHealthyByVhost(HostInventory host, NodeHealthy healthy) { } private String getProtocolByHypervisorType(String type) { - NodeHealthyCheckProtocolExtensionPoint point = extPsFactory.nodeHealthyCheckProtocolExtensions.get(type); - if (point != null) { - return point.getHealthyProtocol(); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(type)) { + return VolumeProtocol.iSCSI.toString(); } + return VolumeProtocol.Vhost.toString(); } @@ -1034,7 +1049,7 @@ public void deleteVolume(String installPath, Completion comp) { @Override public void deleteVolumeAndSnapshot(String installPath, Completion comp) { String volId = getVolIdFromPath(installPath); - apiHelper.deleteVolume(volId, true); + apiHelper.deleteVolumeAndSnapshots(volId, true); comp.success(); } @@ -1058,6 +1073,7 @@ public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValue stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); stats.setSize(vol.getVolumeSize()); stats.setActualSize(vol.getDataSize()); + stats.setParentUri(srcInstallPath); comp.success(stats); } @@ -1310,6 +1326,16 @@ public void setTrashExpireTime(int timeInSeconds, Completion completion) { completion.success(); } + @Override + public void onFirstAdditionConfigure(Completion completion) { + completion.success(); + } + + @Override + public long alignSize(long size) { + return size; + } + private void retry(Runnable r) { retry(r, 3); } diff --git a/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java b/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java index 2f9194ef597..aa9efe98263 100644 --- a/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java +++ b/plugin/expon/src/main/java/org/zstack/expon/sdk/volume/VolumeModule.java @@ -28,6 +28,7 @@ public class VolumeModule { private boolean isDelete; private boolean qosStatus; private ExponVolumeQos qos; + private String runStatus; public String getId() { diff --git a/plugin/externalStorage/pom.xml b/plugin/externalStorage/pom.xml index e021b5df7d7..76c238c9c2b 100644 --- a/plugin/externalStorage/pom.xml +++ b/plugin/externalStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 .. diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java index 50031d7b4e4..7c0e17cd173 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/ExternalStorageFencerType.java @@ -8,6 +8,7 @@ * @author Xingwei Yu * @date 2024/8/21 10:38 */ +// TODO refactor it, use controller interface not this fencer type class public class ExternalStorageFencerType { private static Map types = Collections.synchronizedMap(new HashMap()); diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java index 99ace139e8b..c6eb04a8557 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/primary/kvm/ExternalPrimaryStorageKvmFactory.java @@ -9,22 +9,20 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.externalStorage.primary.ExternalStorageConstant; import org.zstack.header.core.*; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; -import org.zstack.header.core.workflow.NopeFlow; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.host.HostVO_; import org.zstack.header.message.MessageReply; import org.zstack.header.storage.addon.NodeHealthy; import org.zstack.header.storage.addon.StorageHealthy; -import org.zstack.header.storage.addon.primary.BaseVolumeInfo; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; -import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.primary.*; import org.zstack.header.vm.VmInstanceSpec; import org.zstack.header.vm.VmInstanceState; @@ -33,6 +31,7 @@ import org.zstack.header.volume.VolumeVO_; import org.zstack.kvm.*; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -86,18 +85,21 @@ public Flow createKvmHostConnectingFlow(KVMHostConnectedContext context) { } return new NoRollbackFlow() { - final String __name__ = "external-primary-storage-kvm-host-connecting-flow"; + final String __name__ = "prepare-external-primary-storage"; @Override public void run(FlowTrigger trigger, Map data) { - checkHostStatus(context.getInventory(), extPss, new WhileDoneCompletion(trigger) { + doPrepareExternalPrimaryStorage(context, extPss, new Completion(trigger) { @Override - public void done(ErrorCodeList errList) { - data.put(KVMConstant.CONNECT_HOST_PRIMARYSTORAGE_ERROR, errList); + public void success() { trigger.next(); } - }); + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); } }; } @@ -118,8 +120,72 @@ public void done(ErrorCodeList errList) { }); } - private void checkHostStatus(KVMHostInventory host, List extPss, WhileDoneCompletion completion) { + private void doPrepareExternalPrimaryStorage(final KVMHostConnectedContext context, List extPss, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName("do-prepare-external-primary-storage"); + chain.then(new NoRollbackFlow() { + String __name__ = "deploy-client"; + + @Override + public void run(FlowTrigger trigger, Map data) { + deployClient(context, extPss, new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + // todo rollback + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "check-host-status"; + + @Override + public void run(FlowTrigger trigger, Map data) { + checkHostStatus(context.getInventory(), extPss, new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errList) { + data.put(KVMConstant.CONNECT_HOST_PRIMARYSTORAGE_ERROR, errList); + trigger.next(); + } + }); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).start(); + } + + private void deployClient(final KVMHostConnectedContext context, List extPss, WhileDoneCompletion completion) { + new While<>(extPss).each((extPs, compl) -> { + logger.debug(String.format("deploying client for external primary storage[uuid:%s, name:%s] on KVM host[uuid:%s, name:%s]", + extPs.getUuid(), extPs.getName(), context.getInventory().getUuid(), context.getInventory().getName())); + extPsFactory.getNodeSvc(extPs.getUuid()).deployClient(context.getInventory(), new Completion(compl) { + @Override + public void success() { + compl.done(); + } + @Override + public void fail(ErrorCode errorCode) { + compl.addError(errorCode); + compl.done(); + } + }); + }).run(completion); + } + + private void checkHostStatus(KVMHostInventory host, List extPss, WhileDoneCompletion completion) { Map hostStatus = getHostStatus(extPss); new While<>(extPss).each((extPs, compl) -> { logger.debug(String.format("checking host status for external primary storage[uuid:%s, name:%s] on KVM host[uuid:%s, name:%s]", @@ -270,13 +336,19 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg List vols = getManagerExclusiveVolume(spec); for (VolumeInventory vol : vols) { - PrimaryStorageNodeSvc nodeSvc = getNodeService(vol); + PrimaryStorageNodeSvc nodeSvc = extPsFactory.getNodeSvc(vol.getPrimaryStorageUuid()); if (nodeSvc == null) { continue; } - nodeSvc.getActiveClients(vol.getInstallPath(), vol.getProtocol()).forEach(client -> { + List clients = nodeSvc.getActiveClients(vol.getInstallPath(), vol.getProtocol()); + clients.forEach(client -> { if (!client.getManagerIp().equals(host.getManagementIp()) && !client.isInBlacklist()) { + // hard code for zbs, zbs not support deactive and blacklist yet + if (vol.getProtocol().equals(ExternalStorageConstant.CBD_PROTOCOL)) { + throw new OperationFailureException(operr("find active clients for volume[uuid:%s, installPath %s, client:%s]", + vol.getUuid(), vol.getInstallPath(), client.getManagerIp())); + } // TODO use async call HostVO clientHost = Q.New(HostVO.class).eq(HostVO_.managementIp, client.getManagerIp()).find(); if (clientHost != null) { @@ -329,12 +401,16 @@ private List getManagerExclusiveVolume(VmInstanceSpec spec) { vols.add(spec.getDestRootVolume()); vols.addAll(spec.getDestDataVolumes()); + List pss = Q.New(ExternalPrimaryStorageVO.class) + .in(ExternalPrimaryStorageVO_.uuid, vols.stream().map(VolumeInventory::getPrimaryStorageUuid).collect(Collectors.toList())) + .list(); + Map psIdentities = pss.stream() + .collect(Collectors.toMap(ExternalPrimaryStorageVO::getUuid, ExternalPrimaryStorageVO::getIdentity)); vols.removeIf(info -> { - if (info.getInstallPath() == null || info.isShareable()) { + if (info.getInstallPath() == null || info.isShareable() || !psIdentities.containsKey(info.getPrimaryStorageUuid())) { return true; } - String identity = info.getInstallPath().split("://")[0]; - return !extPsFactory.support(identity); + return !extPsFactory.support(psIdentities.get(info.getPrimaryStorageUuid())); }); return vols; diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java index e52f8dcd77c..27c7c8e25bd 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/ExternalStorageParam.java @@ -69,6 +69,10 @@ default Object getParameterValue(String name){ return getParameterValue(name, true); } + default boolean isQueryableParam(String name) { + return getParameterMap().get(name).annotation.queryable(); + } + default Object getParameterValue(String name, boolean exceptionOnNotFound){ return getParameterValue(getParameterMap(), name, exceptionOnNotFound); } diff --git a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java index 9eb251ac8bf..0daaae1474d 100644 --- a/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java +++ b/plugin/externalStorage/src/main/java/org/zstack/externalStorage/sdk/Param.java @@ -13,4 +13,6 @@ long[] numberRange() default {}; boolean nonempty() default false; + + boolean queryable() default false; } diff --git a/plugin/flatNetworkProvider/pom.xml b/plugin/flatNetworkProvider/pom.xml index 657c6c448bb..1e768f5b2ea 100755 --- a/plugin/flatNetworkProvider/pom.xml +++ b/plugin/flatNetworkProvider/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 @@ -26,6 +26,11 @@ kvm ${project.version} + + org.zstack + sdnController + ${project.version} + diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index 68ba35ee0ab..2300f17cae2 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -54,6 +54,8 @@ import org.zstack.network.service.NetworkServiceProviderLookup; import org.zstack.network.service.flat.IpStatisticConstants.VmType; import org.zstack.network.service.vip.VipVO; +import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.sdnController.SdnControllerManager; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; @@ -109,6 +111,8 @@ public class FlatDhcpBackend extends AbstractService implements NetworkServiceDh private NetworkServiceManager nwServiceMgr; @Autowired protected L3NetworkManager l3NwMgr; + @Autowired + protected SdnControllerManager sdnMgr; private Map getIpStatisticExts = new HashMap<>(); @@ -213,6 +217,8 @@ private void handle(APIChangeL3NetworkDhcpIpAddressMsg msg) { ipr -> ipr.getIpVersion() == IPv6Constants.IPv6 && !ipr.getAddressMode().equals(IPv6Constants.SLAAC)) .collect(Collectors.toList()); + SdnControllerDhcp sdnDhcp = sdnMgr.getSdnControllerDhcp(msg.getL3NetworkUuid()); + /* * step #1, delete old dhcp server ip * step #2, allocate new dhcp server ip @@ -333,6 +339,11 @@ public void rollback(FlowRollback trigger, Map data) { }).then(new NoRollbackFlow() { String __name__ = "refresh-dhcp-server-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnDhcp != null; + } + @Override public void run(FlowTrigger trigger, Map data) { refreshDhcpInfoToHosts(l3VO, new Completion(trigger) { @@ -341,6 +352,29 @@ public void success() { trigger.next(); } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "refresh-dhcp-server-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnDhcp == null) { + trigger.next(); + return; + } + + sdnDhcp.enableDhcp(Collections.singletonList(L3NetworkInventory.valueOf(l3VO)), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); @@ -869,7 +903,7 @@ private void handle(APIGetL3NetworkDhcpIpAddressMsg msg) { reply.setIp6(ip); int l3IpVersion = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, msg.getL3NetworkUuid()).select(L3NetworkVO_.ipVersion).findValue(); if (l3IpVersion == IPv6Constants.IPv6) { - /* to be compitable with old version, dhcp server address of ipv6 only l3 network is filled in this field */ + /* to be compatible with old version, dhcp server address of ipv6 only l3 network is filled in this field */ reply.setIp(ip); } } @@ -886,7 +920,7 @@ String allocateDhcpIp(String l3Uuid, int ipVersion, String excludedIp) { return allocateDhcpIp(l3Uuid, ipVersion, true, null, excludedIp); } - private static Map getExistingDhcpServerIp(String l3Uuid, int ipVersion) { + public static Map getExistingDhcpServerIp(String l3Uuid, int ipVersion) { Map ret = new HashMap<>(); List tags = FlatNetworkSystemTags.L3_NETWORK_DHCP_IP.getTags(l3Uuid); if (tags != null) { @@ -913,7 +947,7 @@ private static Map getExistingDhcpServerIp(String l3Uuid, int ip @Deferred private String allocateDhcpIp(String l3Uuid, int ipVersion, boolean allocate_ip, String requiredIp, String excludedIp) { - if (!isProvidedByMe(l3Uuid)) { + if (!isAllocateDhcpServerIp(l3Uuid)) { return null; } @@ -1183,27 +1217,42 @@ public String preDeleteL3Network(L3NetworkInventory inventory) { public void beforeDeleteL3Network(L3NetworkInventory inventory) { } - private boolean isProvidedByMe(String l3Uuid) { + private boolean isAllocateDhcpServerIp(String l3Uuid) { + String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(l3Uuid, NetworkServiceType.DHCP.toString()); + if (providerType == null) { + return false; + } + + NetworkServiceProviderType type = NetworkServiceProviderType.valueOf(providerType); + return type.isAllocateDhcpServerIp(); + } + + private boolean isCreateDhcpNameSpace(String l3Uuid) { String providerType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType(l3Uuid, NetworkServiceType.DHCP.toString()); - return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING.equals(providerType); + if (providerType == null) { + return false; + } + + NetworkServiceProviderType type = NetworkServiceProviderType.valueOf(providerType); + return type.isCreateDhcpNameSpace(); } @Override public void afterDeleteL3Network(L3NetworkInventory inventory) { - if (!isProvidedByMe(inventory.getUuid())) { - return; + if (isAllocateDhcpServerIp(inventory.getUuid())) { + Map dhcpMap = getExistingDhcpServerIp(inventory.getUuid(), IPv6Constants.DUAL_STACK); + for (Map.Entry entry : dhcpMap.entrySet()) { + String dhcpIp = entry.getKey(); + String dhcpIpUuid = entry.getValue(); + deleteDhcpServerIp(inventory.getUuid(), dhcpIp, dhcpIpUuid); + logger.debug(String.format("delete DHCP server ip[%s] of the flat network[uuid:%s] as the L3 network is deleted", + dhcpIp, inventory.getUuid())); + } } - Map dhcpMap = getExistingDhcpServerIp(inventory.getUuid(), IPv6Constants.DUAL_STACK); - for (Map.Entry entry : dhcpMap.entrySet()) { - String dhcpIp = entry.getKey(); - String dhcpIpUuid = entry.getValue(); - deleteDhcpServerIp(inventory.getUuid(), dhcpIp, dhcpIpUuid); - logger.debug(String.format("delete DHCP server ip[%s] of the flat network[uuid:%s] as the L3 network is deleted", - dhcpIp, inventory.getUuid())); + if (isCreateDhcpNameSpace(inventory.getUuid())) { + deleteNameSpace(inventory, new NopeCompletion()); } - - deleteNameSpace(inventory, new NopeCompletion()); } private void deleteNameSpace(L3NetworkInventory inventory, Completion completion) { @@ -1977,7 +2026,7 @@ private void applyDhcpToHosts(List dhcpInfo, final String hostUuid, fi final Map> l3DhcpMap = new HashMap<>(); for (DhcpInfo d : dhcpInfo) { - if (!isProvidedByMe(d.l3NetworkUuid)) { + if (!isCreateDhcpNameSpace(d.l3NetworkUuid)) { /* there are vm in this l3, but dhcp is disabled */ continue; } @@ -2390,7 +2439,7 @@ private void validate(APIDetachNetworkServiceFromL3NetworkMsg msg) { } private void validate(APIChangeL3NetworkDhcpIpAddressMsg msg) { - if (!isProvidedByMe(msg.getL3NetworkUuid())) { + if (!isAllocateDhcpServerIp(msg.getL3NetworkUuid())) { throw new ApiMessageInterceptionException(argerr("could change dhcp server ip, because flat dhcp is not enabled")); } @@ -2531,10 +2580,6 @@ public void afterAddIpRange(IpRangeInventory ipr, List systemTags) { } } - if (ipr.getIpRangeType() != IpRangeType.Normal) { - return; - } - if (!Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.uuid, ipr.getUuid()).isExists()) { return; } @@ -2721,6 +2766,11 @@ public void enableNetworkService(L3NetworkVO l3VO, List systemTags, Comp } } + if (!isCreateDhcpNameSpace(l3VO.getUuid())) { + completion.success(); + return; + } + refreshDhcpInfoToHosts(l3VO, new Completion(completion) { @Override public void success() { @@ -2792,7 +2842,7 @@ public void done(ErrorCodeList errorCodeList) { @Override public void disableNetworkService(L3NetworkVO l3VO, Completion completion) { - if (!isProvidedByMe(l3VO.getUuid())) { + if (!isCreateDhcpNameSpace(l3VO.getUuid())) { completion.success(); return; } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java index fd568a9b797..834ded414e6 100644 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipApiInterceptor.java @@ -106,7 +106,8 @@ protected void validate(APIAttachEipMsg msg) { /* TODO: this is temp limitation, ipv6 eip can be only attached to flat eip */ EipVO eip = Q.New(EipVO.class).eq(EipVO_.uuid, msg.getEipUuid()).find(); if (IPv6NetworkUtils.isIpv6Address(eip.getVipIp()) && !providerType.toString().equals(FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING)) { - throw new ApiMessageInterceptionException(argerr("could not attach eip because ipv6 eip can ONLY be attached to flat network")); +// throw new ApiMessageInterceptionException(argerr("could not attach eip because ipv6 eip can ONLY be attached to flat network")); + return; } if (!providerType.toString().equals(FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING)) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java index 37deaccd938..69dbf627c28 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java @@ -55,10 +55,7 @@ import javax.persistence.Tuple; import javax.persistence.TypedQuery; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -684,7 +681,8 @@ public void run(MessageReply reply) { } for (AfterApplyFlatEipExtensionPoint ext : pluginRgty.getExtensionList(AfterApplyFlatEipExtensionPoint.class)) { - ext.AfterApplyFlatEip(asList(struct.getVip().getUuid()), hostUuid); + ext.AfterApplyFlatEip(Collections.singletonList(struct.getVip().getUuid()), hostUuid); + ext.cleanGatewayArpEntry(struct.getNic().getVmInstanceUuid(), struct.getGuestIp().getGateway()); } completion.success(); diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java index c1a05abf60a..dacc2d2a985 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatProviderFactory.java @@ -10,6 +10,7 @@ import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.VSwitchType; import org.zstack.header.network.service.*; import org.zstack.network.service.eip.EipConstant; import org.zstack.network.service.userdata.UserdataConstant; @@ -49,6 +50,9 @@ public NetworkServiceProvider getNetworkServiceProvider(NetworkServiceProviderVO @Override public void prepareDbInitialValue() { + FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE.setCreateDhcpNameSpace(true); + FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE.setAllocateDhcpServerIp(true); + SimpleQuery query = dbf.createQuery(NetworkServiceProviderVO.class); query.add(NetworkServiceProviderVO_.type, Op.EQ, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); NetworkServiceProviderVO rpvo = query.find(); @@ -112,6 +116,11 @@ public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkExcep @Override public void afterCreateL2Network(L2NetworkInventory l2Network) { + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() != null) { + return; + } + NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO(); ref.setL2NetworkUuid(l2Network.getUuid()); ref.setNetworkServiceProviderUuid(flatProvider.getUuid()); diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java index c465b61b3a7..c7b9181da1b 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java @@ -19,13 +19,11 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.core.Completion; -import org.zstack.header.core.FutureCompletion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; -import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostConstant; import org.zstack.header.host.HostStatus; import org.zstack.header.host.HostVO; @@ -36,6 +34,7 @@ import org.zstack.header.network.l3.*; import org.zstack.header.network.service.*; import org.zstack.header.vm.*; +import org.zstack.header.zone.ZoneVO; import org.zstack.kvm.*; import org.zstack.kvm.KVMAgentCommands.AgentResponse; import org.zstack.network.l2.L2NetworkHostHelper; @@ -83,6 +82,114 @@ public class FlatUserdataBackend implements UserdataBackend, KVMHostConnectExten public static final String RELEASE_USER_DATA = "/flatnetworkprovider/userdata/release"; public static final String CLEANUP_USER_DATA = "/flatnetworkprovider/userdata/cleanup"; + private String getVmNicMacAddressByVmInstanceUuid(String vmInstanceUuid) { + String sql = "SELECT nic.mac " + + "FROM VmInstanceVO vm " + + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + + "WHERE vm.uuid = :vmInstanceUuid " + + "AND nic.l3NetworkUuid = vm.defaultL3NetworkUuid"; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, String.class); + q.setParameter("vmInstanceUuid", vmInstanceUuid); + + List resultList = q.getResultList(); + if (resultList.isEmpty()) { + return null; + } + return resultList.get(0); + } + + + private String getZoneNameByVmInstanceUuid(String vmInstanceUuid) { + VmInstanceVO vmInstance = dbf.findByUuid(vmInstanceUuid, VmInstanceVO.class); + if (vmInstance == null || vmInstance.getZoneUuid() == null) { + return null; + } + + String zoneId = vmInstance.getZoneUuid(); + + ZoneVO zone = dbf.findByUuid(zoneId, ZoneVO.class); + if (zone == null) { + return null; + } + + return zone.getName(); + } + + private String getDnsServersIpFromVm(String vmInstanceUuid) { + String sql = "SELECT dns.dns FROM VmInstanceVO AS v " + + "JOIN L3NetworkDnsVO AS dns ON v.defaultL3NetworkUuid = dns.l3NetworkUuid " + + "WHERE v.uuid = :vmInstanceUuid"; + + TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); + query.setParameter("vmInstanceUuid", vmInstanceUuid); + List dnsServers = query.getResultList(); + if (dnsServers.isEmpty()) { + return null; + } + + StringBuilder dnsIpListBuilder = new StringBuilder(); + for (String dnsIp : dnsServers) { + dnsIpListBuilder.append(dnsIp).append("\n"); + } + // Delete the last extra newline character, if it exists. + if (dnsIpListBuilder.length() > 0) { + dnsIpListBuilder.setLength(dnsIpListBuilder.length() - 1); + } + + return dnsIpListBuilder.toString(); + } + + private String getVpcIdByVmInstanceUuid(String vmInstanceUuid) { + String sql = "SELECT DISTINCT vm.uuid " + + "FROM VmInstanceVO vm " + + "JOIN VmNicVO nic ON vm.uuid = nic.vmInstanceUuid " + + "WHERE vm.type = 'ApplianceVm' " + + "AND nic.l3NetworkUuid IN (" + + " SELECT v.defaultL3NetworkUuid " + + " FROM VmInstanceVO v " + + " WHERE v.uuid = :vmInstanceUuid" + + ")"; + + TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); + query.setParameter("vmInstanceUuid", vmInstanceUuid); + + List results = query.getResultList(); + if (results.isEmpty()) { + return null; + } + + return results.get(0); + } + + private List getNetworkInterfaceDetails(String vmInstanceUuid) { + String sql = "select DISTINCT nic.mac, nic.ip, nic.netmask, nic.gateway, ipr.networkCidr " + + "from VmNicVO nic " + + "join IpRangeVO ipr on nic.l3NetworkUuid = ipr.l3NetworkUuid " + + "where nic.vmInstanceUuid = :vmInstanceUuid " + + "and nic.ipVersion = :ipVersion "; + + TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); + q.setParameter("vmInstanceUuid", vmInstanceUuid); + q.setParameter("ipVersion", IPv6Constants.IPv4); + List ts = q.getResultList(); + + List networkInterfaceDetailsList = new ArrayList<>(); + + for (Tuple t : ts) { + NetworkInterfaceDetails details = new NetworkInterfaceDetails(); + details.macAddress = t.get(0, String.class); + details.ip = t.get(1, String.class); + details.netmask = t.get(2, String.class); + details.gateway = t.get(3, String.class); + details.vpcCidrBlock = t.get(4, String.class); + details.vSwitchCidrBlock = t.get(4, String.class); + networkInterfaceDetailsList.add(details); + } + + return networkInterfaceDetailsList; + } + @Override public Flow createKvmHostConnectingFlow(final KVMHostConnectedContext context) { return createHostPrepareUserdataFlow(context.getInventory().getUuid()); @@ -126,7 +233,7 @@ private Map getVmIpL3Uuid(List vmUuids) { "NetworkServiceProviderVO pro, UsedIpVO ip where " + " vm.uuid = nic.vmInstanceUuid and vm.uuid in (:uuids)" + " and nic.uuid = ip.vmNicUuid " + - " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipversion" + + " and ip.l3NetworkUuid = vm.defaultL3NetworkUuid and ip.ipVersion = :ipVersion" + " and ref.networkServiceProviderUuid = pro.uuid" + " and ref.l3NetworkUuid = vm.defaultL3NetworkUuid" + " and pro.type = :proType"; @@ -135,7 +242,7 @@ private Map getVmIpL3Uuid(List vmUuids) { q.setParameter("uuids", vmUuids); q.setParameter("proType", FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING); /* current only ipv4 has userdata */ - q.setParameter("ipversion", IPv6Constants.IPv4); + q.setParameter("ipVersion", IPv6Constants.IPv4); List ts = q.getResultList(); Map ret = new HashMap(); @@ -191,6 +298,10 @@ private List getUserData() { MetadataTO mto = new MetadataTO(); mto.vmUuid = vmuuid; mto.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(vmuuid, VmSystemTags.HOSTNAME_TOKEN); + mto.regionName = getZoneNameByVmInstanceUuid(vmuuid); + mto.mac = getVmNicMacAddressByVmInstanceUuid(vmuuid); + mto.dnsServersIp = getDnsServersIpFromVm(vmuuid); + mto.vpcId = getVpcIdByVmInstanceUuid(vmuuid); to.metadata = mto; VmIpL3Uuid l = vmipl3.get(vmuuid); @@ -209,6 +320,7 @@ private List getUserData() { continue; } + to.networkInterfaces = getNetworkInterfaceDetails(vmuuid); to.dhcpServerIp = l.dhcpServerIp; to.vmIp = l.vmIp; to.netmask = l.netmask; @@ -483,6 +595,7 @@ public void fail(ErrorCode errorCode) { public static class UserdataTO { public MetadataTO metadata; + public List networkInterfaces; public List userdataList = new ArrayList<>(); public String vmIp; public String netmask; @@ -498,6 +611,19 @@ public static class UserdataTO { public static class MetadataTO { public String vmUuid; public String vmHostname; + public String regionName; + public String mac; + public String dnsServersIp; + public String vpcId; + } + + public static class NetworkInterfaceDetails { + public String macAddress; + public String ip; + public String vpcCidrBlock; + public String vSwitchCidrBlock; + public String netmask; + public String gateway; } public static class CleanupUserdataCmd extends KVMAgentCommands.AgentCommand { @@ -561,7 +687,7 @@ private boolean hasUserdata(UserdataStruct struct) { @Override public void applyUserdata(final UserdataStruct struct, final Completion completion) { if (!UserdataGlobalConfig.OPEN_USERDATA_SERVICE_BY_DEFAULT.value(Boolean.class)) { - if ( !hasMetedata(struct) && !hasUserdata(struct)) { + if (!hasMetedata(struct) && !hasUserdata(struct)) { completion.success(); return; } @@ -585,7 +711,7 @@ public VmNicInventory call(VmNicInventory arg) { } L3NetworkVO defaultL3 = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, struct.getL3NetworkUuid()).find(); - if (defaultL3!= null && defaultL3.getNetworkServices().stream().noneMatch( + if (defaultL3 != null && defaultL3.getNetworkServices().stream().noneMatch( service -> Objects.equals(UserdataConstant.USERDATA_TYPE_STRING, service.getNetworkServiceType()))) { completion.success(); return; @@ -653,8 +779,13 @@ public void run(final FlowTrigger trigger, Map data) { MetadataTO to = new MetadataTO(); to.vmUuid = struct.getVmUuid(); to.vmHostname = VmSystemTags.HOSTNAME.getTokenByResourceUuid(struct.getVmUuid(), VmSystemTags.HOSTNAME_TOKEN); + to.regionName = getZoneNameByVmInstanceUuid(struct.getVmUuid()); + to.mac = destNic.getMac(); + to.dnsServersIp = getDnsServersIpFromVm(struct.getVmUuid()); + to.vpcId = getVpcIdByVmInstanceUuid(struct.getVmUuid()); UserdataTO uto = new UserdataTO(); uto.metadata = to; + uto.networkInterfaces = getNetworkInterfaceDetails(struct.getVmUuid()); uto.userdataList = struct.getUserdataList(); uto.dhcpServerIp = dhcpServerIp; uto.vmIp = ipv4.getIp(); @@ -823,7 +954,7 @@ public void handle(ErrorCode errCode, Map data) { whileCompletion.allDone(); } }).start(); - },10).run(new WhileDoneCompletion(null) { + }, 10).run(new WhileDoneCompletion(null) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java index 248dcfa0e57..8e75c4edd53 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataExtension.java @@ -4,6 +4,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.Component; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; @@ -11,14 +12,15 @@ import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.network.service.*; import org.zstack.header.vm.VmInstanceSpec; +import org.zstack.header.vm.VmNicInventory; import org.zstack.header.vm.VmNicSpec; import org.zstack.network.securitygroup.SecurityGroupGetDefaultRuleExtensionPoint; import org.zstack.network.service.AbstractNetworkServiceExtension; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; -import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.IPv6Constants; @@ -66,14 +68,10 @@ public NetworkServiceType getNetworkServiceType() { return UserdataConstant.USERDATA_TYPE; } - private NetworkServiceProviderInventory findProvider(final VmInstanceSpec spec) { - L3NetworkInventory defaultL3 = CollectionUtils.find(VmNicSpec.getL3NetworkInventoryOfSpec(spec.getL3Networks()), - new Function() { - @Override - public L3NetworkInventory call(L3NetworkInventory arg) { - return arg.getUuid().equals(spec.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null; - } - }); + private NetworkServiceProviderInventory findProvider(final L3NetworkInventory defaultL3) { + if (defaultL3 == null || defaultL3.getNetworkServices() == null) { + return null; + } for (NetworkServiceL3NetworkRefInventory ref : defaultL3.getNetworkServices()) { if (UserdataConstant.USERDATA_TYPE_STRING.equals(ref.getNetworkServiceType())) { @@ -96,12 +94,21 @@ private UserdataBackend getUserdataBackend(String providerType) { @Override public void applyNetworkService(final VmInstanceSpec servedVm, Map data, Completion completion) { L3NetworkInventory defaultL3 = CollectionUtils.find(VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks()), - new Function() { - @Override - public L3NetworkInventory call(L3NetworkInventory arg) { - return arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null; + arg -> arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null); + VmNicInventory defaultNic = null; + if (defaultL3 == null && servedVm.getVmInventory().getDefaultL3NetworkUuid() != null && UserdataGlobalProperty.APPLY_WITH_NONE_DEFAULT_NIC) { + L3NetworkVO l3 = Q.New(L3NetworkVO.class) + .eq(L3NetworkVO_.uuid, servedVm.getVmInventory().getDefaultL3NetworkUuid()) + .find(); + if (l3 != null) { + defaultL3 = L3NetworkInventory.valueOf(l3); + final String defaultL3Uuid = defaultL3.getUuid(); + defaultNic = servedVm.getVmInventory().getVmNics().stream() + .filter(vmNic -> vmNic.getL3NetworkUuid().equals(defaultL3Uuid)) + .findFirst() + .orElse(null); } - }); + } if (defaultL3 == null) { // the L3 for operation is not the default L3 @@ -115,7 +122,7 @@ public L3NetworkInventory call(L3NetworkInventory arg) { return; } - NetworkServiceProviderInventory provider = findProvider(servedVm); + NetworkServiceProviderInventory provider = findProvider(defaultL3); if (provider == null) { completion.success(); return; @@ -125,7 +132,9 @@ public L3NetworkInventory call(L3NetworkInventory arg) { struct.setL3NetworkUuid(servedVm.getVmInventory().getDefaultL3NetworkUuid()); struct.setParametersFromVmSpec(servedVm); struct.setUserdataList(servedVm.getUserdataList()); - + if (defaultNic != null) { + struct.getVmNics().add(defaultNic); + } UserdataBackend bkd = getUserdataBackend(provider.getType()); bkd.applyUserdata(struct, completion); } @@ -144,12 +153,7 @@ public List getGroupMembers(String sgUuid, int ipVersion) { @Override public void releaseNetworkService(final VmInstanceSpec servedVm, Map data, final NoErrorCompletion completion) { L3NetworkInventory defaultL3 = CollectionUtils.find(VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks()), - new Function() { - @Override - public L3NetworkInventory call(L3NetworkInventory arg) { - return arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null; - } - }); + arg -> arg.getUuid().equals(servedVm.getVmInventory().getDefaultL3NetworkUuid()) ? arg : null); if (!Optional.ofNullable(servedVm.getDestHost()).isPresent()){ completion.done(); return; @@ -166,7 +170,7 @@ public L3NetworkInventory call(L3NetworkInventory arg) { return; } - NetworkServiceProviderInventory provider = findProvider(servedVm); + NetworkServiceProviderInventory provider = findProvider(defaultL3); if (provider == null) { completion.done(); return; diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java index 50bbd0c6862..c6d8e4edad2 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/userdata/UserdataGlobalProperty.java @@ -10,4 +10,7 @@ public class UserdataGlobalProperty { @GlobalProperty(name="Userdata.hostPort", defaultValue = "1180") public static int HOST_PORT; + + @GlobalProperty(name="Userdata.applyWithNoneDefaultNic", defaultValue = "false") + public static boolean APPLY_WITH_NONE_DEFAULT_NIC; } diff --git a/plugin/hostNetworkInterface/pom.xml b/plugin/hostNetworkInterface/pom.xml index 0b391b48fb0..bb0d6ab3596 100644 --- a/plugin/hostNetworkInterface/pom.xml +++ b/plugin/hostNetworkInterface/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 hostNetworkInterface diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java new file mode 100644 index 00000000000..a5dc969af22 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsg.java @@ -0,0 +1,34 @@ +package org.zstack.network.hostNetworkInterface; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostConstant; +import org.zstack.header.identity.Action; +import org.zstack.header.query.APIQueryMessage; +import org.zstack.header.query.AutoQuery; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +import static java.util.Arrays.asList; + +/** + * Created with IntelliJ IDEA. + * User: frank + * Time: 8:34 PM + * To change this template use File | Settings | File Templates. + */ +@AutoQuery(replyClass = APIQueryPhysicalSwitchReply.class, inventoryClass = PhysicalSwitchInventory.class) +@Action(category = HostConstant.ACTION_CATEGORY, names = {"read"}) +@RestRequest( + path = "/topo/physical-switches", + optionalPaths = {"/topo/physical-switches/{uuid}"}, + method = HttpMethod.GET, + responseClass = APIQueryPhysicalSwitchReply.class +) +public class APIQueryPhysicalSwitchMsg extends APIQueryMessage { + + public static List __example__() { + return asList("uuid=" + uuid()); + } + +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..31b125d3f80 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchMsgDoc_zh_cn.groovy @@ -0,0 +1,31 @@ +package org.zstack.network.hostNetworkInterface + +import org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchReply +import org.zstack.header.query.APIQueryMessage + +doc { + title "QueryPhysicalSwitch" + + category "二层网络" + + desc """查询物理机交换机信息""" + + rest { + request { + url "GET /v1/topo/physical-switches" + url "GET /v1/topo/physical-switches/{uuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIQueryPhysicalSwitchMsg.class + + desc """""" + + params APIQueryMessage.class + } + + response { + clz APIQueryPhysicalSwitchReply.class + } + } +} \ No newline at end of file diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java new file mode 100644 index 00000000000..562c34887e8 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReply.java @@ -0,0 +1,41 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.query.APIQueryReply; +import org.zstack.header.rest.RestResponse; + +import java.util.List; + +import static org.zstack.utils.CollectionDSL.list; + +/** + * Created with IntelliJ IDEA. + * User: frank + * Time: 8:35 PM + * To change this template use File | Settings | File Templates. + */ +@RestResponse(allTo = "inventories") +public class APIQueryPhysicalSwitchReply extends APIQueryReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public static APIQueryPhysicalSwitchReply __example__() { + APIQueryPhysicalSwitchReply reply = new APIQueryPhysicalSwitchReply(); + + PhysicalSwitchInventory phySwitch = new PhysicalSwitchInventory(); + phySwitch.setName("test-sdn"); + phySwitch.setUuid(uuid()); + phySwitch.setDescription("sdn for test"); + phySwitch.setIp("192.168.1.1"); + + reply.setInventories(list(phySwitch)); + return reply; + } + +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy new file mode 100644 index 00000000000..a3e9bfc00c0 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/APIQueryPhysicalSwitchReplyDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.network.hostNetworkInterface + +import org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "query physical switch" + + ref { + name "inventories" + path "org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchReply.inventories" + desc "List of physical switch inventories returned by the query" + type "List" + since "5.3.28" + clz PhysicalSwitchInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.network.hostNetworkInterface.APIQueryPhysicalSwitchReply.error" + desc "Error code, null indicates success, non-null indicates operation failure" + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java new file mode 100644 index 00000000000..eebf1f8ee76 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceCanonicalEvents.java @@ -0,0 +1,38 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.message.NeedJsonSchema; + +public class HostNetworkInterfaceCanonicalEvents { + public static final String PEER_PORT_CHANGED = "/network/host-network-interface/peer-changed"; + + @NeedJsonSchema + public static class PeerPortChangedData { + private String interfaceUuid; + private PhysicalSwitchPortInventory oldPhysicalSwitchPort; + private PhysicalSwitchPortInventory newPhysiaclSwitchPort; + + public String getInterfaceUuid() { + return interfaceUuid; + } + + public void setInterfaceUuid(String interfaceUuid) { + this.interfaceUuid = interfaceUuid; + } + + public PhysicalSwitchPortInventory getOldPhysicalSwitchPort() { + return oldPhysicalSwitchPort; + } + + public void setOldPhysicalSwitchPort(PhysicalSwitchPortInventory oldPhysicalSwitchPort) { + this.oldPhysicalSwitchPort = oldPhysicalSwitchPort; + } + + public PhysicalSwitchPortInventory getNewPhysiaclSwitchPort() { + return newPhysiaclSwitchPort; + } + + public void setNewPhysiaclSwitchPort(PhysicalSwitchPortInventory newPhysiaclSwitchPort) { + this.newPhysiaclSwitchPort = newPhysiaclSwitchPort; + } + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java new file mode 100644 index 00000000000..995c2d945ff --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceConstant.java @@ -0,0 +1,11 @@ +package org.zstack.network.hostNetworkInterface; + +import java.util.Arrays; +import java.util.List; + +public interface HostNetworkInterfaceConstant { + String NIC_DRIVER_TYPE_VFIO_PCI = "vfio-pci"; + String NIC_DRIVER_TYPE_UIO_PCI = "uio_pci_generic"; + + List VFIO_DRIVER_TYPES = Arrays.asList(NIC_DRIVER_TYPE_VFIO_PCI, NIC_DRIVER_TYPE_UIO_PCI); +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java index 9583c88a5c9..5ad59b9d668 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceInventory.java @@ -40,6 +40,7 @@ public class HostNetworkInterfaceInventory implements Serializable { private String mac; private String callBackIp; private String pciDeviceAddress; + private String driverType; private String offloadStatus; private String virtStatus; private String description; @@ -247,6 +248,7 @@ public HostNetworkInterfaceInventory(HostNetworkInterfaceVO vo) { this.interfaceType = vo.getInterfaceType(); this.mac = vo.getMac(); this.pciDeviceAddress = vo.getPciDeviceAddress(); + this.driverType = vo.getDriverType(); if (vo.getIpAddresses() != null) { this.ipAddresses = Arrays.asList(vo.getIpAddresses().split(",")); } @@ -269,4 +271,12 @@ public static HostNetworkInterfaceInventory valueOf(HostNetworkInterfaceVO vo) { public static List valueOf(Collection vos) { return vos.stream().map(HostNetworkInterfaceInventory::valueOf).collect(Collectors.toList()); } + + public String getDriverType() { + return driverType; + } + + public void setDriverType(String driverType) { + this.driverType = driverType; + } } diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java index dc56e726288..18a4c1e3269 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO.java @@ -73,6 +73,9 @@ public class HostNetworkInterfaceVO extends ResourceVO implements ToInventory, O @Column private String pciDeviceAddress; + @Column + private String driverType; + @Column private String offloadStatus; @@ -267,6 +270,14 @@ public void setLastOpDate(Timestamp lastOpDate) { this.lastOpDate = lastOpDate; } + public String getDriverType() { + return driverType; + } + + public void setDriverType(String driverType) { + this.driverType = driverType; + } + @Override public String getAccountUuid() { return accountUuid; diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java index 717cc645bfc..d9980b06cdb 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/HostNetworkInterfaceVO_.java @@ -25,7 +25,9 @@ public class HostNetworkInterfaceVO_ extends ResourceVO_ { public static volatile SingularAttribute gateway; public static volatile SingularAttribute callBackIp; public static volatile SingularAttribute pciDeviceAddress; + public static volatile SingularAttribute driverType; public static volatile SingularAttribute offloadStatus; + public static volatile SingularAttribute virtStatus; public static volatile SingularAttribute speed; public static volatile SingularAttribute slaveActive; public static volatile SingularAttribute carrierActive; diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java new file mode 100644 index 00000000000..04fe8bc246a --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PackageInfo.java @@ -0,0 +1,10 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.PackageAPIInfo; + +@PackageAPIInfo( + APICategoryName = "物理机网络", + permissions = {PackageAPIInfo.PERMISSION_COMMUNITY_AVAILABLE, PackageAPIInfo.PERMISSION_ZSV_BASIC_AVAILABLE} +) +public class PackageInfo { +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java new file mode 100644 index 00000000000..47b4bff1fc7 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventory.java @@ -0,0 +1,143 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; +import org.zstack.header.vm.VmNicInventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Physical Switch Inventory + */ +@Inventory(mappingVOClass = PhysicalSwitchVO.class) +@PythonClassInventory +public class PhysicalSwitchInventory implements Serializable { + + private String uuid; + private String name; + private String description; + private String ip; + private String mac; + private String mode; + private String softwareVersion; + private String sdnControllerUuid; + private Timestamp createDate; + private Timestamp lastOpDate; + private List ports; + + public static PhysicalSwitchInventory valueOf(PhysicalSwitchVO vo) { + PhysicalSwitchInventory inv = new PhysicalSwitchInventory(); + inv.setUuid(vo.getUuid()); + inv.setName(vo.getName()); + inv.setDescription(vo.getDescription()); + inv.setIp(vo.getIp()); + inv.setMac(vo.getMac()); + inv.setMode(vo.getMode()); + inv.setSoftwareVersion(vo.getSoftwareVersion()); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + inv.setPorts(PhysicalSwitchPortInventory.valueOf(vo.getPorts())); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (PhysicalSwitchVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getSoftwareVersion() { + return softwareVersion; + } + + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public List getPorts() { + return ports; + } + + public void setPorts(List ports) { + this.ports = ports; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..86520347a16 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchInventoryDoc_zh_cn.groovy @@ -0,0 +1,78 @@ +package org.zstack.network.hostNetworkInterface + +import java.sql.Timestamp +import org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory + +doc { + + title "物理交换机清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.28" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.3.28" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.28" + } + field { + name "ip" + desc "物理交换机管理IP地址" + type "String" + since "5.3.28" + } + field { + name "mac" + desc "物理交换机MAC地址" + type "String" + since "5.3.28" + } + field { + name "mode" + desc "物理交换机工作模式(Switch,Router)" + type "String" + since "5.3.28" + } + field { + name "softwareVersion" + desc "物理交换机软件版本" + type "String" + since "5.3.28" + } + field { + name "sdnControllerUuid" + desc "SDN控制器uuid" + type "String" + since "5.3.28" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.28" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.28" + } + ref { + name "ports" + path "org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory.ports" + desc "null" + type "List" + since "5.3.28" + clz PhysicalSwitchPortInventory.class + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java new file mode 100644 index 00000000000..917b18ae891 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventory.java @@ -0,0 +1,135 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Physical Switch Port Inventory + */ +@Inventory(mappingVOClass = PhysicalSwitchPortVO.class) +@PythonClassInventory +public class PhysicalSwitchPortInventory implements Serializable { + + private String uuid; + private String name; + private String description; + private String ethTrunkName; + private String portType; + private String peerInterfaceUuid; + private String switchUuid; + private String sdnControllerUuid; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static PhysicalSwitchPortInventory valueOf(PhysicalSwitchPortVO vo) { + if (vo == null) { + return null; + } + PhysicalSwitchPortInventory inv = new PhysicalSwitchPortInventory(); + inv.setUuid(vo.getUuid()); + inv.setName(vo.getName()); + inv.setDescription(vo.getDescription()); + inv.setEthTrunkName(vo.getEthTrunkName()); + inv.setPortType(vo.getPortType()); + inv.setPeerInterfaceUuid(vo.getPeerInterfaceUuid()); + inv.setSwitchUuid(vo.getSwitchUuid()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (PhysicalSwitchPortVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getEthTrunkName() { + return ethTrunkName; + } + + public void setEthTrunkName(String ethTrunkName) { + this.ethTrunkName = ethTrunkName; + } + + public String getPortType() { + return portType; + } + + public void setPortType(String portType) { + this.portType = portType; + } + + public String getPeerInterfaceUuid() { + return peerInterfaceUuid; + } + + public void setPeerInterfaceUuid(String peerInterfaceUuid) { + this.peerInterfaceUuid = peerInterfaceUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public String getSwitchUuid() { + return switchUuid; + } + + public void setSwitchUuid(String switchUuid) { + this.switchUuid = switchUuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..8da98357885 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortInventoryDoc_zh_cn.groovy @@ -0,0 +1,69 @@ +package org.zstack.network.hostNetworkInterface + +import java.sql.Timestamp + +doc { + + title "物理交换机端口清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.28" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.3.28" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.3.28" + } + field { + name "ethTrunkName" + desc "物理交换机端口所属的trunk名称" + type "String" + since "5.3.28" + } + field { + name "portType" + desc "物理交换机端口链路类型" + type "String" + since "5.3.28" + } + field { + name "peerInterfaceUuid" + desc "物理交换机端口连接服务器接口uuid" + type "String" + since "5.3.28" + } + field { + name "switchUuid" + desc "物理交换机端口所属交换机uuid" + type "String" + since "5.3.28" + } + field { + name "sdnControllerUuid" + desc "SDN控制器uuid" + type "String" + since "5.3.28" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.28" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.28" + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java new file mode 100644 index 00000000000..9480d946f2b --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO.java @@ -0,0 +1,150 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.identity.OwnedByAccount; +import org.zstack.header.tag.AutoDeleteTag; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Physical Switch Port Value Object + */ +@Entity +@Table(name = "PhysicalSwitchPortVO") +@AutoDeleteTag +public class PhysicalSwitchPortVO extends ResourceVO implements ToInventory, OwnedByAccount { + + @Column + private String name; + + @Column + private String description; + + @Column + private String ethTrunkName; + + @Column + private String portType; + + @Column + @ForeignKey(parentEntityClass = PhysicalSwitchVO.class, parentKey = "uuid", onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String switchUuid; + + @Column + @ForeignKey(parentEntityClass = HostNetworkInterfaceVO.class, parentKey = "uuid") + private String peerInterfaceUuid; + + @Column + private String sdnControllerUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @Transient + private String accountUuid; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getEthTrunkName() { + return ethTrunkName; + } + + public void setEthTrunkName(String ethTrunkName) { + this.ethTrunkName = ethTrunkName; + } + + public String getPortType() { + return portType; + } + + public void setPortType(String portType) { + this.portType = portType; + } + + public String getPeerInterfaceUuid() { + return peerInterfaceUuid; + } + + public void setPeerInterfaceUuid(String peerInterfaceUuid) { + this.peerInterfaceUuid = peerInterfaceUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + public String getSwitchUuid() { + return switchUuid; + } + + public void setSwitchUuid(String switchUuid) { + this.switchUuid = switchUuid; + } + + @Override + public String getAccountUuid() { + return accountUuid; + } + + @Override + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public void copyFromAnother(PhysicalSwitchPortVO vo) { + this.name = vo.name; + this.description = vo.description; + this.ethTrunkName = vo.ethTrunkName; + this.portType = vo.portType; + this.switchUuid = vo.switchUuid; + this.sdnControllerUuid = vo.sdnControllerUuid; + if (vo.getPeerInterfaceUuid() != null) { + this.peerInterfaceUuid = vo.getPeerInterfaceUuid(); + } + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java new file mode 100644 index 00000000000..76d963b73e4 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchPortVO_.java @@ -0,0 +1,23 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Physical Switch Port VO Metamodel + */ +@StaticMetamodel(PhysicalSwitchPortVO.class) +public class PhysicalSwitchPortVO_ extends ResourceVO_ { + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute ethTrunkName; + public static volatile SingularAttribute portType; + public static volatile SingularAttribute peerInterfaceUuid; + public static volatile SingularAttribute switchUuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java new file mode 100644 index 00000000000..8c8cb7bbce8 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO.java @@ -0,0 +1,162 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.identity.OwnedByAccount; +import org.zstack.header.tag.AutoDeleteTag; +import org.zstack.header.vm.VmNicVO; +import org.zstack.header.vo.NoView; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; +import java.util.HashSet; +import java.util.Set; + +/** + * Physical Switch Value Object + */ +@Entity +@Table +@AutoDeleteTag +public class PhysicalSwitchVO extends ResourceVO implements ToInventory, OwnedByAccount { + + @Column + private String name; + + @Column + private String description; + + @Column + private String ip; + + @Column + private String mac; + + @Column + private String mode; + + @Column + private String softwareVersion; + + @Column + private String sdnControllerUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @Transient + private String accountUuid; + + @OneToMany(fetch = FetchType.EAGER) + @JoinColumn(name = "switchUuid", insertable = false, updatable = false) + @NoView + private Set ports = new HashSet(); + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getSoftwareVersion() { + return softwareVersion; + } + + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + + @Override + public String getAccountUuid() { + return accountUuid; + } + + @Override + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + public Set getPorts() { + return ports; + } + + public void setPorts(Set ports) { + this.ports = ports; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public void copyFromAnother(PhysicalSwitchVO vo) { + this.name = vo.name; + this.description = vo.description; + this.ip = vo.ip; + this.mac = vo.mac; + this.mode = vo.mode; + this.softwareVersion = vo.softwareVersion; + this.sdnControllerUuid = vo.sdnControllerUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java new file mode 100644 index 00000000000..ac2f1c68b4d --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/PhysicalSwitchVO_.java @@ -0,0 +1,23 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Physical Switch VO Metamodel + */ +@StaticMetamodel(PhysicalSwitchVO.class) +public class PhysicalSwitchVO_ extends ResourceVO_ { + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute ip; + public static volatile SingularAttribute mac; + public static volatile SingularAttribute mode; + public static volatile SingularAttribute softwareVersion; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java new file mode 100644 index 00000000000..fd189fcb4d0 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/RBACInfo.java @@ -0,0 +1,32 @@ +package org.zstack.network.hostNetworkInterface; + +import org.zstack.header.identity.rbac.RBACDescription; + +public class RBACInfo implements RBACDescription { + @Override + public void permissions() { + permissionBuilder() + .name("hostNetwork") + .adminOnlyAPIs("org.zstack.network.hostNetworkInterface.**") + .build(); + } + + @Override + public void contributeToRoles() { + + } + + @Override + public void roles() { + roleBuilder() + .name("hostNetwork") + .uuid("4266a77e46cb4e68864899458287941e") + .permissionsByName("hostNetwork") + .build(); + } + + @Override + public void globalReadableResources() { + + } +} \ No newline at end of file diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java new file mode 100644 index 00000000000..0228ae0e20c --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpGlobalConfig.java @@ -0,0 +1,13 @@ +package org.zstack.network.hostNetworkInterface.lldp; + +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; +import org.zstack.core.config.GlobalConfigDefinition; + +@GlobalConfigDefinition +public class LldpGlobalConfig { + public static final String CATEGORY = "lldp"; + + @GlobalConfigDef(defaultValue = "false", type = Boolean.class, description = "auto pull host network interface lldp neighbour if it's true") + public static GlobalConfig AUTO_GET_LLDP_NEIGHBOUR = new GlobalConfig(CATEGORY, "auto.get.lldp.neighbour"); +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java index 98cd7a92d31..8c65ffb3597 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpKvmAgentCommands.java @@ -1,5 +1,6 @@ package org.zstack.network.hostNetworkInterface.lldp; +import org.zstack.core.upgrade.GrayVersion; import org.zstack.core.validation.ConditionalValidation; import java.util.List; @@ -36,6 +37,7 @@ public boolean needValidation() { } public static class ChangeLldpModeCmd extends AgentCommand { + @GrayVersion(value = "5.0.0") private List physicalInterfaceNames; private String mode; @@ -61,6 +63,7 @@ public static class ChangeLldpModeResponse extends AgentResponse { } public static class GetLldpInfoCmd extends AgentCommand { + @GrayVersion(value = "5.0.0") private String physicalInterfaceName; public String getPhysicalInterfaceName() { @@ -73,6 +76,7 @@ public void setPhysicalInterfaceName(String physicalInterfaceName) { } public static class GetLldpInfoResponse extends AgentResponse { + @GrayVersion(value = "5.0.0") private LldpInfoStruct lldpInfo; public LldpInfoStruct getLldpInfo() { diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java index 8a9495eaaaf..420a6ef544a 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/LldpManagerImpl.java @@ -1,16 +1,19 @@ package org.zstack.network.hostNetworkInterface.lldp; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.cloudbus.EventFacade; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.Platform; import org.zstack.core.db.SQL; import org.zstack.header.AbstractService; -import org.zstack.header.core.Completion; +import org.zstack.header.core.*; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.host.*; import org.zstack.header.identity.AccountConstant; import org.zstack.header.message.APIMessage; @@ -18,6 +21,8 @@ import org.zstack.header.message.MessageReply; import org.zstack.kvm.KVMHostAsyncHttpCallMsg; import org.zstack.kvm.KVMHostAsyncHttpCallReply; +import org.zstack.kvm.KVMHostInventory; +import org.zstack.kvm.KVMPingAgentNoFailureExtensionPoint; import org.zstack.network.hostNetworkInterface.*; import org.zstack.network.hostNetworkInterface.lldp.api.*; import org.zstack.network.hostNetworkInterface.lldp.entity.*; @@ -31,14 +36,24 @@ import static org.zstack.core.Platform.operr; -public class LldpManagerImpl extends AbstractService implements HostAfterConnectedExtensionPoint, HostDeleteExtensionPoint { +public class LldpManagerImpl extends AbstractService implements HostAfterConnectedExtensionPoint, HostDeleteExtensionPoint, + KVMPingAgentNoFailureExtensionPoint { private static final CLogger logger = Utils.getLogger(LldpManagerImpl.class); @Autowired private DatabaseFacade dbf; @Autowired private CloudBus bus; + @Autowired + private EventFacade evtf; + + private enum LLDPGetNeighbourState { + None, + STARTING, + Done, + } + private final Map getNeighbourStateMap = new ConcurrentHashMap<>(); private final Map interfaceLocks = new ConcurrentHashMap<>(); private Object getInterfaceLock(String interfaceUuid) { @@ -61,7 +76,11 @@ public void handleMessage(Message msg) { } private void handleLocalMessage(Message msg) { - bus.dealWithUnknownMessage(msg); + if (msg instanceof GetHostNetworkInterfaceLldpMsg) { + handle((GetHostNetworkInterfaceLldpMsg) msg); + } else { + bus.dealWithUnknownMessage(msg); + } } private void handleApiMessage(APIMessage msg) { @@ -167,43 +186,136 @@ private synchronized void syncHostNetworkInterfaceLldpInDb(String interfaceUuid, refVO.setLastOpDate(new Timestamp(System.currentTimeMillis())); dbf.updateAndRefresh(refVO); } + + /* link host network interface to physical interface based on: + HostNetworkInterfaceLldpRefVO.systemName == PhysicalSwitchVO.name + && HostNetworkInterfaceLldpRefVO.portId == PhysicalSwitchPortVO.name + > select lldpUuid,chassisId,systemName,portId,aggregationPortId from HostNetworkInterfaceLldpRefVO; +----------------------------------+-------------------+------------+------------+-------------------+ +| lldpUuid | chassisId | systemName | portId | aggregationPortId | ++----------------------------------+-------------------+------------+------------+-------------------+ +| 0a89ae9894274b608b3e5cd29b20e216 | c0:e3:fb:65:ab:d1 | huawei_152 | 10GE1/0/13 | NULL | +| d3905992b4c043099c86785b0ee3186d | c0:e3:fb:65:ab:d1 | huawei_152 | 10GE1/0/11 | 1 | ++----------------------------------+-------------------+------------+------------+-------------------+ + select uuid,name,mac from PhysicalSwitchVO; ++----------------------------------+------------+-------------------+ +| uuid | name | mac | ++----------------------------------+------------+-------------------+ +| b9d708c427c630b1b9fffe2d989c3a48 | huawei_152 | C0:E3:FB:65:AB:D1 | ++----------------------------------+------------+-------------------+ +1 row in set (0.000 sec) +select name,ethTrunkName,switchUuid from PhysicalSwitchPortVO limit 1; ++------------+--------------+----------------------------------+ +| name | ethTrunkName | switchUuid | ++------------+--------------+----------------------------------+ +| 10GE1/0/30 | NULL | b9d708c427c630b1b9fffe2d989c3a48 | ++------------+--------------+----------------------------------+ + */ + PhysicalSwitchVO switchVO = Q.New(PhysicalSwitchVO.class) + .eq(PhysicalSwitchVO_.name, refVO.getSystemName()).limit(1).find(); + if (switchVO != null) { + PhysicalSwitchPortVO oldPhysicalSwitchPortVO = Q.New(PhysicalSwitchPortVO.class) + .eq(PhysicalSwitchPortVO_.peerInterfaceUuid, interfaceUuid).find(); + PhysicalSwitchPortVO physicalSwitchPortVO = Q.New(PhysicalSwitchPortVO.class) + .eq(PhysicalSwitchPortVO_.switchUuid, switchVO.getUuid()) + .eq(PhysicalSwitchPortVO_.name, refVO.getPortId()).limit(1).find(); + if (physicalSwitchPortVO != null) { + logger.debug(String.format("link host network interface[uuid:%s] to physical switch port[uuid:%s,name:%s]", + interfaceUuid, physicalSwitchPortVO.getUuid(), physicalSwitchPortVO.getName())); + if (physicalSwitchPortVO.getPeerInterfaceUuid() != null && physicalSwitchPortVO.getPeerInterfaceUuid().equals(interfaceUuid)) { + logger.debug(String.format("physical switch port[uuid:%s,name:%s] is already linked to host network interface[uuid:%s], skip", + physicalSwitchPortVO.getUuid(), physicalSwitchPortVO.getName(), physicalSwitchPortVO.getPeerInterfaceUuid())); + return; + } + physicalSwitchPortVO.setPeerInterfaceUuid(interfaceUuid); + dbf.update(physicalSwitchPortVO); + + if (oldPhysicalSwitchPortVO != null) { + oldPhysicalSwitchPortVO.setPeerInterfaceUuid(null); + dbf.update(oldPhysicalSwitchPortVO); + } + + HostNetworkInterfaceCanonicalEvents.PeerPortChangedData data = new HostNetworkInterfaceCanonicalEvents.PeerPortChangedData(); + data.setInterfaceUuid(interfaceUuid); + data.setOldPhysicalSwitchPort(PhysicalSwitchPortInventory.valueOf(oldPhysicalSwitchPortVO)); + data.setNewPhysiaclSwitchPort(PhysicalSwitchPortInventory.valueOf(physicalSwitchPortVO)); + evtf.fire(HostNetworkInterfaceCanonicalEvents.PEER_PORT_CHANGED, data); + } + } } } - private void handle(APIGetHostNetworkInterfaceLldpMsg msg) { - APIGetHostNetworkInterfaceLldpReply greply = new APIGetHostNetworkInterfaceLldpReply(); - - HostNetworkInterfaceVO interfaceVO = dbf.findByUuid(msg.getInterfaceUuid(), HostNetworkInterfaceVO.class); + void doGetHostNetworkInterfaceLLdpInfo(String interfaceUuid, ReturnValueCompletion completion) { + HostNetworkInterfaceVO interfaceVO = dbf.findByUuid(interfaceUuid, HostNetworkInterfaceVO.class); final LldpKvmAgentCommands.GetLldpInfoCmd cmd = new LldpKvmAgentCommands.GetLldpInfoCmd(); cmd.setPhysicalInterfaceName(interfaceVO.getInterfaceName()); + getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.STARTING); KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); kmsg.setPath(LldpConstant.GET_LLDP_INFO_PATH); kmsg.setHostUuid(interfaceVO.getHostUuid()); kmsg.setCommand(cmd); bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, interfaceVO.getHostUuid()); - bus.send(kmsg, new CloudBusCallBack(msg) { + bus.send(kmsg, new CloudBusCallBack(completion) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { - greply.setError(reply.getError()); - bus.reply(msg, greply); + completion.fail(reply.getError()); + getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.Done); return; } else { KVMHostAsyncHttpCallReply r = reply.castReply(); LldpKvmAgentCommands.GetLldpInfoResponse rsp = r.toResponse(LldpKvmAgentCommands.GetLldpInfoResponse.class); + getNeighbourStateMap.put(interfaceUuid, LLDPGetNeighbourState.Done); if (!rsp.isSuccess()) { - greply.setError(operr("operation error, because %s", rsp.getError())); + completion.fail(operr("operation error, because %s", rsp.getError())); } else { - HostNetworkInterfaceLldpVO vo = Q.New(HostNetworkInterfaceLldpVO.class).eq(HostNetworkInterfaceLldpVO_.interfaceUuid, msg.getInterfaceUuid()).find(); - - syncHostNetworkInterfaceLldpInDb(msg.getInterfaceUuid(), rsp.getLldpInfo()); + HostNetworkInterfaceLldpVO vo = Q.New(HostNetworkInterfaceLldpVO.class) + .eq(HostNetworkInterfaceLldpVO_.interfaceUuid, interfaceUuid).find(); + syncHostNetworkInterfaceLldpInDb(interfaceUuid, rsp.getLldpInfo()); HostNetworkInterfaceLldpRefVO lldpRefVO = Q.New(HostNetworkInterfaceLldpRefVO.class) .eq(HostNetworkInterfaceLldpRefVO_.lldpUuid, vo.getUuid()) .find(); - greply.setLldp(lldpRefVO != null ? HostNetworkInterfaceLldpRefInventory.valueOf(lldpRefVO) : null); + if (lldpRefVO != null) { + completion.success(HostNetworkInterfaceLldpRefInventory.valueOf(lldpRefVO)); + } else { + completion.fail(operr("get lldp ref for[%s] failed", interfaceUuid)); + } } } + } + }); + } + + private void handle(GetHostNetworkInterfaceLldpMsg msg) { + GetHostNetworkInterfaceLldpReply reply = new GetHostNetworkInterfaceLldpReply(); + doGetHostNetworkInterfaceLLdpInfo(msg.getInterfaceUuid(), new ReturnValueCompletion(msg) { + @Override + public void success(HostNetworkInterfaceLldpRefInventory returnValue) { + reply.setLldp(returnValue); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(APIGetHostNetworkInterfaceLldpMsg msg) { + APIGetHostNetworkInterfaceLldpReply greply = new APIGetHostNetworkInterfaceLldpReply(); + + doGetHostNetworkInterfaceLLdpInfo(msg.getInterfaceUuid(), new ReturnValueCompletion(msg) { + @Override + public void success(HostNetworkInterfaceLldpRefInventory returnValue) { + greply.setLldp(returnValue); + bus.reply(msg, greply); + } + + @Override + public void fail(ErrorCode errorCode) { + greply.setError(errorCode); bus.reply(msg, greply); } }); @@ -321,6 +433,74 @@ public void afterDeleteHost(HostInventory inventory) { } + @Override + public void kvmPingAgentNoFailure(KVMHostInventory host, NoErrorCompletion completion) { + boolean autoGetLldpNeighbor = LldpGlobalConfig.AUTO_GET_LLDP_NEIGHBOUR.value(Boolean.class); + if (!autoGetLldpNeighbor) { + completion.done(); + return; + } + + List interfaceUuids = Q.New(HostNetworkInterfaceVO.class) + .select(HostNetworkInterfaceVO_.uuid) + .eq(HostNetworkInterfaceVO_.hostUuid, host.getUuid()) + .listValues(); + if (interfaceUuids.isEmpty()) { + completion.done(); + return; + } + + List lldpVOS = Q.New(HostNetworkInterfaceLldpVO.class) + .in(HostNetworkInterfaceLldpVO_.interfaceUuid, interfaceUuids) + .list(); + List toUpdate = new ArrayList<>(); + for (HostNetworkInterfaceLldpVO lldpVO : lldpVOS) { + if (LldpConstant.mode.disable.toString().equals(lldpVO.getMode())) { + continue; + } + + if (lldpVO.getNeighborDevice() != null) { + continue; + } + + toUpdate.add(lldpVO); + } + + if (toUpdate.isEmpty()) { + completion.done(); + return; + } + + completion.done(); + + NopeCompletion nope = new NopeCompletion(); + new While<>(toUpdate).each((lldpVO, wcomp) -> { + LLDPGetNeighbourState state = getNeighbourStateMap.get(lldpVO.getInterfaceUuid()); + if (state == LLDPGetNeighbourState.STARTING) { + wcomp.done(); + return; + } + + doGetHostNetworkInterfaceLLdpInfo(lldpVO.getInterfaceUuid(), new ReturnValueCompletion(wcomp) { + @Override + public void success(HostNetworkInterfaceLldpRefInventory returnValue) { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.debug("get lldp info failed, ignore it"); + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(nope) { + @Override + public void done(ErrorCodeList errorCodeList) { + nope.success(); + } + }); + } + @Override public String getId() { return bus.makeLocalServiceId(LldpConstant.SERVICE_ID); diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java new file mode 100644 index 00000000000..2efe1526b36 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpMsg.java @@ -0,0 +1,15 @@ +package org.zstack.network.hostNetworkInterface.lldp.api; + +import org.zstack.header.message.NeedReplyMessage; + +public class GetHostNetworkInterfaceLldpMsg extends NeedReplyMessage { + private String interfaceUuid; + + public String getInterfaceUuid() { + return interfaceUuid; + } + + public void setInterfaceUuid(String interfaceUuid) { + this.interfaceUuid = interfaceUuid; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java new file mode 100644 index 00000000000..f182596b7e2 --- /dev/null +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/GetHostNetworkInterfaceLldpReply.java @@ -0,0 +1,18 @@ +package org.zstack.network.hostNetworkInterface.lldp.api; + +import org.zstack.header.message.MessageReply; +import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefInventory; + +import java.io.Serializable; + +public class GetHostNetworkInterfaceLldpReply extends MessageReply implements Serializable { + private HostNetworkInterfaceLldpRefInventory lldp; + + public HostNetworkInterfaceLldpRefInventory getLldp() { + return lldp; + } + + public void setLldp(HostNetworkInterfaceLldpRefInventory lldp) { + this.lldp = lldp; + } +} diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java index 42821501466..46036735b4a 100644 --- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java +++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/entity/HostNetworkInterfaceLldpRefVO_.java @@ -14,6 +14,7 @@ public class HostNetworkInterfaceLldpRefVO_ { public static volatile SingularAttribute systemName; public static volatile SingularAttribute systemDescription; public static volatile SingularAttribute systemCapabilities; + public static volatile SingularAttribute portId; public static volatile SingularAttribute portDescription; public static volatile SingularAttribute vlanId; public static volatile SingularAttribute aggregationPortId; diff --git a/plugin/iscsi/pom.xml b/plugin/iscsi/pom.xml index 62f2c884a6b..bb7bacea0e7 100644 --- a/plugin/iscsi/pom.xml +++ b/plugin/iscsi/pom.xml @@ -6,7 +6,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 .. diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java index 034ad33f203..1fa5af3d517 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/IscsiUtils.java @@ -11,6 +11,8 @@ import org.zstack.header.storage.backup.*; import org.zstack.header.tag.SystemTagVO; import org.zstack.header.tag.SystemTagVO_; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmInstanceVO_; import org.zstack.storage.backup.BackupStorageSystemTags; import java.util.Collections; @@ -53,4 +55,8 @@ private static String getBsMnIp(String bsUuid) { public static String getBSInitiatorName(String bsUuid) { return BackupStorageSystemTags.ISCSI_INITIATOR_NAME.getTokenByResourceUuid(bsUuid, BackupStorageVO.class, BackupStorageSystemTags.ISCSI_INITIATOR_NAME_TOKEN); } + + public static String getBMInitiatorName(String vmUuid) { + return String.format("iqn.2015-01.io.zstack:initiator.instance.%s", vmUuid); + } } diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 026d2f1c128..31dddaa0789 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -279,39 +279,16 @@ public void handle(Map data) { @Override public void kvmCancelSelfFencer(KvmCancelSelfFencerParam param, Completion completion) { - PrimaryStorageNodeSvc nodeSvc = extPsFactory.getNodeSvc(param.getPrimaryStorage().getUuid()); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("cancel-self-fencer-for-external-primary-storage-%s", param.getPrimaryStorage().getUuid())); chain.then(new ShareFlow() { - HostInventory host = HostInventory.valueOf(dbf.findByUuid(param.getHostUuid(), HostVO.class)); - HeartbeatVolumeTO heartbeatVol; @Override public void setup() { - flow(new NoRollbackFlow() { - @Override - public void run(FlowTrigger trigger, Map data) { - nodeSvc.activateHeartbeatVolume(host, new ReturnValueCompletion(trigger) { - @Override - public void success(HeartbeatVolumeTO vol) { - heartbeatVol = vol; - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); - } - }); flow(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { KvmCancelSelfFencerCmd cmd = new KvmCancelSelfFencerCmd(); - cmd.installPath = heartbeatVol.getInstallPath(); - cmd.hostId = heartbeatVol.getHostId(); - cmd.hostUuid = param.getHostUuid(); cmd.uuid = param.getPrimaryStorage().getUuid(); httpCall(KvmIscsiCommands.CANCEL_ISCSI_SELF_FENCER_PATH, param.getHostUuid(), cmd, true, AgentRsp.class, new ReturnValueCompletion(trigger) { diff --git a/plugin/kvm/pom.xml b/plugin/kvm/pom.xml index 832fbb6d4bc..12ca68055a9 100755 --- a/plugin/kvm/pom.xml +++ b/plugin/kvm/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 .. kvm diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java b/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java index 2aa7e4fe4d6..0bec0e09099 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/AbstractKVMConnectExtensionForL2Network.java @@ -48,6 +48,10 @@ protected List getL2Networks(String clusterUuid) { List ret = new ArrayList(vos.size()); List noVlanL2Networks = new ArrayList<>(); for (L2NetworkVO vo : vos) { + VSwitchType vSwitchType = VSwitchType.valueOf(vo.getvSwitchType()); + if (!vSwitchType.isAttachToCluster()) { + continue; + } if (L2NetworkConstant.L2_NO_VLAN_NETWORK_TYPE.equals(vo.getType())) { noVlanL2Networks.add(L2NetworkInventory.valueOf(vo)); } else if (L2NetworkConstant.L2_VLAN_NETWORK_TYPE.equals(vo.getType())) { @@ -100,7 +104,7 @@ public void run(final FlowTrigger trigger, Map data) { } for (int i = 0; i < count; i++) { - int end = (i + 1) * step - 1; + int end = (i + 1) * step; List interfaces = l2NetworksCheckList.subList(i * step, Math.min(end, l2NetworksCheckList.size())) .stream() .map(L2NetworkInventory::getPhysicalInterface) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java index 073c8d77b6a..5f4647a7f0d 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAddons.java @@ -5,6 +5,7 @@ public interface KVMAddons { public static class Channel { public static final String NAME = "channel"; + public static final String VR_NAME = "channel_vr"; private String socketPath; private String targetName; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 73430bf3b3c..91e5d885bd8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -15,9 +15,7 @@ import org.zstack.header.vm.devices.VirtualDeviceInfo; import org.zstack.network.securitygroup.RuleTO; import org.zstack.network.securitygroup.SecurityGroupMembersTO; -import org.zstack.network.securitygroup.SecurityGroupRuleTO; import org.zstack.network.securitygroup.VmNicSecurityTO; -import org.zstack.network.service.MtuGetter; import java.io.Serializable; import java.util.*; @@ -269,8 +267,17 @@ public static class ConnectCmd extends AgentCommand { private boolean ignoreMsrs; private boolean pageTableExtensionDisabled; private int tcpServerPort; + private boolean isInstallHostShutdownHook; private String version; + public boolean isInstallHostShutdownHook() { + return isInstallHostShutdownHook; + } + + public void setInstallHostShutdownHook(boolean installHostShutdownHook) { + isInstallHostShutdownHook = installHostShutdownHook; + } + public boolean isIgnoreMsrs() { return ignoreMsrs; } @@ -351,6 +358,8 @@ public void setQemuVersion(String qemuVersion) { public static class PingCmd extends AgentCommand { public String hostUuid; + public long kvmagentPhysicalMemoryUsageAlarmThreshold; + public long kvmagentPhysicalMemoryUsageHardLimit; } public static class PingResponse extends AgentResponse { @@ -457,6 +466,8 @@ public static class HostFactResponse extends AgentResponse { @GrayVersion(value = "5.0.0") private String libvirtVersion; @GrayVersion(value = "5.0.0") + private String libvirtPackageVersion; + @GrayVersion(value = "5.0.0") private String hvmCpuFlag; @GrayVersion(value = "5.0.0") private String eptFlag; @@ -501,6 +512,8 @@ public static class HostFactResponse extends AgentResponse { @GrayVersion(value = "5.0.0") private String cpuCache; @GrayVersion(value = "5.0.0") + private String deployMode; + @GrayVersion(value = "5.0.0") private List ipAddresses; @GrayVersion(value = "5.0.0") private List libvirtCapabilities; @@ -752,6 +765,22 @@ public String getIscsiInitiatorName() { public void setIscsiInitiatorName(String iscsiInitiatorName) { this.iscsiInitiatorName = iscsiInitiatorName; } + + public String getLibvirtPackageVersion() { + return libvirtPackageVersion; + } + + public void setLibvirtPackageVersion(String libvirtPackageVersion) { + this.libvirtPackageVersion = libvirtPackageVersion; + } + + public String getDeployMode() { + return deployMode; + } + + public void setDeployMode(String deployMode) { + this.deployMode = deployMode; + } } public static class HostCapacityCmd extends AgentCommand { @@ -770,6 +799,16 @@ public static class HostCapacityResponse extends AgentResponse { private long usedMemory; @GrayVersion(value = "5.0.0") private int cpuSockets; + @GrayVersion(value = "5.4.0") + private int cpuCoreNum; + + public int getCpuCoreNum() { + return cpuCoreNum; + } + + public void setCpuCoreNum(int cpuCoreNum) { + this.cpuCoreNum = cpuCoreNum; + } public int getCpuSockets() { return cpuSockets; @@ -871,6 +910,10 @@ public static class CreateBridgeCmd extends AgentCommand { private Boolean isolated; @GrayVersion(value = "5.0.0") private String pvlan; + @GrayVersion(value = "5.3.0") + private Integer igmpVersion; + @GrayVersion(value = "5.3.0") + private Integer mldVersion; public String getL2NetworkUuid() { return l2NetworkUuid; @@ -927,6 +970,22 @@ public String getPvlan() { public void setPvlan(String pvlan) { this.pvlan = pvlan; } + + public Integer getIgmpVersion() { + return igmpVersion; + } + + public void setIgmpVersion(Integer igmpVersion) { + this.igmpVersion = igmpVersion; + } + + public Integer getMldVersion() { + return mldVersion; + } + + public void setMldVersion(Integer mldVersion) { + this.mldVersion = mldVersion; + } } @@ -3564,6 +3623,8 @@ public static class RefreshAllRulesOnHostResponse extends AgentResponse { public static class CheckDefaultSecurityGroupCmd extends AgentCommand { @GrayVersion(value = "5.0.0") Boolean skipIpv6; + @GrayVersion(value = "5.3.0") + Boolean disableIp6Tables; } public static class CheckDefaultSecurityGroupResponse extends AgentResponse { @@ -3589,6 +3650,8 @@ public static class UpdateGroupMemberResponse extends AgentResponse { public static class CleanupUnusedRulesOnHostCmd extends AgentCommand { @GrayVersion(value = "5.0.0") Boolean skipIpv6; + @GrayVersion(value = "5.3.0") + Boolean disableIp6Tables; } public static class CleanupUnusedRulesOnHostResponse extends AgentResponse { @@ -3833,9 +3896,28 @@ public void setCpuXml(String cpuXml) { } public static class VmCompareCpuFunctionResponse extends AgentResponse { + private boolean match = true; + private String compareError; + + public boolean isMatch() { + return match; + } + + public void setMatch(boolean match) { + this.match = match; + } + + public String getCompareError() { + return compareError; + } + + public void setCompareError(String compareError) { + this.compareError = compareError; + } } public static class MergeSnapshotRsp extends AgentResponse { + public long size; } public static class MergeSnapshotCmd extends AgentCommand implements HasThreadContext { @@ -3944,7 +4026,7 @@ public void setExcludeInstallPaths(List excludeInstallPaths) { } } - public static class BlockCommitVolumeCmd extends AgentCommand implements HasThreadContext { + public static class BlockCommitCmd extends AgentCommand implements HasThreadContext { @GrayVersion(value = "5.0.0") private String vmUuid; @GrayVersion(value = "5.0.0") @@ -3955,6 +4037,8 @@ public static class BlockCommitVolumeCmd extends AgentCommand implements HasThre private String top; @GrayVersion(value = "5.0.0") private String base; + @GrayVersion(value = "5.4.0") + private List topChildrenInstallPathInDb = new ArrayList<>(); public String getVmUuid() { return vmUuid; @@ -3964,14 +4048,6 @@ public void setVmUuid(String vmUuid) { this.vmUuid = vmUuid; } - public String getVolumeUuid() { - return volumeUuid; - } - - public void setVolumeUuid(String volumeUuid) { - this.volumeUuid = volumeUuid; - } - public VolumeTO getVolume() { return volume; } @@ -3995,12 +4071,17 @@ public String getBase() { public void setBase(String base) { this.base = base; } + + public List getTopChildrenInstallPathInDb() { + return topChildrenInstallPathInDb; + } + + public void setTopChildrenInstallPathInDb(List topChildrenInstallPathInDb) { + this.topChildrenInstallPathInDb = topChildrenInstallPathInDb; + } } - public static class BlockCommitVolumeResponse extends AgentResponse { - @Validation - @GrayVersion(value = "5.0.0") - private String newVolumeInstallPath; + public static class BlockCommitResponse extends AgentResponse { @Validation(notZero = true) @GrayVersion(value = "5.0.0") private long size; @@ -4012,13 +4093,51 @@ public long getSize() { public void setSize(long size) { this.size = size; } + } - public String getNewVolumeInstallPath() { - return newVolumeInstallPath; + public static class BlockPullCmd extends AgentCommand implements HasThreadContext { + @GrayVersion(value = "5.4.0") + private String vmUuid; + @GrayVersion(value = "5.4.0") + private VolumeTO volume; + @GrayVersion(value = "5.4.0") + private String base; + + public String getVmUuid() { + return vmUuid; } - public void setNewVolumeInstallPath(String newVolumeInstallPath) { - this.newVolumeInstallPath = newVolumeInstallPath; + public void setVmUuid(String vmUuid) { + this.vmUuid = vmUuid; + } + + public VolumeTO getVolume() { + return volume; + } + + public void setVolume(VolumeTO volume) { + this.volume = volume; + } + + public String getBase() { + return base; + } + + public void setBase(String base) { + this.base = base; + } + } + + public static class BlockPullResponse extends AgentResponse { + @GrayVersion(value = "5.4.0") + private long size; + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; } } @@ -4401,7 +4520,7 @@ public static class ReportVmCrashEventCmd { } public static class ReportHostStopEventCmd { - public String hostIp; + public String hostUuid; } public static class ShutdownHostCmd extends AgentCommand { @@ -4643,6 +4762,107 @@ public static class SyncIpsetCmd extends AgentCommand { public static class SyncIpsetRsp extends AgentResponse { } + public static class InstallOvsPackageCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String ovnControllerIp; + + public String getOvnControllerIp() { + return ovnControllerIp; + } + + public void setOvnControllerIp(String ovnControllerIp) { + this.ovnControllerIp = ovnControllerIp; + } + } + + public static class InstallOvsPackageRsp extends AgentResponse { + } + + public static class UnInstallOvsPackageCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String ovnControllerIp; + + public String getOvnControllerIp() { + return ovnControllerIp; + } + + public void setOvnControllerIp(String ovnControllerIp) { + this.ovnControllerIp = ovnControllerIp; + } + } + + public static class UnInstallOvsPackageRsp extends AgentResponse { + } + + public static class StartOvsServiceCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public String hostIp; + @GrayVersion(value = "5.4.0") + public Map nicNamePciAddressMap; + @GrayVersion(value = "5.4.0") + public Map nicNameDriverMap; + @GrayVersion(value = "5.4.0") + public List restoreNicPciAddressList = new ArrayList<>(); + @GrayVersion(value = "5.4.0") + public String brExName; + @GrayVersion(value = "5.4.0") + public String ovnRemoteConnection; + @GrayVersion(value = "5.4.0") + public String ovnEncapIP; + @GrayVersion(value = "5.4.0") + public String ovnEncapNetmask; + @GrayVersion(value = "5.4.0") + public String ovnEncapType; + @GrayVersion(value = "5.4.0") + public Integer hugePageNumber; + @GrayVersion(value = "5.4.0") + public String bondingMode; + @GrayVersion(value = "5.4.0") + public String lacpMode; + @GrayVersion(value = "5.4.0") + public Integer hugePageSize; + @GrayVersion(value = "5.4.0") + public Integer socketMem; + @GrayVersion(value = "5.4.0") + public String lcores; + @GrayVersion(value = "5.4.0") + public String pmdcores; + @GrayVersion(value = "5.4.0") + public Integer nicRxQueueNumber; + @GrayVersion(value = "5.4.0") + public Integer nicRxQueueDescNumber; + + } + + public static class StartOvsServiceRsp extends AgentResponse { + } + + public static class OvsAddPortCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vSwitchType; + @GrayVersion(value = "5.4.0") + public Boolean sync; + @GrayVersion(value = "5.4.0") + public Boolean reInstall; + @GrayVersion(value = "5.4.0") + public Map nicMap = new HashMap<>(); + } + + public static class OvsAddPortRsp extends AgentResponse { + } + + public static class OvsDelPortCmd extends AgentCommand { + @GrayVersion(value = "5.4.0") + public String vswitchType; + @GrayVersion(value = "5.4.0") + public Map nicMap = new HashMap<>(); + } + + public static class OvsDelPortRsp extends AgentResponse { + } + public static class HardwareMonitorCmd extends KVMAgentCommands.AgentCommand { } @@ -4704,6 +4924,13 @@ public static class PhysicalGpuRemoveAlarmEventCmd { public String pcideviceAddress; } + public static class HostStorageDeviceHbaStateEventCmd { + public String host; + public String portName; + public String portState; + public String name; + } + public static class HostPhysicalDeviceStatusAlarmEventCmd { private String host; private String type; @@ -4735,4 +4962,82 @@ public void setAdditionalProperties(Map additionalProperties) { } } + public static class HostProcessPhysicalMemoryUsageAlarmCmd { + private String hostUuid; + private String pid; + private String processName; + private long memoryUsage; + private Map additionalProperties = new HashMap<>(); + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getProcessName() { + return processName; + } + + public void setProcessName(String processName) { + this.processName = processName; + } + + public long getMemoryUsage() { + return memoryUsage; + } + + public void setMemoryUsage(long memoryUsage) { + this.memoryUsage = memoryUsage; + } + + public Map getAdditionalProperties() { + return additionalProperties; + } + + public void setAdditionalProperties(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + } + + public static class HostKvmagentStatusCmd { + private String status; + private String hostUuid; + private long memoryUsage; + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public long getMemoryUsage() { + return memoryUsage; + } + + public void setMemoryUsage(long memoryUsage) { + this.memoryUsage = memoryUsage; + } + } + } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java index cdaaf8b2b84..bab798b471a 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockCommitExtensionPoint.java @@ -1,15 +1,14 @@ -package org.zstack.kvm; - -import org.zstack.header.core.Completion; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.host.CommitVolumeOnHypervisorMsg; -import org.zstack.header.host.CommitVolumeOnHypervisorReply; - - -public interface KVMBlockCommitExtensionPoint { - void beforeCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, Completion completion); - - void afterCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, CommitVolumeOnHypervisorReply reply, Completion completion); - - void failedToCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, KVMAgentCommands.BlockCommitVolumeResponse rsp, ErrorCode err); -} +package org.zstack.kvm; + +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.host.CommitVolumeSnapshotOnHypervisorMsg; +import org.zstack.header.host.CommitVolumeSnapshotOnHypervisorReply; + +public interface KVMBlockCommitExtensionPoint { + void beforeCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, Completion completion); + + void afterCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, CommitVolumeSnapshotOnHypervisorReply reply, Completion completion); + + void failedToCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, KVMAgentCommands.BlockCommitResponse rsp, ErrorCode err); +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java new file mode 100644 index 00000000000..c7146ea323e --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMBlockPullExtensionPoint.java @@ -0,0 +1,14 @@ +package org.zstack.kvm; + +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.host.PullVolumeSnapshotOnHypervisorMsg; +import org.zstack.header.host.PullVolumeSnapshotOnHypervisorReply; + +public interface KVMBlockPullExtensionPoint { + void beforePullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, Completion completion); + + void afterPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, PullVolumeSnapshotOnHypervisorReply reply, Completion completion); + + void failedToPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, KVMAgentCommands.BlockPullResponse rsp, ErrorCode err); +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 694aa68fbfd..f40157764ea 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -36,6 +36,12 @@ public interface KVMConstant { String KVM_DELETE_VDPA_PATH = "/network/ovsdpdk/deletevdpa"; String KVM_GENERATE_VHOST_USER_CLIENT_PATH = "/network/ovsdpdk/addvhostuserclient"; String KVM_DELETE_VHOST_USER_CLIENT_PATH = "/network/ovsdpdk/deletevhostuserclient"; + String KVM_INSTALL_OVS_PACKAGE_PATH = "/network/ovn/install"; + String KVM_UNINSTALL_OVS_PACKAGE_PATH = "/network/ovn/uninstall"; + String KVM_START_OVS_SERVICE_PATH = "/network/ovn/start"; + String KVM_STOP_OVS_SERVICE_PATH = "/network/ovn/stop"; + String KVM_OVS_ADD_PORT_PATH = "/network/ovn/addport"; + String KVM_OVS_DEL_PORT_PATH = "/network/ovn/delport"; String KVM_ATTACH_ISO_PATH = "/vm/iso/attach"; String KVM_DETACH_ISO_PATH = "/vm/iso/detach"; String KVM_SYNC_VM_DEVICEINFO_PATH = "/sync/vm/deviceinfo"; @@ -98,6 +104,7 @@ public interface KVMConstant { String KVM_RECONNECT_ME = "/kvm/reconnectme"; String KVM_REPORT_PS_STATUS = "/kvm/reportstoragestatus"; String KVM_REPORT_SELF_FENCER = "/kvm/reportselffencer"; + String KVM_REPORT_SELF_FENCER_STATE_CHANGED = "/kvm/reportselffencerstatechanged"; String KVM_REQUEST_MAINTAIN_HOST = "/kvm/requestmaintainhost"; String KVM_ANSIBLE_LOG_PATH_FROMAT = "/kvm/ansiblelog/{uuid}"; String KVM_REPORT_VM_SHUTDOWN_EVENT = "/kvm/reportvmshutdown"; @@ -112,6 +119,7 @@ public interface KVMConstant { String KVM_HOST_ATTACH_VOLUME_PATH = "/host/volume/attach"; String KVM_HOST_DETACH_VOLUME_PATH = "/host/volume/detach"; String KVM_BLOCK_COMMIT_VOLUME_PATH = "/vm/volume/blockcommit"; + String KVM_BLOCK_PULL_VOLUME_PATH = "/vm/volume/blockpull"; String TAKE_VM_CONSOLE_SCREENSHOT_PATH = "/vm/console/screenshot"; String KVM_HOST_IPSET_ATTACH_NIC_PATH = "/network/ipset/attach"; @@ -125,6 +133,10 @@ public interface KVMConstant { String HOST_PHYSICAL_DISK_REMOVE_ALARM_EVENT = "/host/physical/disk/remove/alarm"; String HOST_PHYSICAL_MEMORY_ECC_ERROR_ALARM_EVENT = "/host/physical/memory/ecc/error/alarm"; String HOST_PHYSICAL_GPU_REMOVE_ALARM_EVENT = "/host/physical/gpu/remove/alarm"; + String HOST_STORAGEDEVICE_HBA_STATE_EVENT = "/storagedevice/hba/state/alarm"; + String HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ALARM_PATH = "/host/process/physicalMemory/usage/alarm"; + String HOST_KVMAGENT_STATUS_PATH = "/host/kvmagent/status"; + String KVM_AGENT_OWNER = "kvm"; String ALI_REPO = "ali"; @@ -153,10 +165,13 @@ public interface KVMConstant { String KVM_HOST_SKIP_PING_NO_FAILURE_EXTENSIONS = "kvm.host.skip.ping.no.failure.extensions"; String MEMORY_LOCATOR_NAME = "locator"; - String PHSICAL_DEVICE_STATUS_NAME = "status"; + String PHYSICAL_DEVICE_STATUS_NAME = "status"; + String PHYSICAL_DEVICE_STATE_NAME = "state"; + String PHYSICAL_DEVICE_DISK_UUIDS = "diskUuids"; String CPU_NAME = "cpuName"; String PCI_DEVICE_ADDRESS = "pcideviceAddress"; String DEVICE_NAME = "name"; + String VOLUME_GROUP_NAME = "volumeGroup"; String DEVICE_SERIAL_NUMBER = "serial_number"; String ENCLOSURE_DEVICE_ID = "enclosure_device_id"; String SLOT_NUMBER = "slot_number"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java index e0588ce8b56..0e723cd16aa 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java @@ -44,6 +44,7 @@ public class KVMExtensionEmitter implements Component { private List checkVmStateExts = new ArrayList<>(); private List syncVmDeviceInfoExts = new ArrayList<>(); private List blockCommitExts = new ArrayList<>(); + private List blockPullExts = new ArrayList<>(); private void populateExtensions() { startVmExts = pluginRgty.getExtensionList(KVMStartVmExtensionPoint.class); @@ -59,6 +60,7 @@ private void populateExtensions() { checkSnapshotExts = pluginRgty.getExtensionList(KVMCheckSnapshotExtensionPoint.class); syncVmDeviceInfoExts = pluginRgty.getExtensionList(KVMSyncVmDeviceInfoExtensionPoint.class); blockCommitExts = pluginRgty.getExtensionList(KVMBlockCommitExtensionPoint.class); + blockPullExts = pluginRgty.getExtensionList(KVMBlockPullExtensionPoint.class); } public void afterReceiveSyncVmDeviceInfoResponse(final VmInstanceInventory vm, final KVMAgentCommands.VmDevicesInfoResponse rsp, VmInstanceSpec spec) { @@ -231,7 +233,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - private void doBeforeCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, Completion completion) { + public void doBeforeCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, Completion completion) { if (!it.hasNext()) { completion.success(); return; @@ -251,12 +253,12 @@ public void fail(ErrorCode errorCode) { }); } - public void beforeCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, Completion completion) { + public void beforeCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, Completion completion) { Iterator it = blockCommitExts.iterator(); doBeforeCommitVolume(it, host, msg, cmd, completion); } - private void doAfterCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, CommitVolumeOnHypervisorReply reply, Completion completion) { + public void doAfterCommitVolume(Iterator it, KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, CommitVolumeSnapshotOnHypervisorReply reply, Completion completion) { if (!it.hasNext()) { completion.success(); return; @@ -276,17 +278,73 @@ public void fail(ErrorCode errorCode) { }); } - public void afterCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, CommitVolumeOnHypervisorReply reply, Completion completion) { + public void afterCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, CommitVolumeSnapshotOnHypervisorReply reply, Completion completion) { Iterator it = blockCommitExts.iterator(); doAfterCommitVolume(it, host, msg, cmd, reply, completion); } - public void failedToCommitVolume(KVMHostInventory host, CommitVolumeOnHypervisorMsg msg, KVMAgentCommands.BlockCommitVolumeCmd cmd, KVMAgentCommands.BlockCommitVolumeResponse rsp, ErrorCode err) { + public void failedToCommitVolume(KVMHostInventory host, CommitVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockCommitCmd cmd, KVMAgentCommands.BlockCommitResponse rsp, ErrorCode err) { for (KVMBlockCommitExtensionPoint ext : blockCommitExts) { ext.failedToCommitVolume(host, msg, cmd, rsp, err); } } + public void doBeforePullVolume(Iterator it, KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, Completion completion) { + if (!it.hasNext()) { + completion.success(); + return; + } + + KVMBlockPullExtensionPoint ext = it.next(); + ext.beforePullVolume(host, msg, cmd, new Completion(completion) { + @Override + public void success() { + doBeforePullVolume(it, host, msg, cmd, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + public void beforePullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, Completion completion) { + Iterator it = blockPullExts.iterator(); + doBeforePullVolume(it, host, msg, cmd, completion); + } + + public void doAfterPullVolume(Iterator it, KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, PullVolumeSnapshotOnHypervisorReply reply, Completion completion) { + if (!it.hasNext()) { + completion.success(); + return; + } + + KVMBlockPullExtensionPoint ext = it.next(); + ext.afterPullVolume(host, msg, cmd, reply, new Completion(completion) { + @Override + public void success() { + doAfterPullVolume(it, host, msg, cmd, reply, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + public void afterPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, PullVolumeSnapshotOnHypervisorReply reply, Completion completion) { + Iterator it = blockPullExts.iterator(); + doAfterPullVolume(it, host, msg, cmd, reply, completion); + } + + public void failedToPullVolume(KVMHostInventory host, PullVolumeSnapshotOnHypervisorMsg msg, KVMAgentCommands.BlockPullCmd cmd, KVMAgentCommands.BlockPullResponse rsp, ErrorCode err) { + for (KVMBlockPullExtensionPoint ext : blockPullExts) { + ext.failedToPullVolume(host, msg, cmd, rsp, err); + } + } + public void beforeTakeSnapshot(KVMHostInventory host, TakeSnapshotOnHypervisorMsg msg, KVMAgentCommands.TakeSnapshotCmd cmd, Completion completion) { Iterator it = takeSnapshotExts.iterator(); doBeforeTakeSnapshot(it, host, msg, cmd, completion); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java index cae4ea25bdc..aa0fd787bed 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalConfig.java @@ -1,11 +1,9 @@ package org.zstack.kvm; -import org.zstack.core.GlobalProperty; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigDef; import org.zstack.core.config.GlobalConfigDefinition; import org.zstack.core.config.GlobalConfigValidation; -import org.zstack.header.host.Host; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.volume.VolumeVO; import org.zstack.resourceconfig.BindResourceConfig; @@ -49,7 +47,7 @@ public class KVMGlobalConfig { "Dhyana", "EPYC", "EPYC-IBPB", "Haswell", "Haswell-noTSX", "Broadwell", "Broadwell-noTSX", "SandyBridge", "IvyBridge", "Conroe", "Penryn", "Nehalem", "Westmere", "Opteron_G1", "Opteron_G2", "Opteron_G3", "Opteron_G4", "pentium", "pentium2", "pentium3", - "Kunpeng-920", "FT-2000+", "Tengyun-S2500", "Loongson-3A5000", "Loongson-3A4000-COMP"}) + "Kunpeng-920", "FT-2000+", "Tengyun-S2500", "Tengyun-S5000C", "Loongson-3A5000", "Loongson-3A4000-COMP"}) @BindResourceConfig({VmInstanceVO.class, ClusterVO.class}) public static GlobalConfig NESTED_VIRTUALIZATION = new GlobalConfig(CATEGORY, "vm.cpuMode"); @GlobalConfigValidation @@ -136,4 +134,10 @@ public class KVMGlobalConfig { @GlobalConfigDef(defaultValue = "false", description = "restart kvm host libvirtd service or not") @BindResourceConfig({HostVO.class, ClusterVO.class}) public static GlobalConfig RECONNECT_HOST_RESTART_LIBVIRTD_SERVICE = new GlobalConfig(CATEGORY, "reconnect.host.restart.libvirtd.service"); + + @GlobalConfigValidation + public static GlobalConfig KVMAGENT_PHYSICAL_MEMORY_USAGE_ALARM_THRESHOLD = new GlobalConfig(CATEGORY, "kvmagent.physicalmemory.usage.alarm.threshold"); + + @GlobalConfigValidation + public static GlobalConfig KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT = new GlobalConfig(CATEGORY, "kvmagent.physicalmemory.usage.hardlimit"); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java index db726386ae3..7ee841b5051 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMGlobalProperty.java @@ -10,7 +10,7 @@ */ @GlobalPropertyDefinition public class KVMGlobalProperty { - @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.2.0.tar.gz") + @GlobalProperty(name="KvmAgent.agentPackageName", defaultValue = "kvmagent-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="KvmAgent.agentUrlRootPath", defaultValue = "") public static String AGENT_URL_ROOT_PATH; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 33b2ddc7da4..ab8c29640f3 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -12,9 +12,8 @@ import org.zstack.compute.cluster.arch.ClusterResourceConfigInitializer; import org.zstack.compute.host.*; import org.zstack.compute.vm.*; -import org.zstack.core.config.GuestOsHelper; -import org.zstack.core.config.schema.GuestOsCharacter; import org.zstack.core.timeout.TimeHelper; +import org.zstack.header.core.*; import org.zstack.header.vm.devices.VirtualDeviceInfo; import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.core.CoreGlobalProperty; @@ -22,9 +21,13 @@ import org.zstack.core.Platform; import org.zstack.core.agent.AgentConstant; import org.zstack.core.ansible.*; +import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.CloudBusGlobalProperty; +import org.zstack.core.cloudbus.ResourceDestinationMaker; import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.config.GuestOsHelper; +import org.zstack.core.config.schema.GuestOsCharacter; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.db.SQLBatch; @@ -32,10 +35,12 @@ import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.thread.*; import org.zstack.core.timeout.ApiTimeoutManager; +import org.zstack.core.timeout.TimeHelper; import org.zstack.core.upgrade.UpgradeChecker; import org.zstack.core.upgrade.UpgradeGlobalConfig; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; +import org.zstack.core.workflow.SimpleFlowChain; import org.zstack.header.Constants; import org.zstack.header.allocator.DesignatedAllocateHostMsg; import org.zstack.header.allocator.HostAllocatorConstant; @@ -44,6 +49,8 @@ import org.zstack.header.cluster.ClusterVO; import org.zstack.header.cluster.ReportHostCapacityMessage; import org.zstack.header.core.*; +import org.zstack.header.core.progress.ChainInfo; +import org.zstack.header.core.progress.TaskInfo; import org.zstack.header.core.progress.TaskProgressRange; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; @@ -53,11 +60,7 @@ import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.*; import org.zstack.header.host.MigrateVmOnHypervisorMsg.StorageMigrationPolicy; -import org.zstack.header.image.ImageArchitecture; -import org.zstack.header.image.ImageBootMode; -import org.zstack.header.image.ImageInventory; -import org.zstack.header.image.ImagePlatform; -import org.zstack.header.image.ImageVO; +import org.zstack.header.image.*; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; @@ -71,6 +74,8 @@ import org.zstack.header.tag.SystemTagInventory; import org.zstack.header.vm.*; import org.zstack.header.vm.devices.DeviceAddress; +import org.zstack.header.vm.devices.VirtualDeviceInfo; +import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; import org.zstack.kvm.KVMAgentCommands.*; @@ -80,12 +85,12 @@ import org.zstack.network.l3.NetworkGlobalProperty; import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; +import org.zstack.resourceconfig.ResourceConfigVO; +import org.zstack.resourceconfig.ResourceConfigVO_; import org.zstack.tag.PatternedSystemTag; import org.zstack.tag.SystemTag; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; -import org.zstack.resourceconfig.ResourceConfigVO; -import org.zstack.resourceconfig.ResourceConfigVO_; import org.zstack.utils.*; import org.zstack.utils.data.SizeUnit; import org.zstack.utils.gson.JSONObjectUtil; @@ -103,7 +108,9 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; import java.util.stream.Collectors; import static org.zstack.core.Platform.*; @@ -156,6 +163,8 @@ public class KVMHost extends HostBase implements Host { private AccountManager accountMgr; @Autowired private UpgradeChecker upgradeChecker; + @Autowired + private ResourceDestinationMaker destMaker; private KVMHostContext context; @@ -214,7 +223,8 @@ public class KVMHost extends HostBase implements Host { private String attachVolumePath; private String detachVolumePath; private String vmFstrimPath; - private String blockCommitVolumePath; + private String blockCommitPath; + private String blockPullPath; private String agentPackageName = KVMGlobalProperty.AGENT_PACKAGE_NAME; private String hostTakeOverFlagPath = KVMGlobalProperty.TAKEVOERFLAGPATH; @@ -438,7 +448,11 @@ public KVMHost(KVMHostVO self, KVMHostContext context) { ub = UriComponentsBuilder.fromHttpUrl(baseUrl); ub.path(KVMConstant.KVM_BLOCK_COMMIT_VOLUME_PATH); - blockCommitVolumePath = ub.build().toString(); + blockCommitPath = ub.build().toString(); + + ub = UriComponentsBuilder.fromHttpUrl(baseUrl); + ub.path(KVMConstant.KVM_BLOCK_PULL_VOLUME_PATH); + blockPullPath = ub.build().toString(); } static { @@ -682,15 +696,235 @@ protected void handleLocalMessage(Message msg) { handle((GetHostPowerStatusMsg) msg); } else if (msg instanceof FstrimVmMsg) { handle((FstrimVmMsg) msg); - } else if (msg instanceof CommitVolumeOnHypervisorMsg) { - handle((CommitVolumeOnHypervisorMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnHypervisorMsg) { + handle((CommitVolumeSnapshotOnHypervisorMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnHypervisorMsg) { + handle((PullVolumeSnapshotOnHypervisorMsg) msg); } else if (msg instanceof TakeVmConsoleScreenshotMsg) { handle((TakeVmConsoleScreenshotMsg) msg); + } else if (msg instanceof RestartKvmAgentMsg) { + handle((RestartKvmAgentMsg) msg); } else { super.handleLocalMessage(msg); } } + private void handle(RestartKvmAgentMsg msg) { + RestartKvmAgentReply reply = new RestartKvmAgentReply(); + thdf.singleFlightSubmit(new SingleFlightTask(msg) + .setSyncSignature(String.format("restart-kvmagent-on-host-%s", msg.getHostUuid())) + .run(completion -> { + if (!destMaker.isManagedByUs(msg.getHostUuid())) { + completion.fail(operr("host %s is not managed by current mn node", msg.getHostUuid())); + return; + } + + restartKvmAgentOnHost(msg.isForce(), new Completion(completion) { + @Override + public void success() { + completion.success(null); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + }).done(result -> { + if (!result.isSuccess()) { + reply.setError(result.getErrorCode()); + } + bus.reply(msg, reply); + }) + ); + } + + private void noRunningTaskOnHost(ReturnValueCompletion completion) { + String syncSignature = Host.buildId(self.getUuid()); + List nodeUuids = destMaker.getAllNodeInfo().stream().map(ResourceDestinationMaker.NodeInfo::getNodeUuid) + .collect(Collectors.toList()); + + AtomicBoolean queueIsEmpty = new AtomicBoolean(true); + new While<>(nodeUuids).step((mnId, compl) -> { + GetLocalTaskMsg gmsg = new GetLocalTaskMsg(); + gmsg.setOnlyRunningTask(true); + gmsg.setSyncSignatures(Collections.singletonList(syncSignature)); + bus.makeServiceIdByManagementNodeId(gmsg, CoreConstant.SERVICE_ID, mnId); + bus.send(gmsg, new CloudBusCallBack(compl) { + private String buildTaskInfo(List tasks) { + return tasks.stream().map(TaskInfo::getContext).collect(Collectors.joining("\n")); + } + + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + compl.addError(r.getError()); + compl.allDone(); + return; + } + GetLocalTaskReply gr = r.castReply(); + ChainInfo chainInfo = gr.getResults().get(syncSignature); + if (!chainInfo.getRunningTask().isEmpty()) { + logger.debug(String.format("%s tasks exist on the running task of host %s, mnNodeId %s: %s...", chainInfo.getRunningTask().size(), + self.getUuid(), mnId, buildTaskInfo(chainInfo.getRunningTask()))); + queueIsEmpty.set(false); + compl.allDone(); + return; + } + compl.done(); + } + }); + }, 2).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList); + return; + } + completion.success(queueIsEmpty.get()); + } + }); + } + + private void restartKvmAgentOnHost(boolean force, Completion completion) { + SimpleFlowChain chain = new SimpleFlowChain(); + chain.setChainName("try-restart-kvmagent-on-host-" + self.getUuid()); + chain.then(new Flow() { + // changing the host connection status to 'Connecting' is to prevent sending HTTP requests to the kvmagent, + // which needs to be done before checking the host task queue + String __name__ = "change host state to connecting"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (self.getStatus() != HostStatus.Connected) { + trigger.fail(operr("host %s is not connected, skip to restart kvmagent", self.getUuid())); + return; + } + changeConnectionState(HostStatusEvent.connecting); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (self.getStatus() == HostStatus.Connecting) { + changeConnectionState(HostStatusEvent.connected); + } + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "check if the host task queue is empty"; + @Override + public boolean skip(Map data) { + return force; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + noRunningTaskOnHost(new ReturnValueCompletion(trigger) { + @Override + public void success(Boolean noTask) { + if (noTask) { + trigger.next(); + } else { + trigger.fail(operr("running task exists on host %s", self.getUuid())); + } + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "restart kvmagent on host " + self.getUuid(); + @Override + public boolean skip(Map data) { + return CoreGlobalProperty.UNIT_TEST_ON; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + SshShell sshShell = new SshShell(); + sshShell.setHostname(getSelf().getManagementIp()); + sshShell.setUsername(getSelf().getUsername()); + sshShell.setPassword(getSelf().getPassword()); + sshShell.setPort(getSelf().getPort()); + SshResult ret = sshShell.runCommand("sudo service zstack-kvmagent restart"); + + if (ret.isSshFailure() || ret.getReturnCode() != 0) { + trigger.fail(operr(ret.getExitErrorMessage())); + } else { + trigger.next(); + } + } + }).then(new NoRollbackFlow() { + String __name__ = "wait for kvmagent to be ready"; + + @Override + public void run(FlowTrigger trigger, Map data) { + int retryCount = 60; + While.makeRetryWhile(retryCount).each((currentStep, compl) -> { + PingCmd cmd = new PingCmd(); + cmd.hostUuid = self.getUuid(); + restf.asyncJsonPost(pingPath, cmd, new JsonAsyncRESTCallback(compl) { + @Override + public void fail(ErrorCode err) { + try { + if (currentStep < retryCount) { + TimeUnit.SECONDS.sleep(1); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + compl.addError(err); + compl.done(); + } + } + + @Override + public void success(PingResponse ret) { + compl.allDone(); + } + + @Override + public Class getReturnClass() { + return PingResponse.class; + } + }, TimeUnit.SECONDS, HostGlobalConfig.PING_HOST_TIMEOUT.value(Long.class)); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().size() == retryCount) { + logger.debug("waiting for kvmagent to start timeout: " + errorCodeList.getCauses().get(0).getDetails()); + } + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = String.format("reconnect host %s after restart kvmagent", self.getUuid()); + + public void run(FlowTrigger trigger, Map data) { + ReconnectHostMsg rmsg = new ReconnectHostMsg(); + rmsg.setHostUuid(self.getUuid()); + bus.makeTargetServiceIdByResourceUuid(rmsg, HostConstant.SERVICE_ID, self.getUuid()); + bus.send(rmsg); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + private void handle(TakeVmConsoleScreenshotMsg msg) { TakeVmConsoleScreenshotReply reply = new TakeVmConsoleScreenshotReply(); thdf.singleFlightSubmit(new SingleFlightTask(msg) @@ -748,64 +982,27 @@ public void run(MessageReply reply) { }); } - private void handle(CommitVolumeOnHypervisorMsg msg) { - inQueue().name(String.format("block-commit-on-kvm-%s", self.getUuid())) + private void handle(CommitVolumeSnapshotOnHypervisorMsg msg) { + inQueue().name(String.format("commit-volume-snapshot-on-kvm-%s", self.getUuid())) .asyncBackup(msg) - .run(chain -> { - commitVolume(msg); - chain.next(); - }); - } - - private void commitVolume(final CommitVolumeOnHypervisorMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return getName(); - } - - @Override - public void run(SyncTaskChain chain) { - doCommitVolume(msg, new NoErrorCompletion() { + .run(chain -> commitVolumeSnapshot(msg, new NoErrorCompletion(chain) { @Override public void done() { chain.next(); } - }); - } - - @Override - protected int getSyncLevel() { - return KVMGlobalConfig.HOST_SNAPSHOT_SYNC_LEVEL.value(Integer.class); - } - - @Override - public String getName() { - return String.format("block-commit-volume-on-kvm-%s", self.getUuid()); - } - }); + })); } - private void doCommitVolume(final CommitVolumeOnHypervisorMsg msg, final NoErrorCompletion completion) { + private void commitVolumeSnapshot(final CommitVolumeSnapshotOnHypervisorMsg msg, final NoErrorCompletion completion) { checkStateAndStatus(); - final CommitVolumeOnHypervisorReply reply = new CommitVolumeOnHypervisorReply(); - BlockCommitVolumeCmd cmd = new BlockCommitVolumeCmd(); - if (msg.getVmUuid() != null) { - VmInstanceState state = Q.New(VmInstanceVO.class) - .eq(VmInstanceVO_.uuid, msg.getVmUuid()) - .select(VmInstanceVO_.state) - .findValue(); - - if (state != VmInstanceState.Running && state != VmInstanceState.Stopped && state != VmInstanceState.Paused) { - throw new OperationFailureException(operr("vm[uuid:%s] is not Running or Stopped, current state[%s]", msg.getVmUuid(), state)); - } - } - - cmd.setVmUuid(msg.getVmUuid()); + CommitVolumeSnapshotOnHypervisorReply reply = new CommitVolumeSnapshotOnHypervisorReply(); + BlockCommitCmd cmd = new BlockCommitCmd(); + cmd.setVmUuid(msg.getVolume().getVmInstanceUuid()); cmd.setVolume(VolumeTO.valueOf(msg.getVolume(), (KVMHostInventory) getSelfInventory())); - cmd.setTop(msg.getSrcPath()); - cmd.setBase(msg.getDstPath()); + cmd.setTop(msg.getSrcSnapshot().getPrimaryStorageInstallPath()); + cmd.setBase(msg.getDstSnapshot().getPrimaryStorageInstallPath()); + cmd.setTopChildrenInstallPathInDb(msg.getSrcChildrenInstallPathInDb()); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("block-commit-for-volume-%s", msg.getVolume().getUuid())); @@ -836,21 +1033,16 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - new Http<>(blockCommitVolumePath, cmd, BlockCommitVolumeResponse.class).call(new ReturnValueCompletion(msg, trigger) { + new Http<>(blockCommitPath, cmd, BlockCommitResponse.class).call(new ReturnValueCompletion(msg, completion) { @Override - public void success(BlockCommitVolumeResponse ret) { - if (ret.isSuccess()) { - if (Objects.equals(ret.getNewVolumeInstallPath(), cmd.getTop())) { - throw new OperationFailureException(operr("after block commit, new volume path still use %s", ret.getNewVolumeInstallPath())); - } - } else { + public void success(BlockCommitResponse ret) { + if (!ret.isSuccess()) { ErrorCode err = operr("operation error, because:%s", ret.getError()); extEmitter.failedToCommitVolume((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); trigger.fail(err); return; } - reply.setNewVolumeInstallPath(ret.getNewVolumeInstallPath()); reply.setSize(ret.getSize()); trigger.next(); } @@ -904,6 +1096,118 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + private void handle(final PullVolumeSnapshotOnHypervisorMsg msg) { + inQueue().name(String.format("pull-volume-snapshot-on-kvm-%s", self.getUuid())) + .asyncBackup(msg) + .run(chain -> pullVolumeSnapshot(msg, new NoErrorCompletion(chain) { + @Override + public void done() { + chain.next(); + } + })); + } + + private void pullVolumeSnapshot(PullVolumeSnapshotOnHypervisorMsg msg, final NoErrorCompletion completion) { + checkStateAndStatus(); + + final PullVolumeSnapshotOnHypervisorReply reply = new PullVolumeSnapshotOnHypervisorReply(); + BlockPullCmd cmd = new BlockPullCmd(); + cmd.setBase(msg.getSrcSnapshotParentPath()); + cmd.setVmUuid(msg.getVolume().getVmInstanceUuid()); + cmd.setVolume(VolumeTO.valueOf(msg.getVolume(), (KVMHostInventory) getSelfInventory())); + + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("block-pull-for-volume-%s", msg.getVolume().getUuid())); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = String.format("before-block-pull-for-volume-%s", msg.getVolume().getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + extEmitter.beforePullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("do-block-pull-for-volume-%s", msg.getVolume().getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + new Http<>(blockPullPath, cmd, BlockPullResponse.class).call(new ReturnValueCompletion(msg, completion) { + @Override + public void success(BlockPullResponse ret) { + if (!ret.isSuccess()) { + ErrorCode err = operr("operation error, because:%s", ret.getError()); + extEmitter.failedToPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, ret, err); + trigger.fail(err); + return; + } + + reply.setSize(ret.getSize()); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + extEmitter.failedToPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, null, errorCode); + reply.setError(errorCode); + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("after-block-pull-for-volume-%s", msg.getVolume().getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + extEmitter.afterPullVolume((KVMHostInventory) getSelfInventory(), msg, cmd, reply, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + bus.reply(msg, reply); + completion.done(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + completion.done(); + } + }); + } + }).start(); + } + private void handle(GetHostPowerStatusMsg msg) { handleGetPowerStatusByIpmi(msg); } @@ -940,14 +1244,16 @@ private void handle(GetHostWebSshUrlMsg msg) { } KVMHostVO host = dbf.findByUuid(msg.getHostUuid(), KVMHostVO.class); - HTTP.Builder hb = HTTP.post(); - hb.body(""); - hb.url(String.format("http://localhost:%s?username=%s&&hostname=%s&&port=%s&&password=%s", - KVMGlobalConfig.HOST_WEBSSH_PORT.value(), - msg.getUserName(), - host.getManagementIp(), - host.getPort().toString(), - msg.getPassword())); + + Map formMap = new HashMap<>(); + formMap.put("username", msg.getUserName()); + formMap.put("hostname", host.getManagementIp()); + formMap.put("port", host.getPort().toString()); + formMap.put("password", msg.getPassword()); + + HTTP.Builder hb = HTTP.post() + .url(String.format("http://localhost:%s", KVMGlobalConfig.HOST_WEBSSH_PORT.value())) + .formData(formMap); try (Response r = hb.callWithException()) { // 1. webssh maybe is not running @@ -1086,12 +1392,11 @@ private void handleShutdownHostByIpmi(ShutdownHostMsg msg, NoErrorCompletion com Completion c = new Completion(msg, completion) { @Override public void success() { - changeConnectionState(HostStatusEvent.disconnected); if (msg.isReturnEarly()) { bus.reply(msg, reply); - } else { - submitTaskWaitHostShutdownByIpmi(); } + + submitTaskWaitHostShutdownByIpmi(); completion.done(); } @@ -1116,16 +1421,26 @@ public boolean run() { HostVO host = dbf.findByUuid(msg.getHostUuid(), HostVO.class); if (timeHelper.getCurrentTimeMillis() > deadline) { - reply.setError(operr(String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); - reply.setSuccess(false); - bus.reply(msg, reply); HostIpmiVO ipmi = host.getIpmi(); kvmHostIpmiPowerExecutor.updateIpmiPowerStatusInDB(ipmi, HostPowerStatus.POWER_ON); + if (!msg.isReturnEarly()) { + reply.setError(operr(String.format("Host[%s] has not been shut down within %d seconds for an unknown reason. Please check host status in BMC[%s]", msg.getHostUuid(), timeoutInSec, host.getIpmi().getIpmiAddress()))); + reply.setSuccess(false); + bus.reply(msg, reply); + } return true; } HostPowerStatus status = kvmHostIpmiPowerExecutor.refreshHostPowerStatus(host).getIpmiPowerStatus(); if (HostPowerStatus.POWER_OFF.equals(status)) { - bus.reply(msg, reply); + Consumer c = msg.getOriginState() == null ? null : h -> { + logger.debug(String.format("host[uuid:%s, name:%s, ip:%s] is power off, set it to origin state %s", + h.getUuid(), h.getName(), h.getManagementIp(), msg.getOriginState())); + h.setState(HostState.valueOf(msg.getOriginState())); + }; + changeConnectionState(HostStatusEvent.disconnected, c); + if (!msg.isReturnEarly()) { + bus.reply(msg, reply); + } return true; } if (HostPowerStatus.POWER_ON.equals(status)) { @@ -1266,14 +1581,12 @@ public void fail(ErrorCode errorCode) { } private void handle(CompareCpuFunctionOnHostMsg msg) { - CompareCpuFunctionOnHostReply reply = new CompareCpuFunctionOnHostReply(); - thdf.singleFlightSubmit(new SingleFlightTask(msg) .setSyncSignature(String.format("compare-host-%s-cpu-function-xml-on-host-%s", msg.getSrcHostUuid(), msg.getDstHostUuid())) - .run((com) -> compareCpuFunctionOnHost(msg, new ReturnValueCompletion(com) { + .run((com) -> compareCpuFunctionOnHost(msg, new ReturnValueCompletion(com) { @Override - public void success(CompareCpuFunctionOnHostReply returnValue) { - com.success(returnValue); + public void success(VmCompareCpuFunctionResponse resp) { + com.success(resp); } @Override @@ -1282,14 +1595,20 @@ public void fail(ErrorCode errorCode) { } })) .done(((result) -> { + CompareCpuFunctionOnHostReply reply = new CompareCpuFunctionOnHostReply(); if (!result.isSuccess()) { reply.setError(result.getErrorCode()); + bus.reply(msg, reply); + return; } + VmCompareCpuFunctionResponse resp = (VmCompareCpuFunctionResponse)result.getResult(); + reply.setMatch(resp.isMatch()); + reply.setCompareError(resp.getCompareError()); bus.reply(msg, reply); }))); } - private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, ReturnValueCompletion completion) { + private void compareCpuFunctionOnHost(final CompareCpuFunctionOnHostMsg msg, ReturnValueCompletion completion) { VmCompareCpuFunctionCmd cmd = new VmCompareCpuFunctionCmd(); cmd.setCpuXml(msg.getCpuXml()); restf.asyncJsonPost(compareCpuFunctionPath, cmd, new JsonAsyncRESTCallback(completion) { @@ -1299,7 +1618,7 @@ public void success(VmCompareCpuFunctionResponse ret) { completion.fail(operr(ret.getError())); return; } - completion.success(new CompareCpuFunctionOnHostReply()); + completion.success(ret); } @Override @@ -1475,6 +1794,7 @@ public void run(MessageReply reply) { rmsg.setTotalMemory(rsp.getTotalMemory()); rmsg.setUsedMemory(rsp.getUsedMemory()); rmsg.setCpuSockets(rsp.getCpuSockets()); + rmsg.setCpuCoreNum(rsp.getCpuCoreNum()); rmsg.setServiceId(bus.makeLocalServiceId(HostAllocatorConstant.SERVICE_ID)); bus.send(rmsg, new CloudBusCallBack(msg) { @Override @@ -1963,6 +2283,10 @@ protected RunInQueue inQueue() { return new RunInQueue(id, thdf, getHostSyncLevel()); } + protected RunInQueue inQueue(int level) { + return new RunInQueue(id, thdf, level); + } + private void handle(final VmDirectlyDestroyOnHypervisorMsg msg) { inQueue().name(String.format("directly-delete-vm-%s-msg-on-kvm-%s", msg.getVmUuid(), self.getUuid())) .asyncBackup(msg) @@ -2454,10 +2778,10 @@ private void mergeVolumeSnapshot(final MergeVolumeSnapshotOnKvmMsg msg, final No MergeSnapshotCmd cmd = new MergeSnapshotCmd(); cmd.setFullRebase(msg.isFullRebase()); - cmd.setDestPath(volume.getInstallPath()); cmd.setSrcPath(msg.getFrom() != null ? msg.getFrom().getPrimaryStorageInstallPath() : null); cmd.setVmUuid(volume.getVmInstanceUuid()); cmd.setVolume(VolumeTO.valueOf(volume, (KVMHostInventory) getSelfInventory())); + cmd.setDestPath(cmd.getVolume().getInstallPath()); extEmitter.beforeMergeSnapshot((KVMHostInventory) getSelfInventory(), msg, cmd); new Http<>(mergeSnapshotPath, cmd, MergeSnapshotRsp.class) @@ -2828,9 +3152,11 @@ public void fail(ErrorCode errorCode) { public void run(final FlowTrigger trigger, Map data) { TaskProgressRange stage = markTaskStage(parentStage, MIGRATE_VM_STAGE); - boolean autoConverage = rcf.getResourceConfigValue(KVMGlobalConfig.MIGRATE_AUTO_CONVERGE, vmUuid, Boolean.class); - if (!autoConverage) { - autoConverage = s.strategy != null && s.strategy.equals("auto-converge"); + boolean autoConverge; + if (s.strategy != null) { + autoConverge = s.strategy.equals("auto-converge"); + } else { + autoConverge = rcf.getResourceConfigValue(KVMGlobalConfig.MIGRATE_AUTO_CONVERGE, vmUuid, Boolean.class); } boolean xbzrle = KVMGlobalConfig.MIGRATE_XBZRLE.value(Boolean.class); @@ -2842,7 +3168,7 @@ public void run(final FlowTrigger trigger, Map data) { cmd.setMigrateFromDestination(migrateFromDestination); cmd.setStorageMigrationPolicy(storageMigrationPolicy == null ? null : storageMigrationPolicy.toString()); cmd.setVmUuid(vmUuid); - cmd.setAutoConverge(autoConverage); + cmd.setAutoConverge(autoConverge); cmd.setXbzrle(xbzrle); cmd.setVdpaPaths((List) data.get("vDPA_paths")); cmd.setUseNuma(rcf.getResourceConfigValue(VmGlobalConfig.NUMA, vmUuid, Boolean.class)); @@ -3858,16 +4184,17 @@ private NicTO completeNicInfo(VmNicInventory nic) { if (to.getUseVirtio() == null) { to.setUseVirtio(VmSystemTags.VIRTIO.hasTag(nic.getVmInstanceUuid())); to.setIps(getCleanTrafficIp(nic)); + if (to.getUseVirtio() && Q.New(VmNicVO.class) + .eq(VmNicVO_.uuid, nic.getUuid()).eq(VmNicVO_.driverType, VmNicDriverType.VIRTIO.toString()).isExists()) { + to.setDriverType(VmNicDriverType.VIRTIO.toString()); + } } String tagValue = VmSystemTags.CLEAN_TRAFFIC.getTokenByResourceUuid(nic.getVmInstanceUuid(), VmSystemTags.CLEAN_TRAFFIC_TOKEN); to.setCleanTraffic(tagValue == null ? Boolean.FALSE : Boolean.parseBoolean(tagValue)); - String nicType = nic.getType(); - if (!nicType.equals(VmInstanceConstant.VIRTUAL_NIC_TYPE) && - !nicType.equals(VmOvsNicConstant.ACCEL_TYPE_VDPA) && - !nicType.equals(VmOvsNicConstant.ACCEL_TYPE_VHOST_USER_SPACE) && - !nic.getType().equals(VmInstanceConstant.TF_VIRTUAL_NIC_TYPE)) { + VmNicType nicType = VmNicType.valueOf(nic.getType()); + if (!nicType.isHasAddon()) { return to; } @@ -4279,8 +4606,8 @@ public void success(StartVmResponse ret) { @Override public void fail(ErrorCode err) { StartVmOnHypervisorReply reply = new StartVmOnHypervisorReply(); - reply.setError(err); - reply.setSuccess(false); + reply.setError(err(HostErrors.FAILED_TO_START_VM_ON_HYPERVISOR, "failed to start vm[uuid: %s] on kvm host[uuid: %s], because %s", + spec.getVmInventory().getUuid(), self.getUuid(), err)); extEmitter.startVmOnKvmFailed(KVMHostInventory.valueOf(getSelf()), spec, err); bus.reply(msg, reply); completion.done(); @@ -4645,6 +4972,8 @@ public void setup() { public void run(FlowTrigger trigger, Map data) { PingCmd cmd = new PingCmd(); cmd.hostUuid = self.getUuid(); + cmd.kvmagentPhysicalMemoryUsageAlarmThreshold = gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_ALARM_THRESHOLD.getName(), Long.class); + cmd.kvmagentPhysicalMemoryUsageHardLimit = gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT.getName(), Long.class); restf.asyncJsonPost(pingPath, cmd, new JsonAsyncRESTCallback(trigger) { @Override public void fail(ErrorCode err) { @@ -4809,6 +5138,7 @@ private ErrorCode connectToAgent() { cmd.setIgnoreMsrs(KVMGlobalConfig.KVM_IGNORE_MSRS.value(Boolean.class)); cmd.setTcpServerPort(KVMGlobalProperty.TCP_SERVER_PORT); cmd.setVersion(dbf.getDbVersion()); + cmd.setInstallHostShutdownHook(KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.value(Boolean.class)); if (HostSystemTags.PAGE_TABLE_EXTENSION_DISABLED.hasTag(self.getUuid(), HostVO.class) || !KVMSystemTags.EPT_CPU_FLAG.hasTag(self.getUuid())) { cmd.setPageTableExtensionDisabled(true); } @@ -5228,8 +5558,14 @@ public void run(FlowTrigger trigger, Map data) { return; } String timestampOutput = timeRet.getStdout().replaceAll("\r|\n",""); + long currentTimeSeconds = new Date().getTime() / 1000; + long timestampSeconds = Long.parseLong(timestampOutput); - long diff = (new Date().getTime() / 1000) - Long.parseLong(timestampOutput); + if (currentTimeSeconds < timestampSeconds) { + logger.warn(String.format("Current time is earlier than the timestamp. Possible clock synchronization issue. Current: %d, Timestamp: %d", currentTimeSeconds, timestampSeconds)); + } + + long diff = Math.abs(currentTimeSeconds - timestampSeconds); logger.debug(String.format("hostOutput is %s ,The time difference is %d(s) ", hostOutput, diff)); if (diff < HostGlobalConfig.PING_HOST_INTERVAL.value(int.class)) { @@ -5400,8 +5736,8 @@ public void run(final FlowTrigger trigger, Map data) { deployArguments.setInit("true"); runner.setFullDeploy(true); } - if (NetworkGlobalProperty.SKIP_IPV6) { - deployArguments.setSkipIpv6("true"); + if (NetworkGlobalProperty.SKIP_IPV6 || NetworkGlobalProperty.BRIDGE_DISABLE_IP6TABLES) { + deployArguments.setDisableIp6Tables("true"); } for (KvmHostAgentDeploymentExtensionPoint ext : pluginRegistry.getExtensionList(KvmHostAgentDeploymentExtensionPoint.class)) { @@ -5412,9 +5748,9 @@ public void run(final FlowTrigger trigger, Map data) { List extraPackagesFromExt = ext.appendExtraPackages(getSelfInventory()); if (extraPackagesFromExt != null && !extraPackagesFromExt.isEmpty()) { if (deployArguments.getExtraPackages() != null) - deployArguments.setExtraPackages(deployArguments.getExtraPackages() + "," + String.join(",", extraPackagesFromExt)); + deployArguments.setExtraPackages(deployArguments.getExtraPackages() + " " + String.join(" ", extraPackagesFromExt)); else - deployArguments.setExtraPackages(String.join(",", extraPackagesFromExt)); + deployArguments.setExtraPackages(String.join(" ", extraPackagesFromExt)); } ext.modifyDeploymentArguments(getSelfInventory(), deployArguments); @@ -5427,13 +5763,10 @@ public void run(final FlowTrigger trigger, Map data) { if ("baremetal2".equals(self.getHypervisorType())) { deployArguments.setIsBareMetal2Gateway("true"); } - if (KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.value(Boolean.class)) { - deployArguments.setIsInstallHostShutdownHook("true"); - runner.setForceRun(true); - } String enableKsm = rcf.getResourceConfigValue(KVMGlobalConfig.HOST_KSM, self.getUuid(), String.class); kvmHostConfigChecker.setRequireKsmCheck(enableKsm); + kvmHostConfigChecker.setRequireReservePorts("49152-49215"); deployArguments.setIsEnableKsm(enableKsm); if (NetworkGlobalProperty.BRIDGE_DISABLE_IPTABLES) { @@ -5486,19 +5819,20 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { + String allowPorts = KVMGlobalConfig.KVMAGENT_ALLOW_PORTS_LIST.value(String.class) + ',' + HostGlobalConfig.NBD_PORT_RANGE.value(String.class); StringBuilder builder = new StringBuilder(); if (!KVMGlobalProperty.MN_NETWORKS.isEmpty()) { builder.append(String.format("bash %s -m %s -p %s -s %s -c %s", "/var/lib/zstack/kvm/kvmagent-iptables", KVMConstant.IPTABLES_COMMENTS, - KVMGlobalConfig.KVMAGENT_ALLOW_PORTS_LIST.value(String.class), + allowPorts, KVMGlobalProperty.AGENT_PORT, String.join(",", KVMGlobalProperty.MN_NETWORKS))); } else { builder.append(String.format("bash %s -m %s -p %s -s %s", "/var/lib/zstack/kvm/kvmagent-iptables", KVMConstant.IPTABLES_COMMENTS, - KVMGlobalConfig.KVMAGENT_ALLOW_PORTS_LIST.value(String.class), + allowPorts, KVMGlobalProperty.AGENT_PORT)); } @@ -5546,7 +5880,6 @@ public void fail(ErrorCode errorCode) { runner.setUsername(getSelf().getUsername()); runner.setPassword(getSelf().getPassword()); runner.setSshPort(getSelf().getPort()); - runner.restartAgent(AnsibleConstant.KVM_AGENT_NAME, new Completion(trigger) { @Override public void success() { @@ -5772,7 +6105,6 @@ private void saveGeneralHostHardwareFacts(HostFactResponse ret) { recordHardwareChangesAndCreateTag(HostSystemTags.SYSTEM_MANUFACTURER, HostSystemTags.SYSTEM_MANUFACTURER_TOKEN, ret.getSystemManufacturer(), errorCodeList); recordHardwareChangesAndCreateTag(HostSystemTags.SYSTEM_UUID, HostSystemTags.SYSTEM_UUID_TOKEN, ret.getSystemUUID(), errorCodeList); recordHardwareChangesAndCreateTag(HostSystemTags.MEMORY_SLOTS_MAXIMUM, HostSystemTags.MEMORY_SLOTS_MAXIMUM_TOKEN, ret.getMemorySlotsMaximum(), errorCodeList); - createTagWithoutNonValue(HostSystemTags.POWER_SUPPLY_MODEL_NAME, HostSystemTags.POWER_SUPPLY_MODEL_NAME_TOKEN, ret.getPowerSupplyModelName(), true); createTagWithoutNonValue(HostSystemTags.POWER_SUPPLY_MANUFACTURER, HostSystemTags.POWER_SUPPLY_MANUFACTURER_TOKEN, ret.getPowerSupplyManufacturer(), true); createTagWithoutNonValue(HostSystemTags.IPMI_ADDRESS, HostSystemTags.IPMI_ADDRESS_TOKEN, ret.getIpmiAddress(), true); @@ -5783,6 +6115,8 @@ private void saveGeneralHostHardwareFacts(HostFactResponse ret) { createTagWithoutNonValue(HostSystemTags.BMC_VERSION, HostSystemTags.BMC_VERSION_TOKEN, ret.getBmcVersion(), true); createTagWithoutNonValue(HostSystemTags.UPTIME, HostSystemTags.UPTIME_TOKEN, ret.getUptime(), true); createTagWithoutNonValue(HostSystemTags.ISCSI_INITIATOR_NAME, HostSystemTags.ISCSI_INITIATOR_NAME_TOKEN, ret.getIscsiInitiatorName(), true); + createTagWithoutNonValue(HostSystemTags.DEPLOY_MODE, HostSystemTags.DEPLOY_MODE_TOKEN, ret.getDeployMode(), true); + saveHostExtraIps(ret); @@ -5830,6 +6164,10 @@ private boolean checkVirtualizationEnabled(HostFactResponse response) { private void saveKvmHostRelatedFacts(HostFactResponse ret) { updateHostOsInformation(ret.getOsDistribution(), ret.getOsRelease(), ret.getOsVersion()); + if (ret.getLibvirtPackageVersion() != null) { + createTagWithoutNonValue(KVMSystemTags.LIBVIRT_PACKAGE_VERSION, KVMSystemTags.LIBVIRT_PACKAGE_VERSION_TOKEN, ret.getLibvirtPackageVersion().trim(), false); + } + createTagWithoutNonValue(KVMSystemTags.QEMU_IMG_VERSION, KVMSystemTags.QEMU_IMG_VERSION_TOKEN, ret.getQemuImgVersion(), false); createTagWithoutNonValue(KVMSystemTags.LIBVIRT_VERSION, KVMSystemTags.LIBVIRT_VERSION_TOKEN, ret.getLibvirtVersion(), false); createTagWithoutNonValue(KVMSystemTags.HVM_CPU_FLAG, KVMSystemTags.HVM_CPU_FLAG_TOKEN, ret.getHvmCpuFlag(), false); @@ -5909,13 +6247,12 @@ public void success(KVMAgentCommands.ShutdownHostResponse ret) { return; } - changeConnectionState(HostStatusEvent.disconnected); if (msg.isReturnEarly()) { bus.reply(msg, reply); completion.done(); - } else { - waitForHostShutdown(reply, completion); } + + waitForHostShutdown(reply, completion); } private boolean testPort() { @@ -5941,10 +6278,12 @@ private void waitForHostShutdown(ShutdownHostReply reply, NoErrorCompletion noEr @Override public boolean run() { if (isTimeout()) { - reply.setSuccess(false); - reply.setError(operr("host[%s] not shutdown in %d seconds",msg.getHostUuid(), ctimeout)); - bus.reply(msg,reply); - noErrorCompletion.done(); + if (!msg.isReturnEarly()) { + reply.setSuccess(false); + reply.setError(operr("host[%s] not shutdown in %d seconds", msg.getHostUuid(), ctimeout)); + bus.reply(msg, reply); + noErrorCompletion.done(); + } return true; } @@ -5952,8 +6291,16 @@ public boolean run() { return false; } - bus.reply(msg, reply); - noErrorCompletion.done(); + Consumer c = msg.getOriginState() == null ? null : h -> { + logger.debug(String.format("host[uuid:%s, name:%s, ip:%s] is power off, set it to origin state %s", + h.getUuid(), h.getName(), h.getManagementIp(), msg.getOriginState())); + h.setState(HostState.valueOf(msg.getOriginState())); + }; + changeConnectionState(HostStatusEvent.disconnected, c); + if (!msg.isReturnEarly()) { + bus.reply(msg, reply); + noErrorCompletion.done(); + } return true; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java index 9a8488b5157..13e929c1d5d 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostDeployArguments.java @@ -1,7 +1,11 @@ package org.zstack.kvm; import com.google.gson.annotations.SerializedName; +import org.apache.commons.lang.StringUtils; import org.zstack.core.ansible.SyncTimeRequestedDeployArguments; +import org.zstack.header.errorcode.OperationFailureException; + +import static org.zstack.core.Platform.operr; public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { @SerializedName("pkg_kvmagent") @@ -10,6 +14,8 @@ public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { private String init; @SerializedName("skipIpv6") private String skipIpv6; + @SerializedName("disableIp6Tables") + private String disableIp6Tables; @SerializedName("isBareMetal2Gateway") private String isBareMetal2Gateway; @SerializedName("bridgeDisableIptables") @@ -22,8 +28,6 @@ public class KVMHostDeployArguments extends SyncTimeRequestedDeployArguments { private String updatePackages; @SerializedName("post_url") private String postUrl; - @SerializedName("isInstallHostShutdownHook") - private String isInstallHostShutdownHook; @SerializedName("isEnableKsm") private String isEnableKsm; @SerializedName("enable_spice_tls") @@ -53,6 +57,14 @@ public void setSkipIpv6(String skipIpv6) { this.skipIpv6 = skipIpv6; } + public String getDisableIp6Tables() { + return disableIp6Tables; + } + + public void setDisableIp6Tables(String disableIp6Tables) { + this.disableIp6Tables = disableIp6Tables; + } + public String getIsBareMetal2Gateway() { return isBareMetal2Gateway; } @@ -101,14 +113,6 @@ public void setPostUrl(String postUrl) { this.postUrl = postUrl; } - public String getIsInstallHostShutdownHook() { - return isInstallHostShutdownHook; - } - - public void setIsInstallHostShutdownHook(String isInstallHostShutdownHook) { - this.isInstallHostShutdownHook = isInstallHostShutdownHook; - } - public String getIsEnableKsm() { return isEnableKsm; } @@ -161,4 +165,12 @@ public boolean isForceRun() { public void setForceRun(boolean forceRun) { this.forceRun = forceRun; } + + public void enableForceRunWithReason(String reason) { + this.forceRun = true; + if (StringUtils.isEmpty(reason)) { + throw new OperationFailureException(operr("the reason must be stated when setting force run")); + } + logger.info(String.format("set ansible to force run, because %s", reason)); + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java index 80fcabd6d36..4d4fa167b7e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostFactory.java @@ -7,30 +7,22 @@ import org.zstack.compute.vm.CrashStrategy; import org.zstack.compute.vm.VmGlobalConfig; import org.zstack.compute.vm.VmNicManager; -import org.zstack.core.config.GuestOsExtensionPoint; -import org.zstack.core.config.schema.GuestOsCharacter; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.network.l2.*; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.tag.SystemTagInventory; -import org.zstack.header.tag.SystemTagLifeCycleListener; -import org.zstack.header.tag.SystemTagValidator; -import org.zstack.header.vm.devices.VmInstanceDeviceManager; -import org.zstack.network.l3.ServiceTypeExtensionPoint; -import org.zstack.kvm.xmlhook.APICreateVmUserDefinedXmlHookScriptMsg; -import org.zstack.kvm.xmlhook.XmlHookBase; -import org.zstack.kvm.xmlhook.XmlHookMessage; -import org.zstack.kvm.xmlhook.XmlHookVO; -import org.zstack.resourceconfig.ResourceConfig; -import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.ansible.AnsibleFacade; -import org.zstack.core.cloudbus.*; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusListCallBack; +import org.zstack.core.cloudbus.CloudBusSteppingCallback; +import org.zstack.core.cloudbus.EventFacade; +import org.zstack.core.cloudbus.MessageSafe; +import org.zstack.core.cloudbus.ResourceDestinationMaker; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigException; +import org.zstack.core.config.GlobalConfigFacade; import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.config.GlobalConfigValidatorExtensionPoint; +import org.zstack.core.config.GuestOsExtensionPoint; +import org.zstack.core.config.schema.GuestOsCharacter; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; @@ -42,6 +34,7 @@ import org.zstack.header.AbstractService; import org.zstack.header.Component; import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.*; @@ -49,18 +42,42 @@ import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.l2.L2NetworkClusterRefVO; +import org.zstack.header.network.l2.L2NetworkClusterRefVO_; +import org.zstack.header.network.l2.L2NetworkType; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.L2NetworkVO_; import org.zstack.header.rest.RESTFacade; import org.zstack.header.rest.SyncHttpCallHandler; import org.zstack.header.tag.FormTagExtensionPoint; -import org.zstack.header.vm.*; -import org.zstack.header.volume.*; -import org.zstack.kvm.KVMAgentCommands.ReconnectMeCmd; -import org.zstack.kvm.KVMAgentCommands.TransmitVmOperationToMnCmd; -import org.zstack.header.host.HostNetworkInterfaceServiceType; +import org.zstack.header.tag.SystemTagInventory; +import org.zstack.header.tag.SystemTagLifeCycleListener; +import org.zstack.header.tag.SystemTagValidator; +import org.zstack.header.vm.KvmReportVmShutdownEventMsg; +import org.zstack.header.vm.KvmReportVmShutdownFromGuestEventMsg; +import org.zstack.header.vm.RebootVmInstanceMsg; +import org.zstack.header.vm.StartVmInstanceMsg; +import org.zstack.header.vm.StopVmInstanceMsg; +import org.zstack.header.vm.VmCanonicalEvents; +import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceState; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmInstanceVO_; +import org.zstack.header.vm.devices.VmInstanceDeviceManager; +import org.zstack.header.volume.MaxDataVolumeNumberExtensionPoint; +import org.zstack.header.volume.VolumeConstant; +import org.zstack.header.volume.VolumeFormat; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.header.volume.VolumeVO; +import org.zstack.kvm.KVMAgentCommands.*; +import org.zstack.network.l3.ServiceTypeExtensionPoint; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.utils.CollectionUtils; import org.zstack.utils.IpRangeSet; import org.zstack.utils.SizeUtils; import org.zstack.utils.Utils; +import org.zstack.utils.data.SizeUnit; import org.zstack.utils.form.Form; import org.zstack.utils.function.Function; import org.zstack.utils.function.ValidateFunction; @@ -77,7 +94,14 @@ import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -87,7 +111,6 @@ import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.kvm.KVMAgentCommands.*; -import static org.zstack.core.Platform.*; import static org.zstack.kvm.KVMConstant.CPU_MODE_NONE; public class KVMHostFactory extends AbstractService implements HypervisorFactory, @@ -138,8 +161,12 @@ public class KVMHostFactory extends AbstractService implements HypervisorFactory private VmInstanceDeviceManager vidm; @Autowired private VmNicManager vmNicManager; - + @Autowired + private GlobalConfigFacade gcf; + @Autowired + KvmVmSyncPingTask pingTask; private Future checkSocketChannelTimeoutThread; + public static int skipHostPingTimeWhenKvmagentBusy = 300; @Override public HostVO createHost(HostVO vo, AddHostMessage msg) { @@ -360,7 +387,7 @@ void physicalCpuStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalCpuStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalCpuStatusAbnormalData(); cdata.setCpuName(cmd.getAdditionalProperties().get(KVMConstant.CPU_NAME).toString()); cdata.setHostUuid(cmd.getHost()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_CPU_STATUS_ABNORMAL, cdata); } @@ -368,22 +395,14 @@ void physicalMemoryStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalMemoryStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalMemoryStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); cdata.setLocator(cmd.getAdditionalProperties().get(KVMConstant.MEMORY_LOCATOR_NAME).toString()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_MEMORY_STATUS_ABNORMAL, cdata); } - void physicalGpuStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { - HostCanonicalEvents.HostPhysicalGpuStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalGpuStatusAbnormalData(); - cdata.setHostUuid(cmd.getHost()); - cdata.setPcideviceAddress(cmd.getAdditionalProperties().get(KVMConstant.PCI_DEVICE_ADDRESS).toString()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); - evf.fire(HostCanonicalEvents.HOST_PHYSICAL_GPU_STATUS_ABNORMAL, cdata); - } - void physicalPowerSupplyStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalPowerSupplyStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalPowerSupplyStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); cdata.setName(cmd.getAdditionalProperties().get(KVMConstant.DEVICE_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_POWER_SUPPLY_STATUS_ABNORMAL, cdata); } @@ -392,7 +411,7 @@ void physicalFanStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalFanStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalFanStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); cdata.setFanName(cmd.getAdditionalProperties().get(KVMConstant.DEVICE_NAME).toString()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_FAN_STATUS_ABNORMAL, cdata); } @@ -409,11 +428,35 @@ void physicalDiskStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { void physicalRaidStatusAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { HostCanonicalEvents.HostPhysicalRaidStatusAbnormalData cdata = new HostCanonicalEvents.HostPhysicalRaidStatusAbnormalData(); cdata.setHostUuid(cmd.getHost()); - cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHSICAL_DEVICE_STATUS_NAME).toString()); + cdata.setStatus(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATUS_NAME).toString()); cdata.setTargetId(cmd.getAdditionalProperties().get(KVMConstant.TARGET_ID).toString()); evf.fire(HostCanonicalEvents.HOST_PHYSICAL_RAID_STATUS_ABNORMAL, cdata); } + void physicalVolumeStateAlarmEvent(HostPhysicalDeviceStatusAlarmEventCmd cmd) { + HostCanonicalEvents.HostPhysicalVolumeStateAbnormalData cdata = new HostCanonicalEvents.HostPhysicalVolumeStateAbnormalData(); + cdata.setHostUuid(cmd.getHost()); + cdata.setState(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_STATE_NAME).toString()); + cdata.setDiskUuids(cmd.getAdditionalProperties().get(KVMConstant.PHYSICAL_DEVICE_DISK_UUIDS).toString()); + cdata.setDiskName(cmd.getAdditionalProperties().get(KVMConstant.DEVICE_NAME).toString()); + cdata.setVgName(cmd.getAdditionalProperties().get(KVMConstant.VOLUME_GROUP_NAME).toString()); + evf.fire(HostCanonicalEvents.HOST_PHYSICAL_VOLUME_STATE_ABNORMAL, cdata); + } + + private void processKvmagentPhysicalMemUsageAbnormal(HostProcessPhysicalMemoryUsageAlarmCmd cmd) { + if (cmd.getMemoryUsage() <= gcf.getConfigValue(KVMGlobalConfig.CATEGORY, + KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT.getName(), Long.class)) { + return; + } + + logger.debug("The zstack-kvmagent service has exceeded the hard limit for physical memory usage, " + + "and we will try restart it later"); + RestartKvmAgentMsg restartKvmAgentMsg = new RestartKvmAgentMsg(); + restartKvmAgentMsg.setHostUuid(cmd.getHostUuid()); + bus.makeTargetServiceIdByResourceUuid(restartKvmAgentMsg, HostConstant.SERVICE_ID, restartKvmAgentMsg.getHostUuid()); + bus.send(restartKvmAgentMsg); + } + @Override public boolean start() { deployAnsibleModule(); @@ -469,6 +512,22 @@ public void validateGlobalConfig(String category, String name, String oldValue, } }); + resourceConfig = rcf.getResourceConfig(KVMGlobalConfig.NESTED_VIRTUALIZATION.getIdentity()); + resourceConfig.installValidatorExtension((resourceUuid, oldValue, newValue) -> { + if (oldValue.equals(newValue)) { + return; + } + + VmInstanceState vmState = Q.New(VmInstanceVO.class).select(VmInstanceVO_.state) + .eq(VmInstanceVO_.uuid, resourceUuid) + .findValue(); + if (vmState != null + && vmState != VmInstanceState.Starting // some configs are set while vm is starting + && !VmInstanceState.offlineStates.contains(vmState)) { + throw new GlobalConfigException("Can not change vm.cpuMode while VM is living."); + } + }); + restf.registerSyncHttpCallHandler(KVMConstant.KVM_RECONNECT_ME, ReconnectMeCmd.class, new SyncHttpCallHandler() { @Override public String handleSyncHttpCall(ReconnectMeCmd cmd) { @@ -517,6 +576,17 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { }); restf.registerSyncHttpCallHandler(KVMConstant.KVM_REPORT_VM_SHUTDOWN_EVENT, ReportVmShutdownEventCmd.class, cmd -> { + if (cmd.vmUuid == null || !Q.New(VmInstanceVO.class) + .eq(VmInstanceVO_.uuid, cmd.vmUuid) + .isExists()) { + logger.debug(String.format("vm[uuid:%s] not found, skip report vm shutdown event", cmd.vmUuid)); + } + + if (pingTask.isVmDoNotNeedToTrace(cmd.vmUuid)) { + logger.debug(String.format("vm[uuid:%s] is not in the list of vm that need to be traced, skip report vm shutdown event", cmd.vmUuid)); + return null; + } + KvmReportVmShutdownEventMsg msg = new KvmReportVmShutdownEventMsg(); msg.setVmInstanceUuid(cmd.vmUuid); bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, cmd.vmUuid); @@ -549,13 +619,12 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { }); restf.registerSyncHttpCallHandler(KVMConstant.KVM_REPORT_HOST_STOP_EVENT, ReportHostStopEventCmd.class, cmd -> { - ChangeHostStatusMsg cmsg = new ChangeHostStatusMsg(); - HostVO hostVO = Q.New(HostVO.class).eq(HostVO_.managementIp, cmd.hostIp).find(); - - if (hostVO == null) { + if (StringUtils.isEmpty(cmd.hostUuid)) { return null; } - cmsg.setUuid(hostVO.getUuid()); + + ChangeHostStatusMsg cmsg = new ChangeHostStatusMsg(); + cmsg.setUuid(cmd.hostUuid); cmsg.setStatusEvent(HostStatusEvent.disconnected.toString()); bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, cmsg.getHostUuid()); bus.send(cmsg); @@ -592,7 +661,9 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { physicalMemoryStatusAlarmEvent(cmd); break; case GPU: - physicalGpuStatusAlarmEvent(cmd); + for (KvmHardwareStatusHandlerExtensionPoint ext : pluginRgty.getExtensionList(KvmHardwareStatusHandlerExtensionPoint.class)) { + ext.handleKvmHardwareStatus(HostHardware.GPU, cmd); + } break; case POWERSUPPLY: physicalPowerSupplyStatusAlarmEvent(cmd); @@ -606,6 +677,9 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { case RAID: physicalRaidStatusAlarmEvent(cmd); break; + case PHYSICAL_VOLUME: + physicalVolumeStateAlarmEvent(cmd); + break; default: logger.debug(String.format("unknown physical device type[%s] in host[uuid:%s]", cmd.getType(), cmd.getHost())); @@ -614,7 +688,44 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { return null; }); - restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_DISK_INSERT_ALARM_EVENT, HostPhysicalDiskInsertAlarmEventCmd.class, cmd -> { + + restf.registerSyncHttpCallHandler(KVMConstant.HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ALARM_PATH, HostProcessPhysicalMemoryUsageAlarmCmd.class, cmd -> { + HostCanonicalEvents.HostProcessPhysicalMemoryUsageAlarmData data = new HostCanonicalEvents.HostProcessPhysicalMemoryUsageAlarmData(); + data.setHostUuid(cmd.getHostUuid()); + data.setPid(cmd.getPid()); + data.setMemoryUsage(String.format("%s MB", cmd.getMemoryUsage() / 1048576)); + data.setProcessName(cmd.getProcessName()); + evf.fire(HostCanonicalEvents.HOST_PROCESS_PHYSICAL_MEMORY_USAGE_ABNORMAL, data); + + switch (data.getProcessName()) { + case "zstack-kvmagent": + processKvmagentPhysicalMemUsageAbnormal(cmd); + break; + default: + logger.debug(String.format("unknown process name[%s] in host[uuid:%s]", cmd.getProcessName(), cmd.getHostUuid())); + } + + return null; + }); + + restf.registerSyncHttpCallHandler(KVMConstant.HOST_KVMAGENT_STATUS_PATH, HostKvmagentStatusCmd.class, cmd -> { + if ("busy".equals(cmd.getStatus())) { + HostCanonicalEvents.HostPingSkipData data = new HostCanonicalEvents.HostPingSkipData(); + data.setHostUuid(cmd.getHostUuid()); + // this will skip host ping sometime if kvmagent busy + data.setSkipTimeInSec(skipHostPingTimeWhenKvmagentBusy * (int)(cmd.getMemoryUsage() / SizeUnit.GIGABYTE.toByte(4) + 1)); + evf.fire(HostCanonicalEvents.HOST_PING_SKIP, data); + } else if ("available".equals(cmd.getStatus())) { + HostCanonicalEvents.HostPingSkipData data = new HostCanonicalEvents.HostPingSkipData(); + data.setHostUuid(cmd.getHostUuid()); + evf.fire(HostCanonicalEvents.HOST_PING_CANCEL_SKIP, data); + } else { + logger.debug("unknown kvmagent status: " + cmd.getStatus()); + } + return null; + }); + + restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_DISK_INSERT_ALARM_EVENT, HostPhysicalDiskInsertAlarmEventCmd.class, cmd -> { HostCanonicalEvents.HostPhysicalDiskData cdata = new HostCanonicalEvents.HostPhysicalDiskData(); cdata.setHostUuid(cmd.host); cdata.setSerialNumber(cmd.additionalProperties.get(KVMConstant.DEVICE_SERIAL_NUMBER).toString()); @@ -642,14 +753,6 @@ public String handleSyncHttpCall(TransmitVmOperationToMnCmd cmd) { return null; }); - restf.registerSyncHttpCallHandler(KVMConstant.HOST_PHYSICAL_GPU_REMOVE_ALARM_EVENT, PhysicalGpuRemoveAlarmEventCmd.class, cmd -> { - HostCanonicalEvents.HostPhysicalGpuRemoveTriggeredData cdata = new HostCanonicalEvents.HostPhysicalGpuRemoveTriggeredData(); - cdata.setHostUuid(cmd.host); - cdata.setPcideviceAddress(cmd.pcideviceAddress); - evf.fire(HostCanonicalEvents.HOST_PHYSICAL_GPU_REMOVE_TRIGGERED, cdata); - return null; - }); - KVMSystemTags.CHECK_CLUSTER_CPU_MODEL.installValidator(((resourceUuid, resourceType, systemTag) -> { String check = KVMSystemTags.CHECK_CLUSTER_CPU_MODEL.getTokenByTag(systemTag, KVMSystemTags.CHECK_CLUSTER_CPU_MODEL_TOKEN); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java index ae8b84267dd..cf6d16e7560 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostUtils.java @@ -33,17 +33,26 @@ public class KVMHostUtils { * @return normalized bridge name, or null if anything wrong */ public static String getNormalizedBridgeName(String l2Uuid, String format) { - if (KVMSystemTags.L2_BRIDGE_NAME.hasTag(l2Uuid, L2NetworkVO.class)) { - return KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Uuid, KVMSystemTags.L2_BRIDGE_NAME_TOKEN); + String current = KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Uuid, KVMSystemTags.L2_BRIDGE_NAME_TOKEN); + if (current != null) { + return current; } validateFormatString(format); - String newBridgeName = generateNewBridgeName(l2Uuid); String physicalInterface = getPhysicalInterface(l2Uuid, format); + String preferredBridgeName = String.format(format, physicalInterface); - return checkNameConflict(l2Uuid, String.format(format, physicalInterface)) ? - newBridgeName : String.format(format, physicalInterface); + if (!checkNameConflict(l2Uuid, preferredBridgeName)) { + return preferredBridgeName; + } + + current = KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Uuid, KVMSystemTags.L2_BRIDGE_NAME_TOKEN); + if (current != null) { + return current; + } + + return generateNewBridgeName(l2Uuid); } private static void validateFormatString(String format) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java index 5c4ee9c1693..9ec57078f6e 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2NoVlanNetworkBackend.java @@ -23,6 +23,7 @@ import org.zstack.kvm.KVMAgentCommands.DeleteBridgeCmd; import org.zstack.kvm.KVMAgentCommands.DeleteBridgeResponse; import org.zstack.kvm.KVMAgentCommands.NicTO; +import org.zstack.network.l2.L2NetworkGlobalConfig; import org.zstack.network.l3.NetworkGlobalProperty; import org.zstack.network.service.MtuGetter; import org.zstack.tag.SystemTagCreator; @@ -56,6 +57,8 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b cmd.setDisableIptables(NetworkGlobalProperty.BRIDGE_DISABLE_IPTABLES); cmd.setMtu(new MtuGetter().getL2Mtu(l2Network)); cmd.setIsolated(l2Network.getIsolated()); + cmd.setIgmpVersion(L2NetworkGlobalConfig.IGMPVersion.value(Integer.class)); + cmd.setMldVersion(L2NetworkGlobalConfig.MLDVersion.value(Integer.class)); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setCommand(cmd); @@ -232,6 +235,9 @@ public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInven to.setBridgeName(makeBridgeName(l2Network.getUuid())); to.setPhysicalInterface(l2Network.getPhysicalInterface()); to.setMtu(new MtuGetter().getMtu(l3Network.getUuid())); + if (l2Network.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)) { + to.setSrcPath(L2NetworkConstant.OVN_DPDK_VNIC_SRC_PATH + nic.getInternalName()); + } return to; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java index cc9e8332237..15c0214c538 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMRealizeL2VlanNetworkBackend.java @@ -248,6 +248,9 @@ public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInven to.setMetaData(String.valueOf(vlanId)); to.setMtu(new MtuGetter().getMtu(l3Network.getUuid())); to.setVlanId(String.valueOf(vlanId)); + if (l2Network.getvSwitchType().equals(L2NetworkConstant.VSWITCH_TYPE_OVN_DPDK)) { + to.setSrcPath(L2NetworkConstant.OVN_DPDK_VNIC_SRC_PATH + nic.getInternalName()); + } return to; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java index 2edc3a92f80..410c23dbc7b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSecurityGroupBackend.java @@ -6,9 +6,6 @@ import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.core.Completion; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.host.*; import org.zstack.header.message.MessageReply; @@ -26,8 +23,6 @@ import static java.util.Arrays.asList; import static org.zstack.core.Platform.operr; -import java.util.Map; - public class KVMSecurityGroupBackend implements SecurityGroupHypervisorBackend, HostAfterConnectedExtensionPoint { private static CLogger logger = Utils.getLogger(KVMSecurityGroupBackend.class); @@ -129,7 +124,7 @@ public void applyRules(final HostRuleTO hto, final Completion complete) { @Override public void checkDefaultRules(String hostUuid, Completion completion) { CheckDefaultSecurityGroupCmd cmd = new CheckDefaultSecurityGroupCmd(); - cmd.skipIpv6 = NetworkGlobalProperty.SKIP_IPV6; + cmd.disableIp6Tables = NetworkGlobalProperty.SKIP_IPV6 || NetworkGlobalProperty.BRIDGE_DISABLE_IP6TABLES; KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(hostUuid); @@ -193,7 +188,7 @@ public void run(MessageReply reply) { @Override public void cleanUpUnusedRuleOnHost(String hostUuid, final Completion completion) { KVMAgentCommands.CleanupUnusedRulesOnHostCmd cmd = new KVMAgentCommands.CleanupUnusedRulesOnHostCmd(); - cmd.skipIpv6 = NetworkGlobalProperty.SKIP_IPV6; + cmd.disableIp6Tables = NetworkGlobalProperty.SKIP_IPV6 || NetworkGlobalProperty.BRIDGE_DISABLE_IP6TABLES; KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(hostUuid); msg.setCommand(cmd); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java index df7190362a8..d1dc3a495e8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java @@ -21,6 +21,11 @@ public class KVMSystemTags { public static final String LIBVIRT_VERSION_TOKEN = "version"; public static PatternedSystemTag LIBVIRT_VERSION = new PatternedSystemTag(String.format("libvirt::version::{%s}", LIBVIRT_VERSION_TOKEN), HostVO.class); + public static final String LIBVIRT_PACKAGE_VERSION_TOKEN = "version"; + public static PatternedSystemTag LIBVIRT_PACKAGE_VERSION = new PatternedSystemTag(String.format("libvirt::package::version::{%s}", LIBVIRT_PACKAGE_VERSION_TOKEN), HostVO.class); + + public static SystemTag FORCE_DEPLOYMENT_ONCE = new SystemTag("force::deployment::once", HostVO.class); + public static final String HVM_CPU_FLAG_TOKEN = "flag"; public static PatternedSystemTag HVM_CPU_FLAG = new PatternedSystemTag(String.format("hvm::{%s}", HVM_CPU_FLAG_TOKEN), HostVO.class); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java new file mode 100644 index 00000000000..ced5d78edb5 --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHardwareStatusHandlerExtensionPoint.java @@ -0,0 +1,7 @@ +package org.zstack.kvm; + +import org.zstack.header.host.HostHardware; + +public interface KvmHardwareStatusHandlerExtensionPoint { + void handleKvmHardwareStatus(HostHardware hostHardwareType, KVMAgentCommands.HostPhysicalDeviceStatusAlarmEventCmd cmd); +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java index 6184933f5e2..79709692a12 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmHostConfigChecker.java @@ -1,13 +1,17 @@ package org.zstack.kvm; +import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.ansible.AnsibleChecker; +import org.zstack.utils.RangeSet; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.ssh.Ssh; import org.zstack.utils.ssh.SshResult; +import java.util.Objects; + @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class KvmHostConfigChecker implements AnsibleChecker { private static final CLogger logger = Utils.getLogger(KvmHostConfigChecker.class); @@ -17,10 +21,15 @@ public class KvmHostConfigChecker implements AnsibleChecker { private String privateKey; private String targetIp; private String requireKsmCheck; + private String requireReservePorts; private int sshPort = 22; @Override public boolean needDeploy() { + return needDeployKsmCheck() || needDeployReservePorts(); + } + + private boolean needDeployKsmCheck() { if ("none".equals(requireKsmCheck)) { return false; } @@ -61,6 +70,45 @@ public boolean needDeploy() { return true; } + private boolean needDeployReservePorts() { + if (Strings.isEmpty(requireReservePorts)) { + return false; + } + + Ssh ssh = new Ssh(); + ssh.setUsername(username).setPrivateKey(privateKey) + .setPassword(password).setPort(sshPort) + .setHostname(targetIp); + try { + ssh.sudoCommand("cat /proc/sys/net/ipv4/ip_local_reserved_ports"); + SshResult ret = ssh.setTimeout(60).runAndClose(); + if (ret.getReturnCode() != 0) { + logger.warn(String.format("exec ssh command failed, return code: %d, stdout: %s, stderr: %s", + ret.getReturnCode(), ret.getStdout(), ret.getStderr())); + return true; + } + String reservedPorts = ret.getStdout(); + RangeSet cur = RangeSet.valueOf(reservedPorts.trim()); + RangeSet expect = RangeSet.valueOf(requireReservePorts.trim()); + + for (RangeSet.Range range : cur.getRanges()) { + expect.closed(range.getStart(), range.getEnd()); + } + + cur.mergeAndSort(); + expect.mergeAndSort(); + + if (!Objects.equals(cur.getRanges(), expect.getRanges())) { + logger.debug(String.format("Reserved ports are not the same, need to deploy, current: %s, expect: %s", + cur.getRanges(), expect.getRanges())); + return true; + } + return false; + } finally { + ssh.close(); + } + } + @Override public void deleteDestFile() { @@ -106,6 +154,14 @@ public void setRequireKsmCheck(String requireKsmCheck) { this.requireKsmCheck = requireKsmCheck; } + public String getRequireReservePorts() { + return requireReservePorts; + } + + public void setRequireReservePorts(String requireReservePorts) { + this.requireReservePorts = requireReservePorts; + } + public int getSshPort() { return sshPort; } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java index 487c0664af8..af1a8718800 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KvmVmSyncPingTask.java @@ -457,4 +457,8 @@ public void iJoin(ManagementNodeInventory inv) { vmApis.putIfAbsent(inv.getUuid(), new ConcurrentHashMap<>()); vmsToSkip.putIfAbsent(inv.getUuid(), ConcurrentHashMap.newKeySet()); } + + public boolean isVmDoNotNeedToTrace(String vmUuid) { + return vmsToSkip.values().stream().anyMatch(vmsToSkipSet -> vmsToSkipSet.contains(vmUuid)); + } } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java new file mode 100644 index 00000000000..008b653af7f --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentMsg.java @@ -0,0 +1,26 @@ +package org.zstack.kvm; + +import org.zstack.header.host.HostMessage; +import org.zstack.header.message.NeedReplyMessage; + +public class RestartKvmAgentMsg extends NeedReplyMessage implements HostMessage { + String hostUuid; + boolean force; + + public boolean isForce() { + return force; + } + + public void setForce(boolean force) { + this.force = force; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + @Override + public String getHostUuid() { + return hostUuid; + } +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java new file mode 100644 index 00000000000..e26f22981e0 --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/RestartKvmAgentReply.java @@ -0,0 +1,6 @@ +package org.zstack.kvm; + +import org.zstack.header.message.MessageReply; + +public class RestartKvmAgentReply extends MessageReply { +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java b/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java index 72502cc750a..25e099a2940 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/VmCpuVendorKvmStartVmExtension.java @@ -11,13 +11,7 @@ import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.vm.CreateVmInstanceMsg; -import org.zstack.header.vm.VmInstanceCreateExtensionPoint; import org.zstack.header.vm.VmInstanceSpec; -import org.zstack.header.vm.VmInstanceVO; -import org.zstack.kvm.KVMAgentCommands; -import org.zstack.kvm.KVMHostInventory; -import org.zstack.kvm.KVMStartVmExtensionPoint; import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.resourceconfig.ResourceConfigVO; @@ -25,7 +19,6 @@ import java.util.ArrayList; import java.util.List; -import static org.zstack.compute.vm.VmCpuVendor.AuthenticAMD; import static org.zstack.kvm.KVMConstant.CPU_MODE_HOST_PASSTHROUGH; import static org.zstack.kvm.KVMConstant.CPU_MODE_HYGON_CUSTOMIZED; @@ -49,12 +42,11 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg } ResourceConfig rc = rcf.getResourceConfig(VmGlobalConfig.VM_CPUID_VENDOR.getIdentity()); - String vmCpuIdVendor = rc.getResourceConfigValueByResourceType(spec.getVmInventory().getUuid(), VmInstanceVO.class.getSimpleName(), String.class); - if (vmCpuIdVendor == null) { - rc.updateValue(spec.getVmInventory().getUuid(), AuthenticAMD.toString()); - } + String vmCpuIdVendor = rc.getResourceConfigValue(spec.getVmInventory().getUuid(), String.class); - cmd.setVmCpuVendorId(rcf.getResourceConfigValue(VmGlobalConfig.VM_CPUID_VENDOR, spec.getVmInventory().getUuid(), String.class)); + if (vmCpuIdVendor != null) { + cmd.setVmCpuVendorId(vmCpuIdVendor); + } } @Override diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java index d39fb35e922..4c0b3613024 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoHelper.java @@ -1,5 +1,7 @@ package org.zstack.kvm.hypervisor; +import org.zstack.core.Platform; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.host.HostVO_; import org.zstack.header.host.HostOperationSystem; @@ -42,6 +44,7 @@ public static Map collectExpectedHypervisorInfoForHost final Map, HostOsCategoryVO> caches = new HashMap<>(); final Map results = new HashMap<>(); + DatabaseFacade dbf = Platform.getComponentLoader().getComponent(DatabaseFacade.class); for (String hostUuid : hostUuidList) { String architecture = hostArchMap.get(hostUuid); if (architecture == null) { @@ -59,10 +62,22 @@ public static Map collectExpectedHypervisorInfoForHost continue; } - vo = Q.New(HostOsCategoryVO.class) - .eq(HostOsCategoryVO_.architecture, architecture) - .eq(HostOsCategoryVO_.osReleaseVersion, osReleaseVersion) - .find(); + String sql = " select h from HostOsCategoryVO h, KvmHostHypervisorMetadataVO k where k.categoryUuid = h.uuid " + + "and k.managementNodeUuid = :mnId " + + "and h.architecture = :arch " + + "and h.osReleaseVersion = :os " + + "order by k.createDate desc"; + + List resultList = dbf.getEntityManager().createQuery(sql, HostOsCategoryVO.class) + .setParameter("arch", architecture) + .setParameter("os", osReleaseVersion) + .setParameter("mnId", Platform.getManagementServerId()) + .setMaxResults(1) + .getResultList(); + if (!resultList.isEmpty()) { + vo = resultList.get(0); + } + caches.put(key, vo); results.put(hostUuid, vo); } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java index 7aaa560775d..228b314fa0a 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsg.java @@ -6,7 +6,7 @@ import org.zstack.header.rest.RestRequest; @RestRequest( - path = "/vm-instances/xml-hook-script", + path = "/vm-instances/xml-hook-script/{uuid}", method = HttpMethod.DELETE, responseClass = APIExpungeVmUserDefinedXmlHookScriptEvent.class ) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy index eff27495dff..2a1df417940 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy +++ b/plugin/kvm/src/main/java/org/zstack/kvm/xmlhook/APIExpungeVmUserDefinedXmlHookScriptMsgDoc_zh_cn.groovy @@ -11,7 +11,7 @@ doc { rest { request { - url "DELETE /v1/vm-instances/xml-hook-script" + url "DELETE /v1/vm-instances/xml-hook-script/{uuid}" header (Authorization: 'OAuth the-session-uuid') @@ -25,7 +25,7 @@ doc { name "uuid" enclosedIn "" desc "资源的UUID,唯一标示该资源" - location "body" + location "url" type "String" optional false since "5.2.0" diff --git a/plugin/ldap/pom.xml b/plugin/ldap/pom.xml index e5197ffb530..ccfa2ca138d 100755 --- a/plugin/ldap/pom.xml +++ b/plugin/ldap/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 @@ -77,7 +77,7 @@ org.springframework.security spring-security-ldap - 5.7.11 + 5.7.13 org.zstack diff --git a/plugin/loadBalancer/pom.xml b/plugin/loadBalancer/pom.xml index 82337a50f16..65f09eeb277 100755 --- a/plugin/loadBalancer/pom.xml +++ b/plugin/loadBalancer/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java index 0376e91e610..8228f15ae1a 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsg.java @@ -62,7 +62,7 @@ public class APIChangeLoadBalancerListenerMsg extends APIMessage implements Load @APIParam(numberRange = {LoadBalancerConstants.NUMBER_OF_PROCESS_MIN, LoadBalancerConstants.NUMBER_OF_PROCESS_MAX}, required = false) private Integer nbprocess; - @APIParam(validValues = {"http-keep-alive", "http-server-close", "http-tunnel", "httpclose", "forceclose"}, required = false) + @APIParam(validValues = {"http-keep-alive", "http-server-close", "httpclose"}, required = false) private String httpMode; @APIParam(validValues = {"disable", "iphash", "insert", "rewrite"}, required = false) diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy index bc3830b713a..bbe5abcf884 100644 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerListenerMsgDoc_zh_cn.groovy @@ -169,7 +169,7 @@ doc { type "String" optional true since "4.1" - values ("http-keep-alive","http-server-close","http-tunnel","httpclose","forceclose") + values ("http-keep-alive","http-server-close","httpclose") } column { name "sessionPersistence" diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java index dda0b0dc910..ea1168da036 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerApiInterceptor.java @@ -675,12 +675,22 @@ private Boolean verifyHttpCode(String httpCode) { } private void validate(APICreateLoadBalancerListenerMsg msg) { + LoadBalancerVO lbVO = dbf.findByUuid(msg.getLoadBalancerUuid(), LoadBalancerVO.class); + if (msg.getInstancePort() == null) { msg.setInstancePort(msg.getLoadBalancerPort()); } if (msg.getProtocol() == null) { msg.setProtocol(LoadBalancerConstants.LB_PROTOCOL_TCP); } + + if (msg.getProtocol().equals(LB_PROTOCOL_UDP)) { + if (!StringUtils.isEmpty(lbVO.getVipUuid()) && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { + throw new ApiMessageInterceptionException( + operr("can not create listener because udp listener can not have both ipv4 and ipv6 vip", + msg.getProtocol(), msg.getHealthCheckProtocol())); + } + } if (msg.getHealthCheckProtocol() == null) { if (LoadBalancerConstants.LB_PROTOCOL_UDP.equals(msg.getProtocol())) { msg.setHealthCheckProtocol(LoadBalancerConstants.HEALTH_CHECK_TARGET_PROTOCL_UDP); @@ -990,11 +1000,6 @@ private void validate(APICreateLoadBalancerListenerMsg msg) { throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence cookieName without assigning insert mode", msg.getLoadBalancerUuid(), msg.getName())); } - /*can not assign session persistence rewrite with http-keep-alive*/ - if (LoadBalancerConstants.HTTP_MODE_HTTP_TUNNEL.equals(httpMode) && LoadBalancerSessionPersistence.rewrite.toString().equals(enableSession)) { - throw new ApiMessageInterceptionException(argerr("loadBalancer[%s] listener[%s] doesn't support assigning session persistence rewrite when the http mode is http-tunnel", msg.getLoadBalancerUuid(), msg.getName())); - } - } if (LoadBalancerConstants.BALANCE_ALGORITHM_LEAST_SOURCE.equals(algorithm)) { for (String tag : msg.getSystemTags()) { @@ -1235,9 +1240,6 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { if (httpRedirectHttps && (msg.getSessionPersistence() != null && !LoadBalancerSessionPersistence.disable.toString().equals(msg.getSessionPersistence()))) { throw new ApiMessageInterceptionException(argerr("could not support both HTTP redirect HTTPS and session persistence at the same time")); } - if (LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && LoadBalancerConstants.HTTP_MODE_HTTP_TUNNEL.equals(msg.getHttpMode())) { - throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying session persistence rewrite when the http mode is http-tunnel", msg.getUuid())); - } if (LoadBalancerSessionPersistence.rewrite.toString().equals(msg.getSessionPersistence()) && msg.getHttpMode() == null) { Boolean httpModeTunnel = Q.New(SystemTagVO.class).eq(SystemTagVO_.resourceType, LoadBalancerListenerVO.class.getSimpleName()) .eq(SystemTagVO_.tag, "httpMode::http-tunnel") @@ -1246,14 +1248,6 @@ private void validate(APIChangeLoadBalancerListenerMsg msg) { throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying session persistence rewrite when the http mode is http-tunnel", msg.getUuid())); } } - if (LoadBalancerConstants.HTTP_MODE_HTTP_TUNNEL.equals(msg.getHttpMode()) && msg.getSessionPersistence() == null) { - Boolean cookieRewrite = Q.New(SystemTagVO.class).eq(SystemTagVO_.resourceType, LoadBalancerListenerVO.class.getSimpleName()) - .eq(SystemTagVO_.tag, "sessionPersistence::rewrite") - .eq(SystemTagVO_.resourceUuid, listener.getUuid()).isExists(); - if (cookieRewrite) { - throw new ApiMessageInterceptionException(argerr("listener[%s] can not modifying httpMode http-tunnel when the session persistence is rewrite", msg.getUuid())); - } - } } /*can not assign session persistence iphash without source algorithm*/ @@ -1725,6 +1719,37 @@ private void validate(APIAddServerGroupToLoadBalancerListenerMsg msg){ .eq(LoadBalancerServerGroupVO_.uuid,msg.getServerGroupUuid()) .findValue(); msg.setLoadBalancerUuid(loadBalancerUuid); + + /* until 5.3.0, udp lb only has 2 use case: ipv4 vip --> ipv4 backend + + * ipv6 vip --> ipv6 backend */ + LoadBalancerListenerVO listenerVO = dbf.findByUuid(msg.getlistenerUuid(), + LoadBalancerListenerVO.class); + LoadBalancerVO lbVO = dbf.findByUuid(loadBalancerUuid, LoadBalancerVO.class); + LoadBalancerServerGroupVO groupVO = dbf.findByUuid(msg.getServerGroupUuid(), LoadBalancerServerGroupVO.class); + if (listenerVO.getProtocol().equals(LB_PROTOCOL_UDP)) { + if (!StringUtils.isEmpty(lbVO.getVipUuid()) && + !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { + throw new ApiMessageInterceptionException(operr( + "could not add server group[uuid:%s} to listener [uuid:%s], " + + "because udp listener can not has both ipv4 and ipv6 vip", + msg.getServerGroupUuid(),msg.getlistenerUuid())); + } + + if (groupVO.getIpVersion() == IPv6Constants.IPv4 && !StringUtils.isEmpty(lbVO.getIpv6VipUuid())) { + throw new ApiMessageInterceptionException(operr( + "could not add server group[uuid:%s} to listener [uuid:%s], " + + "because udp listener can not map ipv6 to ipv4 backend", + msg.getServerGroupUuid(),msg.getlistenerUuid())); + } + + if (groupVO.getIpVersion() == IPv6Constants.IPv6 && !StringUtils.isEmpty(lbVO.getVipUuid())) { + throw new ApiMessageInterceptionException(operr( + "could not add server group[uuid:%s} to listener [uuid:%s], " + + "because udp listener can not map ipv4 to ipv6 backend", + msg.getServerGroupUuid(),msg.getlistenerUuid())); + } + } + } private void validate(APIRemoveServerGroupFromLoadBalancerListenerMsg msg){ diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java index d65c781702d..d8b43fa7464 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerBase.java @@ -2360,6 +2360,8 @@ public void run(SyncTaskChain chain) { } } + final String oldAclStatus = LoadBalancerSystemTags.BALANCER_ACL.getTokenByResourceUuid( + msg.getUuid(), LoadBalancerSystemTags.BALANCER_ACL_TOKEN); if (msg.getAclStatus() != null) { if (LoadBalancerSystemTags.BALANCER_ACL.hasTag(msg.getUuid())) { LoadBalancerSystemTags.BALANCER_ACL.update(msg.getUuid(), @@ -2387,15 +2389,26 @@ public void run(SyncTaskChain chain) { boolean refresh = isListenerNeedRefresh(lblVo, null); if (refresh) { - RefreshLoadBalancerMsg msg = new RefreshLoadBalancerMsg(); - msg.setUuid(lblVo.getLoadBalancerUuid()); - bus.makeLocalServiceId(msg, LoadBalancerConstants.SERVICE_ID); - bus.send(msg, new CloudBusCallBack(chain) { + RefreshLoadBalancerMsg rmsg = new RefreshLoadBalancerMsg(); + rmsg.setUuid(lblVo.getLoadBalancerUuid()); + bus.makeLocalServiceId(rmsg, LoadBalancerConstants.SERVICE_ID); + bus.send(rmsg, new CloudBusCallBack(chain) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { logger.warn(String.format( "update listener [uuid:%s] failed", lblVo.getUuid())); evt.setError(reply.getError()); + if (msg.getAclStatus() != null) { + logger.warn(String.format( "rollback acl status for listener [uuid:%s]", msg.getUuid())); + if (oldAclStatus != null) { + LoadBalancerSystemTags.BALANCER_ACL.update(msg.getUuid(), + LoadBalancerSystemTags.BALANCER_ACL.instantiateTag(map( + e(LoadBalancerSystemTags.BALANCER_ACL_TOKEN, oldAclStatus) + ))); + } else { + LoadBalancerSystemTags.BALANCER_ACL.delete(msg.getUuid()); + } + } } else { evt.setInventory(LoadBalancerListenerInventory.valueOf(lblVo)); } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java index 765c9d07dd1..74acb10f15d 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerCascadeExtension.java @@ -75,31 +75,50 @@ private void handleDeletion(CascadeAction action, final Completion completion) { completion.success(); return; } - - LoadBalancerListenerVO listenerVO = Q.New(LoadBalancerListenerVO.class).eq(LoadBalancerListenerVO_.uuid, refVOS.get(0).getListenerUuid()).find(); - if (listenerVO.getLoadBalancerUuid() == null) { + List refList = refVOS.stream().map(LoadBalancerListenerACLRefVO::getListenerUuid).collect(Collectors.toList()); + List listenerVOList = Q.New(LoadBalancerListenerVO.class).in(LoadBalancerListenerVO_.uuid, refList).list(); + if (listenerVOList.isEmpty()) { completion.success(); return; } + List msgs = new ArrayList<>(); + listenerVOList.forEach(listenerVO -> { + if (listenerVO.getLoadBalancerUuid() == null) { + return; + } + RemoveAccessControlListFromLoadBalancerMsg msg = new RemoveAccessControlListFromLoadBalancerMsg(); + msg.setLoadBalancerUuid(listenerVO.getLoadBalancerUuid()); + msg.setAclUuids(Collections.singletonList(acl.getUuid())); + msg.setServerGroupUuids(refVOS.stream().filter(ref -> ref.getServerGroupUuid() != null).map(LoadBalancerListenerACLRefVO::getServerGroupUuid).collect(Collectors.toList())); + msg.setListenerUuid(listenerVO.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, LoadBalancerConstants.SERVICE_ID, listenerVO.getLoadBalancerUuid()); + msgs.add(msg); + }); - RemoveAccessControlListFromLoadBalancerMsg msg = new RemoveAccessControlListFromLoadBalancerMsg(); - msg.setLoadBalancerUuid(listenerVO.getLoadBalancerUuid()); - msg.setAclUuids(Collections.singletonList(acl.getUuid())); - msg.setServerGroupUuids(refVOS.stream().filter(ref -> ref.getServerGroupUuid() != null).map(LoadBalancerListenerACLRefVO::getServerGroupUuid).collect(Collectors.toList())); - msg.setListenerUuid(listenerVO.getUuid()); - bus.makeTargetServiceIdByResourceUuid(msg, LoadBalancerConstants.SERVICE_ID, listenerVO.getLoadBalancerUuid()); - - bus.send(msg, new CloudBusCallBack(msg) { + List errors = new ArrayList<>(); + new While<>(msgs).each((msg, coml) -> { + bus.send(msg, new CloudBusCallBack(coml) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("Failed to delete ACL[uuids:%s] from listener[uuid:%s] of load balancer[uuid:%s], error: %s", + msg.getAclUuids(), msg.getListenerUuid(), msg.getLoadBalancerUuid(), reply.getError())); + errors.add(reply.getError()); + } + coml.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; + public void done(ErrorCodeList errorCodeList) { + if (!errors.isEmpty()) { + errorCodeList.getCauses().addAll(errors); + completion.fail(errorCodeList); + } else { + completion.success(); } - completion.success(); } }); - return; } diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java index 775dc21b9c8..fe147c11cf4 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerConstants.java @@ -32,8 +32,10 @@ public class LoadBalancerConstants { public static final String HTTP_MODE_HTTP_KEEP_ALIVE = "http-keep-alive"; public static final String HTTP_MODE_HTTP_SERVER_CLOSE = "http-server-close"; + @Deprecated public static final String HTTP_MODE_HTTP_TUNNEL = "http-tunnel"; public static final String HTTP_MODE_HTTPCLOSE = "httpclose"; + @Deprecated public static final String HTTP_MODE_FORCECLOSE = "forceclose"; public static enum HealthCheckMothod { @@ -132,9 +134,7 @@ public String toString() { HTTP_MODES.add(HTTP_MODE_HTTP_KEEP_ALIVE); HTTP_MODES.add(HTTP_MODE_HTTP_SERVER_CLOSE); - HTTP_MODES.add(HTTP_MODE_HTTP_TUNNEL); HTTP_MODES.add(HTTP_MODE_HTTPCLOSE); - HTTP_MODES.add(HTTP_MODE_FORCECLOSE); } public static enum Param { diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java index 4f246812763..e20e57ce05a 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerExtension.java @@ -77,11 +77,7 @@ public String call(VmNicInventory arg) { } private boolean isLbShouldBeAttachedToBackend(String vmUuid, String l3Uuid) { - boolean ipChanged = new StaticIpOperator().isIpChange(vmUuid, l3Uuid); - - L3NetworkVO l3Vo = dbf.findByUuid(l3Uuid, L3NetworkVO.class); - boolean l3Need = l3Mgr.applyNetworkServiceWhenVmStateChange(l3Vo.getType()); - return ipChanged || l3Need; + return !new StaticIpOperator().isIpChange(vmUuid, l3Uuid); } @Override @@ -105,7 +101,7 @@ public void applyNetworkService(final VmInstanceSpec servedVm, Map arg) { })); } + if (msgs.isEmpty()) { + completion.done(); + return; + } + bus.send(msgs, new CloudBusListCallBack(completion) { @Override public void run(List replies) { diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java index 7ae3f9aa15d..a250c07afcd 100755 --- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java +++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/LoadBalancerManagerImpl.java @@ -489,9 +489,7 @@ private void installConfigValidateExtension(){ public void validateGlobalConfig(String category, String name, String oldValue, String value) throws GlobalConfigException { List httpModes = new ArrayList<>(Arrays.asList("http-keep-alive", "http-server-close", - "http-tunnel", - "httpclose", - "forceclose")); + "httpclose")); if (!httpModes.contains(value)) { throw new GlobalConfigException(String.format("%s must be in %s", LoadBalancerGlobalConfig.HTTP_MODE.getName(),String.join(", ",httpModes))); diff --git a/plugin/localstorage/pom.xml b/plugin/localstorage/pom.xml index 3efba793dc1..2fa49de85a0 100755 --- a/plugin/localstorage/pom.xml +++ b/plugin/localstorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java index 9a6464bac28..5e4697ac8f5 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java @@ -43,7 +43,9 @@ import org.zstack.storage.primary.*; import org.zstack.storage.primary.local.APIGetLocalStorageHostDiskCapacityReply.HostDiskCapacity; import org.zstack.storage.primary.local.MigrateBitsStruct.ResourceInfo; +import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; +import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.CollectionDSL; @@ -847,8 +849,10 @@ public void handleLocalMessage(Message msg) { handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); } else if (msg instanceof GetPrimaryStorageUsageReportMsg) { handle((GetPrimaryStorageUsageReportMsg) msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnPrimaryStorageMsg) { + handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) { + handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -908,10 +912,9 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { - APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.setForce(msg.isForce()); - imageCacheCleaner.cleanup(msg.getUuid(), false); - bus.publish(evt); + APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); + bus.publish(evt); } @@ -951,6 +954,11 @@ public void fail(ErrorCode errorCode) { } private void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { + String hostUuid; + if (msg.getHostUuid() == null) { + hostUuid = getHostUuidByResourceUuid(msg.getVolumeUuid()); + msg.setHostUuid(hostUuid); + } LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(msg.getHostUuid()); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); bkd.handle(msg, new ReturnValueCompletion(msg) { @@ -1448,7 +1456,7 @@ protected void handle(final DeleteSnapshotOnPrimaryStorageMsg msg) { FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("delete-snapshot-%s-on-local-storage-%s", msg.getSnapshot().getUuid(), self.getUuid())); chain.then(new ShareFlow() { - DeleteSnapshotOnPrimaryStorageReply reply; + DeleteSnapshotOnPrimaryStorageReply reply = new DeleteSnapshotOnPrimaryStorageReply(); @Override public void setup() { @@ -1459,10 +1467,9 @@ public void setup() { public void run(final FlowTrigger trigger, Map data) { LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); - bkd.handle(msg, hostUuid, new ReturnValueCompletion(trigger) { + bkd.deleteBits(msg.getSnapshot().getPrimaryStorageInstallPath(), hostUuid, new Completion(trigger) { @Override - public void success(DeleteSnapshotOnPrimaryStorageReply returnValue) { - reply = returnValue; + public void success() { trigger.next(); } @@ -1545,20 +1552,40 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { + private void handle(final CommitVolumeSnapshotOnPrimaryStorageMsg msg) { + final String hostUuid = getHostUuidByResourceUuid(msg.getVolume().getUuid()); + + LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid); + LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); + bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) { + @Override + public void success(CommitVolumeSnapshotOnPrimaryStorageReply returnValue) { + bus.reply(msg, returnValue); + } + + @Override + public void fail(ErrorCode errorCode) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(final PullVolumeSnapshotOnPrimaryStorageMsg msg) { final String hostUuid = getHostUuidByResourceUuid(msg.getVolume().getUuid()); LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); - bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) { + bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) { @Override - public void success(UndoSnapshotCreationOnPrimaryStorageReply returnValue) { + public void success(PullVolumeSnapshotOnPrimaryStorageReply returnValue) { bus.reply(msg, returnValue); } @Override public void fail(ErrorCode errorCode) { - UndoSnapshotCreationOnPrimaryStorageReply reply = new UndoSnapshotCreationOnPrimaryStorageReply(); + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); reply.setError(errorCode); bus.reply(msg, reply); } @@ -2645,6 +2672,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { String volumeType = msg.getVolume().getType(); if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); } else if (VolumeType.Memory.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); } else { @@ -2984,15 +3012,17 @@ private void checkLocalStoragePrimaryStorageInitilized(LocalStorageInitParam par if (hostHasInitializedTag(host.getUuid())) { LocalStorageHypervisorFactory f = getHypervisorBackendFactory(host.getHypervisorType()); LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self); - bkd.checkHostAttachedPSMountPath(host.getUuid(), new Completion(com) { + bkd.checkHostAttachedPSMountPath(host.getUuid(), new ReturnValueCompletion(com) { @Override - public void success() { + public void success(LocalStorageKvmBackend.CheckInitializedFileRsp rsp) { + if (!rsp.existed) { + sendWarnning(host.getUuid(), rsp.getError(), getSelfInventory()); + } com.done(); } @Override public void fail(ErrorCode errorCode) { - sendWarnning(host.getUuid(), errorCode.getDetails(), getSelfInventory()); com.done(); } }); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java index 3ae047fb60c..2c7b909827f 100644 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageDesignatedAllocateCapacityFlow.java @@ -95,6 +95,7 @@ public void run(MessageReply reply) { if (msg == rootVolumeAllocationMsg) { vspec.setSize(ar.getSize()); vspec.setPrimaryStorageInventory(ar.getPrimaryStorageInventory()); + vspec.setDiskOfferingUuid(msg.getDiskOfferingUuid()); vspec.setType(VolumeType.Root.toString()); } else { vspec.setSize(ar.getSize()); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java index 838c1285d47..7760e28de93 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageHypervisorBackend.java @@ -110,7 +110,7 @@ public LocalStorageHypervisorBackend(PrimaryStorageVO self) { abstract void createEmptyVolumeWithBackingFile(VolumeInventory volume, String hostUuid, String backingFile, ReturnValueCompletion completion); - abstract void checkHostAttachedPSMountPath(String hostUuid, Completion completion); + abstract void checkHostAttachedPSMountPath(String hostUuid, ReturnValueCompletion completion); abstract void initializeHostAttachedPSMountPath(String hostUuid, Completion completion); @@ -118,5 +118,7 @@ public LocalStorageHypervisorBackend(PrimaryStorageVO self) { abstract void handle(GetVolumeSnapshotEncryptedOnPrimaryStorageMsg msg, ReturnValueCompletion completion); - abstract void handle(UndoSnapshotCreationOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + abstract void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + + abstract void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); } diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java index 0ff5b51fa4a..05d0342cbbc 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageImageCleaner.java @@ -26,6 +26,7 @@ import org.zstack.header.storage.primary.*; import org.zstack.header.volume.VolumeStatus; import org.zstack.header.volume.VolumeVO; +import org.zstack.storage.primary.ImageCacheCleanParam; import org.zstack.storage.primary.ImageCacheCleaner; import org.zstack.storage.primary.local.LocalStorageUtils.InstallPath; import org.zstack.utils.CollectionUtils; @@ -37,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * Created by xing5 on 2016/7/20. @@ -55,29 +57,20 @@ protected String getPrimaryStorageType() { return LocalStorageConstants.LOCAL_STORAGE_TYPE; } - private boolean force; - - public boolean isForce() { - return force; - } - - public void setForce(boolean force) { - this.force = force; - } - @Transactional - protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUUid) { - List staleImageCacheIds; - if (force){ - staleImageCacheIds = getStaleImageCacheIdsForLocalStorage(psUUid); - } else { - staleImageCacheIds = getStaleImageCacheIds(psUUid); + protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUUid, ImageCacheCleanParam param) { + // 1. images has been deleted + List staleImageCacheIds = new ArrayList<>(); + List imageDeletedCacheIds = getStaleImageCacheIds(psUUid, param.includeReadyImage); + if (!CollectionUtils.isEmpty(imageDeletedCacheIds)) { + staleImageCacheIds.addAll(imageDeletedCacheIds); } - if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { + if (staleImageCacheIds.isEmpty()) { return null; } + staleImageCacheIds = staleImageCacheIds.stream().distinct().collect(Collectors.toList()); String sql = "select c from ImageCacheVO c where c.id in (:ids)"; TypedQuery cq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); cq.setParameter("ids", staleImageCacheIds); @@ -102,17 +95,64 @@ protected List createShadowImageCacheVOsForNewDeletedAndOld( sql = "select vol.rootImageUuid from VolumeVO vol where vol.rootImageUuid is not null and vol.status = :status"; TypedQuery query = dbf.getEntityManager().createQuery(sql, String.class); - query = dbf.getEntityManager().createQuery(sql, String.class); query.setParameter("status", VolumeStatus.NotInstantiated); List filterIds = query.getResultList(); + // 3. no volume reference if (psUUid == null) { - sql = "select c from ImageCacheVO c where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + - " where vol.uuid = ref.resourceUuid and ref.resourceType = :rtype and ref.hostUuid = :huuid and vol.rootImageUuid is not null) and c.id in (:ids)"; + sql = "select c.id from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + + " where vol.uuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and vol.rootImageUuid is not null)" + + " and c.id in (:ids)"; } else { - sql = "select c from ImageCacheVO c where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + - " where vol.uuid = ref.resourceUuid and ref.resourceType = :rtype and ref.hostUuid = :huuid and ref.primaryStorageUuid = :psUuid and vol.rootImageUuid is not null) and c.id in (:ids)"; + sql = "select c.id from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select vol.rootImageUuid from VolumeVO vol, LocalStorageResourceRefVO ref" + + " where vol.uuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and ref.primaryStorageUuid = :psUuid" + + " and vol.rootImageUuid is not null)" + + " and c.id in (:ids)"; } + TypedQuery iq = dbf.getEntityManager().createQuery(sql, Long.class); + iq.setParameter("rtype", VolumeVO.class.getSimpleName()); + iq.setParameter("huuid", hostUuid); + if (psUUid != null) { + iq.setParameter("psUuid", psUUid); + } + iq.setParameter("ids", cacheIds); + cacheIds = iq.getResultList(); + if (cacheIds.isEmpty()) { + continue; + } + + // 4. no volume snapshot tree reference + if (psUUid == null) { + sql = "select c from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select tree.rootImageUuid from VolumeSnapshotTreeVO tree, LocalStorageResourceRefVO ref" + + " where tree.volumeUuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and tree.rootImageUuid is not null)" + + " and c.id in (:ids)"; + } else { + sql = "select c from ImageCacheVO c" + + " where c.imageUuid not in" + + " (select tree.rootImageUuid from VolumeSnapshotTreeVO tree, LocalStorageResourceRefVO ref" + + " where tree.volumeUuid = ref.resourceUuid" + + " and ref.resourceType = :rtype" + + " and ref.hostUuid = :huuid" + + " and ref.primaryStorageUuid = :psUuid" + + " and tree.rootImageUuid is not null)" + + " and c.id in (:ids)"; + } + cq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); cq.setParameter("rtype", VolumeVO.class.getSimpleName()); cq.setParameter("huuid", hostUuid); @@ -120,8 +160,8 @@ protected List createShadowImageCacheVOsForNewDeletedAndOld( cq.setParameter("psUuid", psUUid); } cq.setParameter("ids", cacheIds); - List results = cq.getResultList(); + List results = cq.getResultList(); results.removeIf(c -> filterIds.contains(c.getImageUuid())); stale.addAll(results); @@ -178,19 +218,19 @@ public void done(ErrorCodeList errorCodeList) { } @Override - protected void cleanUpVolumeCache(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { - List shadowVOs = createShadowImageCacheVOs(psUuid); + protected void cleanUpVolumeCache(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { + List shadowVOs = createShadowImageCacheVOs(psUuid, param); if (shadowVOs == null || shadowVOs.isEmpty()) { completion.done(); return; } - new While<>(shadowVOs).each((vo, whileCompletion) -> { - if (needDestinationCheck && !destMaker.isManagedByUs(vo.getImageUuid())) { - whileCompletion.done(); - return; - } + if (!param.triggerByApi) { + shadowVOs.removeIf(vo -> !destMaker.isManagedByUs(vo.getImageUuid())); + } + + new While<>(shadowVOs).each((vo, whileCompletion) -> { InstallPath p = new InstallPath(); p.fullPath = vo.getInstallUrl(); p.disassemble(); @@ -231,7 +271,7 @@ public void done(ErrorCodeList errorCodeList) { } @Override - protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { + protected void doCleanup(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { List psUuids = new ArrayList<>(); if (psUuid == null) { psUuids.addAll(listPrimaryStoragesBySelfType()); @@ -244,7 +284,7 @@ protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCom chain.then(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - cleanUpVolumeCache(psUuid, needDestinationCheck, new NoErrorCompletion() { + cleanUpVolumeCache(psUuid, param, new NoErrorCompletion() { @Override public void done() { trigger.next(); @@ -315,7 +355,7 @@ public void handle(ErrorCode errCode, Map data) { } @Override - public void cleanup(String psUuid, boolean needDestinationCheck) { + public void cleanup(String psUuid, ImageCacheCleanParam param) { ImageCacheCleaner self = this; thdf.chainSubmit(new ChainTask(null) { @Override @@ -326,7 +366,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { logger.debug("start clean up cache"); - doCleanup(psUuid, needDestinationCheck, new NoErrorCompletion() { + doCleanup(psUuid, param, new NoErrorCompletion() { @Override public void done() { chain.next(); diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java index 6e1839c887a..86d521b1a94 100755 --- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java +++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java @@ -44,10 +44,7 @@ import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.backup.*; import org.zstack.header.storage.primary.*; -import org.zstack.header.storage.primary.UndoSnapshotCreationOnPrimaryStorageMsg; -import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; -import org.zstack.header.storage.snapshot.VolumeSnapshotVO; +import org.zstack.header.storage.snapshot.*; import org.zstack.header.vm.VmInstanceSpec.ImageSpec; import org.zstack.header.vm.VmInstanceState; import org.zstack.header.vm.VmInstanceVO; @@ -729,6 +726,38 @@ public void setDestPath(String destPath) { } public static class OfflineMergeSnapshotRsp extends AgentResponse { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + + public static class OfflineCommitSnapshotCmd extends AgentCommand implements HasThreadContext { + @GrayVersion(value = "5.4.0") + public String top; + @GrayVersion(value = "5.4.0") + public String base; + @GrayVersion(value = "5.4.0") + public List topChildrenInstallPathInDb = new ArrayList<>(); + } + + public static class OfflineCommitSnapshotRsp extends AgentResponse { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } } public static class CheckBitsCmd extends AgentCommand { @@ -978,6 +1007,7 @@ public void setHashValue(String hashValue) { public static final String REINIT_IMAGE_PATH = "/localstorage/reinit/image"; public static final String MERGE_SNAPSHOT_PATH = "/localstorage/snapshot/merge"; public static final String OFFLINE_MERGE_PATH = "/localstorage/snapshot/offlinemerge"; + public static final String OFFLINE_COMMIT_PATH = "/localstorage/snapshot/offlinecommit"; public static final String GET_MD5_PATH = "/localstorage/getmd5"; public static final String CHECK_MD5_PATH = "/localstorage/checkmd5"; public static final String GET_BACKING_FILE_PATH = "/localstorage/volume/getbackingfile"; @@ -2109,32 +2139,6 @@ public void run(MessageReply reply) { }); } - @Override - void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg, final String hostUuid, final ReturnValueCompletion completion) { - CommitVolumeOnHypervisorMsg hmsg = new CommitVolumeOnHypervisorMsg(); - hmsg.setHostUuid(hostUuid); - hmsg.setVmUuid(msg.getVmUuid()); - hmsg.setVolume(msg.getVolume()); - hmsg.setSrcPath(msg.getSrcPath()); - hmsg.setDstPath(msg.getDstPath()); - bus.makeTargetServiceIdByResourceUuid(hmsg, HostConstant.SERVICE_ID, hostUuid); - bus.send(hmsg, new CloudBusCallBack(completion) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; - } - - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - CommitVolumeOnHypervisorReply treply = (CommitVolumeOnHypervisorReply) reply; - ret.setSize(treply.getSize()); - ret.setNewVolumeInstallPath(treply.getNewVolumeInstallPath()); - completion.success(ret); - } - }); - } - @Override void handle(final DeleteSnapshotOnPrimaryStorageMsg msg, final String hostUuid, final ReturnValueCompletion completion) { final DeleteSnapshotOnPrimaryStorageReply reply = new DeleteSnapshotOnPrimaryStorageReply(); @@ -2196,7 +2200,7 @@ public void run(FlowTrigger trigger, Map data) { cmd.imagePath = makeCachedImageInstallUrlFromImageUuidForTemplate(msg.getVolume().getRootImageUuid()); cmd.volumePath = makeRootVolumeInstallUrl(msg.getVolume()); - httpCall(REINIT_IMAGE_PATH, hostUuid, cmd, ReinitImageRsp.class, new ReturnValueCompletion(completion) { + httpCall(REINIT_IMAGE_PATH, hostUuid, cmd, ReinitImageRsp.class, new ReturnValueCompletion(trigger) { @Override public void success(ReinitImageRsp rsp) { reply.setNewVolumeInstallPath(rsp.getNewVolumeInstallPath()); @@ -3774,7 +3778,7 @@ public void fail(ErrorCode errorCode) { } @Override - void checkHostAttachedPSMountPath(String hostUuid, Completion completion) { + void checkHostAttachedPSMountPath(String hostUuid, ReturnValueCompletion completion) { CheckInitializedFileCmd cmd = new CheckInitializedFileCmd(); cmd.uuid = self.getUuid(); cmd.filePath = makeInitializedFilePath(); @@ -3785,10 +3789,9 @@ void checkHostAttachedPSMountPath(String hostUuid, Completion completion) { @Override public void success(CheckInitializedFileRsp rsp) { if (!rsp.existed) { - completion.fail(operr("cannot find flag file [%s] on host [%s], it might not mount correct path", makeInitializedFilePath(), hostUuid)); - } else { - completion.success(); + rsp.setError(String.format("cannot find flag file [%s] on host [%s], it might not mount correct path", makeInitializedFilePath(), hostUuid)); } + completion.success(rsp); } @Override @@ -3865,4 +3868,47 @@ public void fail(ErrorCode errorCode) { private String makeInitializedFilePath() { return String.format("%s/%s-initialized-file", self.getMountPath(), self.getUuid()); } + + @Override + void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, final ReturnValueCompletion completion) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + OfflineCommitSnapshotCmd cmd = new OfflineCommitSnapshotCmd(); + cmd.top = msg.getSrcSnapshot().getPrimaryStorageInstallPath(); + cmd.base = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.topChildrenInstallPathInDb = msg.getSrcChildrenInstallPathInDb(); + httpCall(OFFLINE_COMMIT_PATH, hostUuid, cmd, OfflineCommitSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(OfflineCommitSnapshotRsp returnValue) { + reply.setSize(returnValue.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, final ReturnValueCompletion completion) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + + OfflineMergeSnapshotCmd cmd = new OfflineMergeSnapshotCmd(); + cmd.srcPath = msg.getSrcSnapshotParentPath(); + cmd.destPath = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.fullRebase = StringUtils.isEmpty(cmd.srcPath); + httpCall(OFFLINE_MERGE_PATH, hostUuid, cmd, OfflineMergeSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(OfflineMergeSnapshotRsp rsp) { + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } } diff --git a/plugin/loginPlugin/pom.xml b/plugin/loginPlugin/pom.xml index c478235a3e2..3be14fc3082 100644 --- a/plugin/loginPlugin/pom.xml +++ b/plugin/loginPlugin/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 4.4.0 + 5.4.0 .. loginPlugin diff --git a/plugin/mediator/pom.xml b/plugin/mediator/pom.xml index bdc770ebfa1..c98247a956f 100755 --- a/plugin/mediator/pom.xml +++ b/plugin/mediator/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/nfsPrimaryStorage/pom.xml b/plugin/nfsPrimaryStorage/pom.xml index ae905394278..2d63182f8e1 100755 --- a/plugin/nfsPrimaryStorage/pom.xml +++ b/plugin/nfsPrimaryStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 .. nfsPrimaryStorage diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java index 1b6a5057b78..1a1f39a18c0 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorage.java @@ -37,6 +37,7 @@ import org.zstack.header.storage.backup.BackupStorageVO; import org.zstack.header.storage.primary.*; import org.zstack.header.storage.primary.VolumeSnapshotCapability.VolumeSnapshotArrangementType; +import org.zstack.header.storage.snapshot.DeleteVolumeSnapshotDirection; import org.zstack.header.storage.snapshot.ShrinkVolumeSnapshotOnPrimaryStorageMsg; import org.zstack.header.storage.snapshot.VolumeSnapshotConstant; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; @@ -45,7 +46,7 @@ import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmInstanceVO_; import org.zstack.header.volume.*; -import org.zstack.kvm.KVMConstant; +import org.zstack.kvm.*; import org.zstack.storage.primary.*; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.storage.volume.VolumeErrors; @@ -60,9 +61,7 @@ import javax.persistence.Tuple; import javax.persistence.TypedQuery; import java.io.File; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -129,69 +128,15 @@ protected void handleLocalMessage(Message msg) { handle((GetDownloadBitsFromKVMHostProgressMsg) msg); } else if (msg instanceof GetVolumeBackingChainFromPrimaryStorageMsg) { handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnPrimaryStorageMsg) { + handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) { + handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { - final TakeSnapshotReply reply = new TakeSnapshotReply(); - - String volumeUuid = msg.getVolume().getUuid(); - VolumeVO vol = dbf.findByUuid(volumeUuid, VolumeVO.class); - - String huuid; - String connectedHostUuid = factory.getConnectedHostForOperation(getSelfInventory()).get(0).getUuid(); - if (vol.getVmInstanceUuid() != null) { - Tuple t = Q.New(VmInstanceVO.class) - .select(VmInstanceVO_.state, VmInstanceVO_.hostUuid) - .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()) - .findTuple(); - VmInstanceState state = t.get(0, VmInstanceState.class); - String vmHostUuid = t.get(1, String.class); - - if (state == VmInstanceState.Running || state == VmInstanceState.Paused) { - DebugUtils.Assert(vmHostUuid != null, - String.format("vm[uuid:%s] is Running or Paused, but has no hostUuid", vol.getVmInstanceUuid())); - huuid = vmHostUuid; - } else if (state == VmInstanceState.Stopped) { - huuid = connectedHostUuid; - } else { - reply.setError(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state is %s", - vol.getVmInstanceUuid(), state)); - bus.reply(msg, reply); - return; - } - } else { - huuid = connectedHostUuid; - } - CommitVolumeOnHypervisorMsg hmsg = new CommitVolumeOnHypervisorMsg(); - hmsg.setHostUuid(huuid); - hmsg.setVmUuid(msg.getVmUuid()); - hmsg.setVolume(msg.getVolume()); - hmsg.setSrcPath(msg.getSrcPath()); - hmsg.setDstPath(msg.getDstPath()); - bus.makeTargetServiceIdByResourceUuid(hmsg, HostConstant.SERVICE_ID, huuid); - bus.send(hmsg, new CloudBusCallBack(msg) { - @Override - public void run(MessageReply reply) { - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - if (!reply.isSuccess()) { - ret.setError(reply.getError()); - bus.reply(msg, ret); - return; - } - - CommitVolumeOnHypervisorReply treply = (CommitVolumeOnHypervisorReply) reply; - ret.setSize(treply.getSize()); - ret.setNewVolumeInstallPath(treply.getNewVolumeInstallPath()); - bus.reply(msg, ret); - } - }); - } - protected void updateMountPoint(String newUrl, Completion completion) { String oldUrl = self.getUrl(); @@ -293,7 +238,7 @@ public void fail(ErrorCode errorCode) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } @@ -595,6 +540,7 @@ public void fail(ErrorCode errorCode) { gc.primaryStorageUuid = self.getUuid(); gc.hypervisorType = bkd.getHypervisorType().toString(); gc.submit(NfsPrimaryStorageGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); + reply.setGcSubmitted(true); logger.warn(String.format("NFS primary storage[uuid:%s] failed to delete a volume snapshot[uuid:%s], %s. A GC" + " job[uuid:%s] is scheduled to cleanup it in the interval of %s seconds", @@ -1390,6 +1336,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { String volumeType = msg.getVolume().getType(); if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); } else if (VolumeType.Memory.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); } else { @@ -1936,4 +1883,89 @@ public void fail(ErrorCode errorCode) { } }); } + + protected void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + + String hostUuid = getHostUuidFromVolume(msg.getVolume().getUuid()); + if (hostUuid == null || hostUuid.isEmpty()) { + reply.setError(operr("no host found for volume[uuid:%s]", msg.getVolume().getUuid())); + bus.reply(msg, reply); + return; + } + + final NfsPrimaryStorageBackend backend = getBackend(nfsMgr.findHypervisorTypeByImageFormatAndPrimaryStorageUuid( + msg.getVolume().getFormat(), self.getUuid())); + + backend.commitSnapshot(msg, hostUuid, new ReturnValueCompletion(msg) { + @Override + public void success(CommitVolumeSnapshotOnPrimaryStorageReply r) { + bus.reply(msg, r); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + protected void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + + String hostUuid = getHostUuidFromVolume(msg.getVolume().getUuid()); + if (hostUuid == null || hostUuid.isEmpty()) { + reply.setError(operr("no host found for volume[uuid:%s]", msg.getVolume().getUuid())); + bus.reply(msg, reply); + return; + } + + final NfsPrimaryStorageBackend backend = getBackend(nfsMgr.findHypervisorTypeByImageFormatAndPrimaryStorageUuid( + msg.getVolume().getFormat(), self.getUuid())); + + backend.pullSnapshot(msg, hostUuid, new ReturnValueCompletion(msg) { + @Override + public void success(PullVolumeSnapshotOnPrimaryStorageReply r) { + bus.reply(msg, r); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private String getHostUuidFromVolume(String volumeUuid) { + VolumeVO vol = dbf.findByUuid(volumeUuid, VolumeVO.class); + + String hostUuid = ""; + List connectedHost = factory.getConnectedHostForOperation(getSelfInventory()); + if (connectedHost.isEmpty()) { + return hostUuid; + } + String connectedHostUuid = factory.getConnectedHostForOperation(getSelfInventory()).get(0).getUuid(); + if (vol.getVmInstanceUuid() != null) { + Tuple t = Q.New(VmInstanceVO.class) + .select(VmInstanceVO_.state, VmInstanceVO_.hostUuid) + .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()) + .findTuple(); + VmInstanceState state = t.get(0, VmInstanceState.class); + String vmHostUuid = t.get(1, String.class); + + if (state == VmInstanceState.Running || state == VmInstanceState.Paused) { + DebugUtils.Assert(vmHostUuid != null, + String.format("vm[uuid:%s] is Running or Paused, but has no hostUuid", vol.getVmInstanceUuid())); + hostUuid = vmHostUuid; + } else if (state == VmInstanceState.Stopped) { + hostUuid = connectedHostUuid; + } + } else { + hostUuid = connectedHostUuid; + } + + return hostUuid; + } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java index e7904c92620..6c26e682ce6 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageBackend.java @@ -87,8 +87,11 @@ public interface NfsPrimaryStorageBackend { void remount(PrimaryStorageInventory pinv, String clusterUuid, NfsPrimaryStorage.NfsConnectParam param, Completion completion); - void updateMountPoint(PrimaryStorageInventory pinv, String clusterUuid, String oldMountPoint, String newMountPoint, Completion completion); + void pullSnapshot(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + + void commitSnapshot(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion); + void updateMountPoint(PrimaryStorageInventory pinv, String clusterUuid, String oldMountPoint, String newMountPoint, Completion completion); class BitsInfo { private String installPath; diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java index b81e961bada..5ad1919dd0f 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java @@ -23,9 +23,7 @@ import org.zstack.core.trash.StorageTrash; import org.zstack.core.upgrade.UpgradeChecker; import org.zstack.header.core.*; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; @@ -118,6 +116,7 @@ public class NfsPrimaryStorageKVMBackend implements NfsPrimaryStorageBackend, public static final String ESTIMATE_TEMPLATE_SIZE_PATH = "/nfsprimarystorage/estimatetemplatesize"; public static final String CREATE_VOLUME_WITH_BACKING_PATH = "/nfsprimarystorage/createvolumewithbacking"; public static final String OFFLINE_SNAPSHOT_MERGE = "/nfsprimarystorage/offlinesnapshotmerge"; + public static final String OFFLINE_SNAPSHOT_COMMIT = "/nfsprimarystorage/offlinesnapshotcommit"; public static final String REMOUNT_PATH = "/nfsprimarystorage/remount"; public static final String GET_VOLUME_SIZE_PATH = "/nfsprimarystorage/getvolumesize"; public static final String BATCH_GET_VOLUME_SIZE_PATH = "/nfsprimarystorage/batchgetvolumesize"; @@ -945,6 +944,7 @@ public void handle(PrimaryStorageInventory inv, NfsRebaseVolumeBackingFileMsg ms cmd.dstPsMountPath = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.mountPath).eq(PrimaryStorageVO_.uuid, msg.getDstPsUuid()).findValue(); cmd.dstVolumeFolderPath = msg.getDstVolumeFolderPath(); cmd.dstImageCacheTemplateFolderPath = msg.getDstImageCacheTemplateFolderPath(); + cmd.setUuid(inv.getUuid()); final HostInventory host = nfsFactory.getConnectedHostForOperation(inv).get(0); new KvmCommandSender(host.getUuid()).send(cmd, NFS_REBASE_VOLUME_BACKING_FILE_PATH, new KvmCommandFailureChecker() { @@ -2008,4 +2008,73 @@ public void fail(ErrorCode errorCode) { } }); } + + @Override + public void pullSnapshot(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + + OfflineMergeSnapshotCmd cmd = new OfflineMergeSnapshotCmd(); + cmd.setSrcPath(msg.getSrcSnapshotParentPath()); + cmd.setDestPath(msg.getDstSnapshot().getPrimaryStorageInstallPath()); + cmd.setUuid(msg.getVolume().getPrimaryStorageUuid()); + cmd.setFullRebase(cmd.getSrcPath() == null); + + KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); + kmsg.setCommand(cmd); + kmsg.setPath(OFFLINE_SNAPSHOT_MERGE); + kmsg.setHostUuid(hostUuid); + bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(kmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + completion.fail(r.getError()); + return; + } + + OfflineMergeSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) r).toResponse(OfflineMergeSnapshotRsp.class); + if (!rsp.isSuccess()) { + completion.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + }); + } + + @Override + public void commitSnapshot(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion) { + OfflineCommitSnapshotCmd cmd = new OfflineCommitSnapshotCmd(); + cmd.top = msg.getSrcSnapshot().getPrimaryStorageInstallPath(); + cmd.base = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.topChildrenInstallPathInDb = msg.getSrcChildrenInstallPathInDb(); + cmd.setUuid(msg.getVolume().getPrimaryStorageUuid()); + + KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg(); + kmsg.setCommand(cmd); + kmsg.setPath(OFFLINE_SNAPSHOT_COMMIT); + kmsg.setHostUuid(hostUuid); + bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(kmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + completion.fail(r.getError()); + return; + } + + OfflineCommitSnapshotRsp rsp = ((KVMHostAsyncHttpCallReply) r).toResponse(OfflineCommitSnapshotRsp.class); + if (!rsp.isSuccess()) { + completion.fail(operr("operation error, because:%s", rsp.getError())); + return; + } + + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + }); + } } diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java index 5297a10d1ef..1a31b5b6b7e 100755 --- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java +++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java @@ -7,6 +7,7 @@ import org.zstack.kvm.KVMAgentCommands.AgentCommand; import org.zstack.kvm.KVMAgentCommands.AgentResponse; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -883,6 +884,38 @@ public void setDestPath(String destPath) { } public static class OfflineMergeSnapshotRsp extends NfsPrimaryStorageAgentResponse { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + + public static class OfflineCommitSnapshotCmd extends NfsPrimaryStorageAgentCommand implements HasThreadContext { + @GrayVersion(value = "5.4.0") + public String top; + @GrayVersion(value = "5.4.0") + public String base; + @GrayVersion(value = "5.4.0") + public List topChildrenInstallPathInDb = new ArrayList<>(); + } + + public static class OfflineCommitSnapshotRsp extends NfsPrimaryStorageAgentResponse { + @GrayVersion(value = "5.4.0") + private Long actualSize; + + public Long getActualSize() { + return actualSize; + } + + public void setActualSize(Long actualSize) { + this.actualSize = actualSize; + } } public static class RemountCmd extends NfsPrimaryStorageAgentCommand { diff --git a/plugin/pom.xml b/plugin/pom.xml index a42784d6e11..c97c9a24421 100755 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. plugin diff --git a/plugin/portForwarding/pom.xml b/plugin/portForwarding/pom.xml index 69ae62dac1f..051e60a74e7 100755 --- a/plugin/portForwarding/pom.xml +++ b/plugin/portForwarding/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 portForwarding diff --git a/plugin/sdnController/pom.xml b/plugin/sdnController/pom.xml index 391e227c820..c6fb7c3f735 100644 --- a/plugin/sdnController/pom.xml +++ b/plugin/sdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 @@ -42,6 +42,11 @@ vxlan ${project.version} + + org.zstack + hostNetworkInterface + ${project.version} + diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java index d5a9cbfec31..f8a39857c20 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/RBACInfo.java @@ -17,7 +17,11 @@ public void contributeToRoles() { @Override public void roles() { - + roleBuilder() + .name("sdnController") + .uuid("4266a67e46cb4e68864899458287941e") + .permissionsByName("sdnController") + .build(); } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java index c4e4aac4494..5de07d899f7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java @@ -1,36 +1,30 @@ package org.zstack.sdnController; import org.zstack.header.core.Completion; -import org.zstack.header.identity.AccountInventory; -import org.zstack.header.network.l2.L2NetworkVO; -import org.zstack.header.network.l3.*; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; +import org.zstack.header.network.sdncontroller.*; import org.zstack.sdnController.header.*; -import java.util.List; public interface SdnController { + + void handleMessage(SdnControllerMessage msg); /* 有关sdn控制器的前置检查: pre-event 对sdn控制器的控制: event 有关sdn控制器的后置处理: post-event */ void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion); + void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion); + void deleteSdnControllerDb(SdnControllerVO vo); void initSdnController(APIAddSdnControllerMsg msg, Completion completion); - void postInitSdnController(APIAddSdnControllerMsg msg, Completion completion); + void postInitSdnController(SdnControllerVO vo, Completion completion); - void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void createVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); - void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void postAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + default void reconnectSdnController(Completion completion) {completion.success();}; - void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); - void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion); - void deleteVxlanNetwork(L2VxlanNetworkInventory vxlan, Completion completion); + default void addHost(APISdnControllerAddHostMsg msg, Completion completion) {completion.success();}; + default void removeHost(SdnControllerRemoveHostMsg msg, Completion completion) {completion.success();}; - List getVniRange(SdnControllerInventory controller); - List getVlanRange(SdnControllerInventory controller); + default void changeHost(SdnControllerHostRefVO oldRef, SdnControllerHostRefVO newRef, Completion completion) {completion.success();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index d39399a97df..741a99cdb70 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -1,20 +1,38 @@ package org.zstack.sdnController; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.message.APIMessage; -import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; -import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.header.network.sdncontroller.*; +import org.zstack.header.vm.APIAttachL3NetworkToVmMsg; +import org.zstack.header.vm.APIChangeVmNicNetworkMsg; +import org.zstack.header.vm.VmInstanceVO; +import org.zstack.header.vm.VmNicVO; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; +import org.zstack.network.l3.L3NetworkHelper; +import org.zstack.network.securitygroup.*; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.NetworkUtils; -import java.util.ArrayList; import java.util.List; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; import static org.zstack.core.Platform.argerr; @@ -36,27 +54,45 @@ private void setServiceId(APIMessage msg) { } } + @Override public List getMessageClassToIntercept() { List ret = new ArrayList<>(); - ret.add(APICreateL2VxlanNetworkMsg.class); - ret.add(APIAttachL2NetworkToClusterMsg.class); - ret.add(APIAddSdnControllerMsg.class); - ret.add(APIRemoveSdnControllerMsg.class); + ret.add(APIAttachSecurityGroupToL3NetworkMsg.class); + ret.add(APIAddVmNicToSecurityGroupMsg.class); + ret.add(APISetVmNicSecurityGroupMsg.class); + ret.add(APIAddSecurityGroupRuleMsg.class); + ret.add(APIAttachL3NetworkToVmMsg.class); + ret.add(APIChangeVmNicNetworkMsg.class); + ret.add(APIPullSdnControllerTenantMsg.class); return ret; } + @Override public InterceptorPosition getPosition() { return InterceptorPosition.END; } + @Override public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { - if (msg instanceof APICreateL2VxlanNetworkMsg) { - validate((APICreateL2VxlanNetworkMsg)msg); - } else if (msg instanceof APIAttachL2NetworkToClusterMsg){ - validate((APIAttachL2NetworkToClusterMsg)msg); - } else if (msg instanceof APIAddSdnControllerMsg) { + if (msg instanceof APIAddSdnControllerMsg) { validate((APIAddSdnControllerMsg)msg); + } else if (msg instanceof APISdnControllerAddHostMsg) { + validate((APISdnControllerAddHostMsg)msg); + } else if (msg instanceof APISdnControllerRemoveHostMsg) { + validate((APISdnControllerRemoveHostMsg)msg); + } else if (msg instanceof APISdnControllerChangeHostMsg) { + validate((APISdnControllerChangeHostMsg)msg); + } else if (msg instanceof APISetVmNicSecurityGroupMsg) { + validate((APISetVmNicSecurityGroupMsg) msg); + } else if (msg instanceof APIAddSecurityGroupRuleMsg) { + validate((APIAddSecurityGroupRuleMsg) msg); + } else if (msg instanceof APIChangeVmNicNetworkMsg) { + validate((APIChangeVmNicNetworkMsg) msg); + } else if (msg instanceof APIPullSdnControllerTenantMsg) { + validate((APIPullSdnControllerTenantMsg) msg); + } else if (msg instanceof APIChangeSdnControllerMsg) { + validate((APIChangeSdnControllerMsg) msg); } setServiceId(msg); @@ -64,15 +100,274 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti return msg; } - private void validate(APICreateL2VxlanNetworkMsg msg) { + private void validate(APIAttachL3NetworkToVmMsg msg) { + String sdnControlerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControlerUuid == null) { + return; + } + + SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); + if (controllerVO == null) { + throw new ApiMessageInterceptionException(argerr("could not attach l3network to vm, " + + "because sdn controller[uuid:%s] is not find", sdnControlerUuid)); + } + + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(controllerVO.getVendorType()) && + SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(controllerVO.getVendorVersion())) { + validateH3cTenantStatus(msg.getL3NetworkUuid(), sdnControlerUuid); + return; + } + + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(controllerVO.getVendorType())) { + return; + } + + VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); + boolean found = false; + for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { + if (ref.getHostUuid().equals(vmVo.getHostUuid())) { + found = true; + break; + } + } + if (!found) { + throw new ApiMessageInterceptionException(argerr("could not attach l3network to vm, " + + "because host[uuid:%s] of vm is not attached to sdn controller[uuid:%s]", + vmVo.getHostUuid(), sdnControlerUuid)); + } } - private void validate(APIAttachL2NetworkToClusterMsg msg) { + private void validate(APIChangeVmNicNetworkMsg msg) { + String sdnControlerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getDestL3NetworkUuid()); + if (sdnControlerUuid == null) { + return; + } + + SdnControllerVO controllerVO = dbf.findByUuid(sdnControlerUuid, SdnControllerVO.class); + if (controllerVO == null) { + throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + + "because sdn controller[uuid:%s] is not find", msg.getDestL3NetworkUuid(), sdnControlerUuid)); + } + + VmInstanceVO vmVo = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); + boolean found = false; + for (SdnControllerHostRefVO ref : controllerVO.getHostRefVOS()) { + if (ref.getHostUuid().equals(vmVo.getHostUuid())) { + found = true; + break; + } + } + if (!found) { + throw new ApiMessageInterceptionException(argerr("could not change vmnic to l3network[uuid:%s], " + + "because host[uuid:%s] of vm is not attached to sdn controller[uuid:%s]", + msg.getDestL3NetworkUuid(), vmVo.getHostUuid(), sdnControlerUuid)); + } + } + + private void validate(APISetVmNicSecurityGroupMsg msg) { + VmNicVO nicVO = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + String nicControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(nicVO.getL3NetworkUuid()); + for (APISetVmNicSecurityGroupMsg.VmNicSecurityGroupRefAO ref : msg.getRefs()) { + String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(ref.getSecurityGroupUuid()); + if (!StringUtils.equals(sgControllerUuid, nicControllerUuid)) { + throw new ApiMessageInterceptionException(argerr("could not add vmnic to securityGroup, " + + "because they have different sdn controller[nic controller uuid:%s, security group controller uuid:%s]", + nicControllerUuid, sgControllerUuid)); + } + } + } + + private void validate(APIAddSecurityGroupRuleMsg msg) { + String sgControllerUuid = SecurityGroupHelper.getSdnControllerUuid(msg.getSecurityGroupUuid()); + for (APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO rule : msg.getRules()) { + if (rule.getRemoteSecurityGroupUuid() == null) { + continue; + } + String remoteControllerUuid = SecurityGroupHelper.getSdnControllerUuid(rule.getRemoteSecurityGroupUuid()); + if (!StringUtils.equals(sgControllerUuid, remoteControllerUuid)) { + throw new ApiMessageInterceptionException(argerr("could not add securityGroup rule, " + + "because rule remote security group sdn controller uuid[:%s] is different from security group controller uuid[:%s]", + remoteControllerUuid, sgControllerUuid)); + } + } } private void validate(APIAddSdnControllerMsg msg) { if (!SdnControllerType.getAllTypeNames().contains(msg.getVendorType())) { - throw new ApiMessageInterceptionException(argerr("Sdn controller type: %s in not in the supported list: %s ", msg.getVendorType(), SdnControllerType.getAllTypeNames())); + throw new ApiMessageInterceptionException(argerr("could not add sdn controller because type: %s in not in the supported list: %s", msg.getVendorType(), SdnControllerType.getAllTypeNames())); + } + + if (!NetworkUtils.isUnicastIPAddress(msg.getIp())) { + throw new ApiMessageInterceptionException(argerr("could not add sdn controller because ip[%s] is not an unicast address", msg.getIp())); + } + + boolean existed = Q.New(SdnControllerVO.class).eq(SdnControllerVO_.ip, msg.getIp()).isExists(); + if (existed) { + throw new ApiMessageInterceptionException(argerr("could not add sdn controller because controller [ip:%s] is already added", msg.getIp())); + } + } + + private void validate(APISdnControllerAddHostMsg msg) { + if (Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { + throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because host already attached to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getVtepIp() != null && msg.getNetmask() == null) { + throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because netmask is not specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getVtepIp() != null) { + SdnControllerHostRefVO refvo = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) + .eq(SdnControllerHostRefVO_.vtepIp, msg.getVtepIp()).find(); + if (refvo != null) { + throw new ApiMessageInterceptionException(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because vtepip is used by host[uuid:%s]", msg.getHostUuid(), + msg.getSdnControllerUuid(), refvo.getHostUuid())); + } + } + + if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { + msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); + } + + if (msg.getBondMode() != null && msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP) && msg.getLacpMode() == null) { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_ACTIVE); + } + } + + private void validate(APISdnControllerRemoveHostMsg msg) { + if (!Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).isExists()) { + throw new ApiMessageInterceptionException(argerr("could not remove host[uuid:%s] from sdn controller[uuid:%s], " + + " because host has not been added to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + } + + private void validate(APISdnControllerChangeHostMsg msg) { + SdnControllerHostRefVO refVO = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); + if (refVO == null) { + throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + " because host has not been added to sdn controller", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getVtepIp() != null && msg.getNetmask() == null) { + throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + " because netmask is specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getNicNames() == null) { + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + Map nicNamePciAddressMap = gson.fromJson(refVO.getNicPciAddresses(), type); + msg.setNicNames(new ArrayList<>(nicNamePciAddressMap.keySet())); + } + + if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { + msg.setBondMode(refVO.getBondMode()); + } + } + + private void validateH3cTenantStatus(String l3NetworkUuid, String sdnControllerUuid) { + String l2NetworkUuid = Q.New(L3NetworkVO.class) + .eq(L3NetworkVO_.uuid, l3NetworkUuid) + .select(L3NetworkVO_.l2NetworkUuid) + .findValue(); + if (l2NetworkUuid == null) { + return; + } + VxlanNetworkVO vxlanVO = Q.New(VxlanNetworkVO.class) + .eq(VxlanNetworkVO_.uuid, l2NetworkUuid) + .find(); + if (vxlanVO == null) { + return; + } + HardwareL2VxlanNetworkPoolVO poolVO = Q.New(HardwareL2VxlanNetworkPoolVO.class) + .eq(HardwareL2VxlanNetworkPoolVO_.uuid, vxlanVO.getPoolUuid()) + .find(); + if (vxlanVO.getPoolUuid() == null || poolVO == null || !sdnControllerUuid.equals(poolVO.getSdnControllerUuid())) { + return; + } + boolean hasDisabledTenants = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdnControllerUuid) + .eq(H3cSdnControllerTenantVO_.state, SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE) + .isExists(); + if (hasDisabledTenants) { + throw new ApiMessageInterceptionException(argerr("Cannot attach L3 network to VM because some tenants in SDN controller[uuid:%s] have been deleted. " + + "Please run tenant synchronization first to update tenant status", sdnControllerUuid)); + } + } + + private void validate(APIPullSdnControllerTenantMsg msg) { + SdnControllerVO sdnControllerVO = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); + if (sdnControllerVO == null) { + throw new ApiMessageInterceptionException(argerr("SDN controller[uuid:%s] not found", msg.getSdnControllerUuid())); + } + + // Only H3C_VCFC_CONTROLLER with vendorVersion H3C_VCFC_VENDOR_VERSION_V2 supports pull tenant operation + if (!SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(sdnControllerVO.getVendorType()) || + !SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(sdnControllerVO.getVendorVersion())) { + throw new ApiMessageInterceptionException(argerr("Pull tenant operation is not supported for SDN controller[uuid:%s, vendorType:%s, vendorVersion:%s]. " + + "Only H3C VCFC V2 controllers support this operation", + msg.getSdnControllerUuid(), sdnControllerVO.getVendorType(), sdnControllerVO.getVendorVersion())); + } + } + + private void validateVlanRanges(List ranges) { + List sdnVlanRanges = new ArrayList<>(); + for (String range : ranges) { + List vlans = Arrays.asList(range.split("-")); + if (vlans.size() != 2) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is not in the correct format", range)); + } + + try { + int start = Integer.parseInt(vlans.get(0)); + int end = Integer.parseInt(vlans.get(1)); + if (start > end) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is not in the correct format", range)); + } + + for (SdnVlanRange vrange : sdnVlanRanges) { + if (isOverlappedVlanRange(start, end, vrange.startVlan, vrange.endVlan)) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is overlapped with other vlan range", range)); + } + } + SdnVlanRange vlanRange = new SdnVlanRange(); + vlanRange.startVlan = start; + vlanRange.endVlan = end; + sdnVlanRanges.add(vlanRange); + } catch (Exception e) { + throw new ApiMessageInterceptionException(argerr("could not change sdn controller, " + + "because vlan range[%s] is not in the correct format", range)); + } + } + } + + private boolean isOverlappedVlanRange(int start, int end, Integer startVlan, Integer endVlan) { + // Two ranges [start, end] and [startVlan, endVlan] overlap if: + // 1. start is within [startVlan, endVlan], OR + // 2. end is within [startVlan, endVlan], OR + // 3. [start, end] completely contains [startVlan, endVlan] + return (start >= startVlan && start <= endVlan) || + (end >= startVlan && end <= endVlan) || + (start <= startVlan && end >= endVlan); + } + + private void validate(APIChangeSdnControllerMsg msg) { + if (msg.getVlanRanges() != null && !msg.getVlanRanges().isEmpty()) { + validateVlanRanges(msg.getVlanRanges()); } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java new file mode 100644 index 00000000000..f4733f6a833 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerBase.java @@ -0,0 +1,1215 @@ +package org.zstack.sdnController; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.Platform; +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cascade.CascadeConstant; +import org.zstack.core.cascade.CascadeFacade; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.cloudbus.EventFacade; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.Completion; +import org.zstack.header.core.NopeCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; +import org.zstack.header.message.APIDeleteMessage; +import org.zstack.header.message.MessageReply; +import org.zstack.header.network.l2.DeleteL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.l3.SdnControllerL3; +import org.zstack.header.network.sdncontroller.*; +import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO; +import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO_; +import org.zstack.sdnController.header.*; +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands; +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2SdnController; +import org.zstack.tag.SystemTagCreator; +import org.zstack.utils.Utils; +import org.zstack.utils.gson.JSONObjectUtil; +import org.zstack.utils.logging.CLogger; + +import javax.persistence.Tuple; +import java.lang.reflect.Type; +import java.util.*; +import java.util.stream.Collectors; + +import static java.util.Arrays.asList; +import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; +import static org.zstack.sdnController.header.SdnControllerFlowDataParam.SDN_CONTROLLER_UUID; +import static org.zstack.sdnController.header.SdnControllerFlowDataParam.*; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class SdnControllerBase { + private static final CLogger logger = Utils.getLogger(SdnControllerBase.class); + @Autowired + CloudBus bus; + @Autowired + DatabaseFacade dbf; + @Autowired + private CascadeFacade casf; + @Autowired + private ThreadFacade thdf; + @Autowired + private EventFacade evtf; + @Autowired + SdnControllerManager sdnMgr; + @Autowired + private PluginRegistry pluginRgty; + @Autowired + private SdnControllerPingTracker sdnPingTracker; + + public SdnControllerVO self; + + public SdnControllerBase(SdnControllerVO self) { + this.self = self; + } + + public String getSdnControllerSignature() { + return "sdn-controller-" + self.getUuid(); + } + + protected SdnController getSdnController() { + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + return factory.getSdnController(self); + } + + protected SdnControllerL2 getSdnControllerL2() { + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + return factory.getSdnControllerL2(self); + } + + protected SdnControllerL3 getSdnControllerL3() { + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + return factory.getSdnControllerL3(self); + } + + public void handleMessage(SdnControllerMessage msg) { + if (msg instanceof APIRemoveSdnControllerMsg) { + handle((APIRemoveSdnControllerMsg) msg); + } else if (msg instanceof APIUpdateSdnControllerMsg) { + handle((APIUpdateSdnControllerMsg) msg); + } else if (msg instanceof SdnControllerDeletionMsg) { + handle((SdnControllerDeletionMsg) msg); + } else if (msg instanceof APISdnControllerAddHostMsg) { + handle((APISdnControllerAddHostMsg) msg); + } else if (msg instanceof APISdnControllerRemoveHostMsg) { + handle((APISdnControllerRemoveHostMsg) msg); + } else if (msg instanceof APIReconnectSdnControllerMsg) { + handle((APIReconnectSdnControllerMsg) msg); + } else if (msg instanceof APISdnControllerChangeHostMsg) { + handle((APISdnControllerChangeHostMsg) msg); + } else if (msg instanceof APIPullSdnControllerTenantMsg) { + handle((APIPullSdnControllerTenantMsg) msg); + } else if (msg instanceof APIChangeSdnControllerMsg) { + handle((APIChangeSdnControllerMsg) msg); + } else if (msg instanceof SdnControllerRemoveHostMsg) { + handle((SdnControllerRemoveHostMsg) msg); + } else if (msg instanceof PullSdnControllerTenantMsg) { + handle((PullSdnControllerTenantMsg) msg); + } else if (msg instanceof ReconnectSdnControllerMsg) { + handle((ReconnectSdnControllerMsg) msg); + } else { + SdnController controller = getSdnController(); + controller.handleMessage(msg); + } + } + + public void changeSdnControllerStatus(SdnControllerStatus status) { + if (status == self.getStatus()) { + return; + } + + SdnControllerStatus oldStatus = self.getStatus(); + logger.debug(String.format("sdn controller [%s] changed status, old status: [%s], new status: [%s]", + self.getUuid(), oldStatus, status.toString())); + self.setStatus(status); + self = dbf.updateAndRefresh(self); + + SdnControllerCanonicalEvents.SdnControllerStatusChangedData d = new SdnControllerCanonicalEvents.SdnControllerStatusChangedData(); + d.setSdnControllerUuid(self.getUuid()); + d.setSdnControllerType(self.getVendorType()); + d.setOldStatus(oldStatus.toString()); + d.setNewStatus(status.toString()); + d.setInv(SdnControllerInventory.valueOf(self)); + evtf.fire(SdnControllerCanonicalEvents.SDNCONTROLLER_STATUS_CHANGED_PATH, d); + } + + private void doChangeSdnController(APIChangeSdnControllerMsg msg, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("change-sdn-controller-%s-%s", self.getUuid(), self.getName())); + chain.then(new Flow() { + String __name__ = "change-sdn-controller-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean changed = false; + + // Handle name change + if (msg.getUserName() != null && !msg.getUserName().equals(self.getName())) { + chain.getData().put(SDN_CONTROLLER_USERNAME, self.getName()); + self.setUsername(msg.getUserName()); + changed = true; + } + + // Handle password change + if (msg.getPassword() != null && !msg.getPassword().equals(self.getPassword())) { + chain.getData().put(SDN_CONTROLLER_PASSWORD, self.getPassword()); + self.setPassword(msg.getPassword()); + changed = true; + } + + if (changed) { + self = dbf.updateAndRefresh(self); + chain.getData().put(SDN_CONTROLLER_CHANGED, changed); + } + + if (msg.getVlanRanges() != null && !msg.getVlanRanges().isEmpty()) { + SdnControllerSystemTags.VLAN_RANGE.delete(self.getUuid()); + for (String vlanRange : msg.getVlanRanges()) { + List vlans = Arrays.asList(vlanRange.split("-")); + SystemTagCreator creator = SdnControllerSystemTags.VLAN_RANGE.newSystemTagCreator(self.getUuid()); + creator.setTagByTokens(map( + e(SdnControllerSystemTags.START_VLAN_TOKEN, vlans.get(0)), + e(SdnControllerSystemTags.END_VLAN_TOKEN, vlans.get(1)))); + creator.inherent = false; + creator.recreate = false; + creator.ignoreIfExisting = true; + creator.create(); + } + } + + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + String username = (String)chain.getData().get(SDN_CONTROLLER_USERNAME); + String password = (String)chain.getData().get(SDN_CONTROLLER_PASSWORD); + if (password != null) { + self.setPassword(password); + } + if (username != null) { + self.setUsername(username); + } + if (password != null || username != null) { + self = dbf.updateAndRefresh(self); + } + + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "ping-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + boolean changed = data.get(SDN_CONTROLLER_CHANGED) == null ? false : (boolean) data.get(SDN_CONTROLLER_CHANGED); + if (!changed) { + // password not changed + trigger.next(); + return; + } + + SdnControllerPingMsg pmsg = new SdnControllerPingMsg(); + pmsg.setSdnControllerUuid(self.getUuid()); + bus.makeTargetServiceIdByResourceUuid(pmsg, SdnControllerConstant.SERVICE_ID, self.getUuid()); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(operr("ping sdn controller failed, error: %s", reply.getError().getDetails())); + } else { + trigger.next(); + } + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void changeSdnController(APIChangeSdnControllerMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + doChangeSdnController(msg, new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("change-sdn-controller-%s", self.getUuid()); + } + }); + } + + private void handle(APIChangeSdnControllerMsg msg) { + APIChangeSdnControllerEvent event = new APIChangeSdnControllerEvent(msg.getId()); + changeSdnController(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(APIReconnectSdnControllerMsg msg) { + APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(msg.getId()); + reconnectSdnController(new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(ReconnectSdnControllerMsg msg) { + ReconnectSdnControllerReply reply = new ReconnectSdnControllerReply(); + reconnectSdnController(new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void reconnectSdnController(Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + doReconnectSdnController(new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("reconnect-sdn-controller-%s", self.getUuid()); + } + }); + } + + private void doReconnectSdnController(Completion completion) { + FlowChain chain = sdnMgr.getSyncChain(self); + chain.getData().put(SDN_CONTROLLER_UUID, self.getUuid()); + chain.setName(String.format("sync-sdn-controller-%s-%s", self.getUuid(), self.getName())); + chain.insert(new Flow() { + String __name__ = "change-sdn-controller-status-to-connecting"; + + @Override + public void run(FlowTrigger trigger, Map data) { + changeSdnControllerStatus(SdnControllerStatus.Connecting); + trigger.next(); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + changeSdnControllerStatus(SdnControllerStatus.Disconnected); + trigger.rollback(); + } + }).then(new NoRollbackFlow() { + String __name__ = "reconnect-to-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SdnController controller = getSdnController(); + controller.reconnectSdnController(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "change-sdn-controller-status-to-connected"; + + @Override + public void run(FlowTrigger trigger, Map data) { + changeSdnControllerStatus(SdnControllerStatus.Connected); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void sdnControllerAddHost(APISdnControllerAddHostMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + SdnControllerHostRefVO refvo = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()) + .eq(SdnControllerHostRefVO_.vtepIp, msg.getVtepIp()).find(); + if (refvo != null) { + completion.fail(argerr("could not add host[uuid:%s] to sdn controller[uuid:%s], " + + " because vtepip is used by host[uuid:%s]", msg.getHostUuid(), + msg.getSdnControllerUuid(), refvo.getHostUuid())); + return; + } + + SdnController controller = getSdnController(); + controller.addHost(msg, new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("sdn-controller-%s-add-host-%s", + self.getUuid(), msg.getHostUuid()); + } + }); + } + + private void handle(APISdnControllerAddHostMsg msg) { + APISdnControllerAddHostEvent event = new APISdnControllerAddHostEvent(msg.getId()); + sdnControllerAddHost(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void sdnControllerRemoveHost(SdnControllerRemoveHostMsg msg, Completion completion) { + SdnController controller = getSdnController(); + controller.removeHost(msg, new Completion(completion) { + @Override + public void success() { + SQL.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()) + .eq(SdnControllerHostRefVO_.vSwitchType, msg.getvSwitchType()).delete(); + self = dbf.reload(self); + completion.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void sdnControllerRemoveHostInQueue(SdnControllerRemoveHostMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + sdnControllerRemoveHost(msg, new Completion(completion) { + @Override + public void success() { + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("sdn-controller-%s-remove-host-%s", + self.getUuid(), msg.getHostUuid()); + } + }); + } + + private void handle(APISdnControllerRemoveHostMsg amsg) { + APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(amsg.getId()); + + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(amsg.getSdnControllerUuid()); + msg.setHostUuid(amsg.getHostUuid()); + msg.setvSwitchType(amsg.getvSwitchType()); + sdnControllerRemoveHostInQueue(msg, new Completion(msg) { + @Override + public void success() { + event.setInventory(SdnControllerInventory.valueOf(dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class))); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(SdnControllerRemoveHostMsg msg) { + SdnControllerRemoveHostReply reply = new SdnControllerRemoveHostReply(); + + if (msg.isCreateChain()) { + sdnControllerRemoveHostInQueue(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } else { + sdnControllerRemoveHost(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + } + + private void doControllerChangeHost(APISdnControllerChangeHostMsg msg, Completion completion) { + thdf.chainSubmit(new ChainTask(completion) { + @Override + public String getSyncSignature() { + return getSdnControllerSignature(); + } + + @Override + public void run(SyncTaskChain chain) { + SdnControllerHostRefVO newRef = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .eq(SdnControllerHostRefVO_.hostUuid, msg.getHostUuid()).find(); + SdnControllerHostRefVO oldRef = SdnControllerHostRefVO.fromOther(newRef); + + boolean changed = false; + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + Map nicNamePciAddressMap = gson.fromJson(newRef.getNicPciAddresses(), type); + List oldNicNames = new ArrayList<>(nicNamePciAddressMap.keySet()); + Collections.sort(oldNicNames); + Collections.sort(msg.getNicNames()); + if (!oldNicNames.equals(msg.getNicNames())) { + changed = true; + Map nicNameDriverMap = new HashMap<>(); + nicNamePciAddressMap = new HashMap<>(); + List nicTuples = Q.New(HostNetworkInterfaceVO.class) + .eq(HostNetworkInterfaceVO_.hostUuid, msg.getHostUuid()) + .in(HostNetworkInterfaceVO_.interfaceName, msg.getNicNames()) + .select(HostNetworkInterfaceVO_.interfaceName, + HostNetworkInterfaceVO_.driverType, + HostNetworkInterfaceVO_.pciDeviceAddress) + .listTuple(); + for (Tuple t : nicTuples) { + nicNameDriverMap.put(t.get(0, String.class), t.get(1, String.class)); + nicNamePciAddressMap.put(t.get(0, String.class), t.get(2, String.class)); + } + newRef.setNicDrivers(JSONObjectUtil.toJsonString(nicNameDriverMap)); + newRef.setNicPciAddresses(JSONObjectUtil.toJsonString(nicNamePciAddressMap)); + } + + if (msg.getVtepIp() != null && !msg.getVtepIp().equals(newRef.getVtepIp())) { + changed = true; + newRef.setVtepIp(msg.getVtepIp()); + } + + if (msg.getNetmask() != null && !msg.getNetmask().equals(newRef.getNetmask())) { + changed = true; + newRef.setNetmask(msg.getNetmask()); + } + + if (msg.getBondMode() != null && !msg.getBondMode().equals(newRef.getBondMode())) { + changed = true; + newRef.setBondMode(msg.getBondMode()); + } + + if (msg.getLacpMode() != null && !msg.getLacpMode().equals(newRef.getLacpMode())) { + changed = true; + newRef.setLacpMode(msg.getLacpMode()); + } + + if (!changed) { + completion.success(); + chain.next(); + return; + } + + SdnController controller = getSdnController(); + controller.changeHost(oldRef, newRef, new Completion(msg) { + @Override + public void success() { + dbf.update(newRef); + completion.success(); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("sdn-controller-%s-change-host-%s", + self.getUuid(), msg.getHostUuid()); + } + }); + } + + private void handle(APISdnControllerChangeHostMsg msg) { + APISdnControllerChangeHostEvent event = new APISdnControllerChangeHostEvent(msg.getId()); + doControllerChangeHost(msg, new Completion(msg) { + @Override + public void success() { + self = dbf.reload(self); + event.setInventory(SdnControllerInventory.valueOf(self)); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void doDeletionSdnController(SdnControllerDeletionMsg msg, Completion completion) { + SdnController controller = getSdnController(); + + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("sdn-controller-deletion-%s", msg.getSdnControllerUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = String.format("detach-hardvxlan-network-of-sdn-controller-%s", self.getName()); + + @Override + public void run(FlowTrigger trigger, Map data) { + List poolVos = Q.New(HardwareL2VxlanNetworkPoolVO.class) + .eq(HardwareL2VxlanNetworkPoolVO_.sdnControllerUuid, msg.getSdnControllerUuid()).list(); + new While<>(poolVos).each((pool, wcomp) -> { + DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); + msg.setUuid(pool.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, pool.getUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.info(String.format("delete hardware vxpool[uuid:%s] failed, reason:%s", pool.getUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-sdn-network"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SdnControllerL2 sdnControllerL2 = getSdnControllerL2(); + List l2Tuples = sdnControllerL2.getL2NetworkOfSdnController(); + List l2Uuids = l2Tuples.stream().map(t -> t.get(0, String.class)).collect(Collectors.toList()); + if (l2Uuids.isEmpty()) { + trigger.next(); + return; + } + + new While<>(l2Uuids).each((uuid, wcomp) -> { + DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); + msg.setUuid(uuid); + bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.info(String.format("delete sdn l2 network[uuid:%s] failed, reason:%s", uuid, reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "remove-host-from-sdn-controller"; + @Override + public void run(FlowTrigger trigger, Map data) { + List refVOS = Q.New(SdnControllerHostRefVO.class) + .eq(SdnControllerHostRefVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + if (refVOS.isEmpty()) { + trigger.next(); + return; + } + + new While<>(refVOS).each((ref, wcomp) -> { + SdnControllerRemoveHostMsg msg = new SdnControllerRemoveHostMsg(); + msg.setSdnControllerUuid(ref.getSdnControllerUuid()); + msg.setHostUuid(ref.getHostUuid()); + msg.setvSwitchType(ref.getvSwitchType()); + msg.setCreateChain(false); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, ref.getSdnControllerUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.debug(String.format("delete host [uuid:%s] from sdn controller[uuid:%s] failed, error:%s", + msg.getHostUuid(), msg.getSdnControllerUuid(), reply.getError().getDetails())); + } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = String.format("delete-network-service"); + + @Override + public void run(FlowTrigger trigger, Map data) { + List exps = pluginRgty.getExtensionList(SdnControllerDeleteExtensionPoint.class); + new While<>(exps).each((exp, wcomp) -> { + exp.deleteNetworkServiceOfSdnController(msg.getSdnControllerUuid(), new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("delete network service failed, error: %s", errorCode.getDetails())); + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = String.format("delete-from-sdn-controller"); + + @Override + public void run(FlowTrigger trigger, Map data) { + controller.deleteSdnController(msg, SdnControllerInventory.valueOf(self), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-sdn-controller-on-db"; + @Override + public void run(FlowTrigger trigger, Map data) { + sdnPingTracker.untrack(msg.getSdnControllerUuid()); + dbf.removeByPrimaryKey(msg.getSdnControllerUuid(), SdnControllerVO.class); + trigger.next(); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void handle(SdnControllerDeletionMsg msg) { + SdnControllerDeletionReply reply = new SdnControllerDeletionReply(); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return String.format("sdn-controller-%s", msg.getSdnControllerUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + doDeletionSdnController(msg, new Completion(msg) { + @Override + public void success() { + bus.reply(msg, reply); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("delete-sdn-controller-%s", msg.getSdnControllerUuid()); + } + }); + } + + private void handle(APIRemoveSdnControllerMsg msg) { + APIRemoveSdnControllerEvent event = new APIRemoveSdnControllerEvent(msg.getId()); + + final String issuer = SdnControllerVO.class.getSimpleName(); + SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); + final List ctx = asList(SdnControllerInventory.valueOf(vo)); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-sdn-controller-%s-name-%s", msg.getUuid(), vo.getName())); + if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_CHECK_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } else { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_FORCE_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } + + chain.done(new FlowDoneHandler(msg) { + @Override + public void handle(Map data) { + casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); + bus.publish(event); + } + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + event.setError(errCode); + bus.publish(event); + } + }).start(); + } + + private void handle(APIUpdateSdnControllerMsg msg) { + APIUpdateSdnControllerEvent event = new APIUpdateSdnControllerEvent(msg.getId()); + SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); + Boolean changed = false; + + if (msg.getName() != null && !msg.getName().equals(vo.getName())) { + vo.setName(msg.getName()); + changed = true; + } + + if (msg.getDescription() != null && !msg.getDescription().equals(vo.getDescription())) { + vo.setDescription(msg.getDescription()); + changed = true; + } + + if (changed) { + vo = dbf.updateAndRefresh(vo); + } + + event.setInventory(SdnControllerInventory.valueOf(vo)); + bus.publish(event); + } + + private void handle(APIPullSdnControllerTenantMsg amsg) { + APIPullSdnControllerTenantEvent event = new APIPullSdnControllerTenantEvent(amsg.getId()); + + PullSdnControllerTenantMsg msg = PullSdnControllerTenantMsg.fromApi(amsg); + pullSdnControllerTenant(msg, new Completion(msg) { + @Override + public void success() { + // After synchronization is complete, query and return the latest tenant data + List tenantVOs = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + List inventories = H3cSdnControllerTenantInventory.valueOf(tenantVOs); + event.setInventories(inventories); + bus.publish(event); + } + + @Override + public void fail(ErrorCode errorCode) { + event.setError(errorCode); + bus.publish(event); + } + }); + } + + private void handle(PullSdnControllerTenantMsg msg) { + PullSdnControllerTenantReply reply = new PullSdnControllerTenantReply(); + + pullSdnControllerTenant(msg, new Completion(msg) { + @Override + public void success() { + // After synchronization is complete, query and return the latest tenant data + List tenantVOs = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, msg.getSdnControllerUuid()) + .list(); + List inventories = H3cSdnControllerTenantInventory.valueOf(tenantVOs); + reply.setInventories(inventories); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void pullSdnControllerTenant(PullSdnControllerTenantMsg msg, Completion completion) { + // Only H3C VCFC V2 controllers support this operation, already validated in interceptor + // But confirm again here to ensure type safety + if (!SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(self.getVendorType()) || + !SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(self.getVendorVersion())) { + completion.fail(operr("Pull tenant operation is only supported for H3C VCFC V2 controllers")); + return; + } + + // Get the correct controller instance through factory + SdnControllerFactory factory = sdnMgr.getSdnControllerFactory(self.getVendorType()); + H3cVcfcV2SdnController h3cController = (H3cVcfcV2SdnController) factory.getSdnController(self); + + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("pull-tenant-for-h3c-sdn-%s", self.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "pull-h3c-vds-tenant"; + + @Override + public void run(FlowTrigger trigger, Map data) { + try { + // Directly get all tenant information + h3cController.getH3cControllerToken(new Completion(trigger) { + @Override + public void success() { + List apiTenants = h3cController.getAllH3cTenants(); + List apiVds = h3cController.getAllH3cVds(); + syncTenantData(msg.getSdnControllerUuid(), apiTenants, apiVds, trigger); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } catch (Exception e) { + trigger.fail(operr("Failed to pull tenant data: %s", e.getMessage())); + } + } + }).then(new NoRollbackFlow() { + String __name__ = "pull-h3c-vni-ranges"; + + @Override + public void run(FlowTrigger trigger, Map data) { + h3cController.getH3cVniRanges(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void syncTenantData(String sdnControllerUuid, List apiTenants, List apiVds, FlowTrigger trigger) { + // Check if API response is valid (non-empty list indicates valid response with default tenant) + if (apiTenants == null || apiTenants.isEmpty()) { + logger.warn(String.format("Failed to pull tenant data for sdn controller [%s], no tenant data returned by API", sdnControllerUuid)); + trigger.next(); + return; + } + + // Query existing tenant records in database + List existingTenants = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdnControllerUuid) + .list(); + + // Create mapping table for easy lookup + Map existingTenantMap = new HashMap<>(); + for (H3cSdnControllerTenantVO tenant : existingTenants) { + String key = generateTenantKey(tenant.getTenantUuid(), tenant.getVdsUuid()); + existingTenantMap.put(key, tenant); + } + + Set apiTenantKeys = new HashSet<>(); + List tenantsToSave = new ArrayList<>(); + + // Process tenant data returned by API + for (H3cVcfcV2Commands.H3cTenantStruct apiTenant : apiTenants) { + if (apiTenant.vds_list != null && !apiTenant.vds_list.isEmpty()) { + String vdsUuid = apiTenant.vds_list.get(0); + String key = generateTenantKey(apiTenant.id, vdsUuid); + apiTenantKeys.add(key); + + H3cSdnControllerTenantVO existingTenant = existingTenantMap.get(key); + if (existingTenant == null) { + // New tenant, create record + H3cSdnControllerTenantVO newTenant = new H3cSdnControllerTenantVO(); + newTenant.setUuid(Platform.getUuid()); + newTenant.setSdnControllerUuid(sdnControllerUuid); + newTenant.setTenantUuid(apiTenant.id); + newTenant.setVdsUuid(vdsUuid); + newTenant.setTenantName(apiTenant.name); + // Find vdsName from apiVds, use vdsUuid as fallback + String vdsName = vdsUuid; + for (H3cVcfcV2Commands.H3cVdsStruct vds : apiVds) { + if (Objects.equals(vds.uuid, vdsUuid) && vds.name != null) { + vdsName = vds.name; + break; + } + } + newTenant.setVdsName(vdsName); + newTenant.setCloudDomainName(apiTenant.cloud_domain_name); + newTenant.setState(SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE); + tenantsToSave.add(newTenant); + } else { + // Existing tenant, check if update is needed + boolean needUpdate = false; + if (!Objects.equals(existingTenant.getTenantName(), apiTenant.name)) { + existingTenant.setTenantName(apiTenant.name); + needUpdate = true; + } + if (!Objects.equals(existingTenant.getCloudDomainName(), apiTenant.cloud_domain_name)) { + existingTenant.setCloudDomainName(apiTenant.cloud_domain_name); + needUpdate = true; + } + // Ensure tenants found in API response are marked as enabled + if (!SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE.equals(existingTenant.getState())) { + existingTenant.setState(SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE); + needUpdate = true; + } + if (needUpdate) { + tenantsToSave.add(existingTenant); + } + } + } + } + + // Handle tenants that exist in database but not in API (soft delete) + for (H3cSdnControllerTenantVO existingTenant : existingTenants) { + String key = generateTenantKey(existingTenant.getTenantUuid(), existingTenant.getVdsUuid()); + if (!apiTenantKeys.contains(key) && !SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE.equals(existingTenant.getState())) { + existingTenant.setState(SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_DISABLE); + tenantsToSave.add(existingTenant); + } + } + + // Batch save updates + if (!tenantsToSave.isEmpty()) { + dbf.updateCollection(tenantsToSave); + } + + trigger.next(); + } + + private String generateTenantKey(String tenantUuid, String vdsUuid) { + return String.format("%s-%s", tenantUuid != null ? tenantUuid : "", vdsUuid != null ? vdsUuid : ""); + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java index a6771f22749..6c25dcaddb9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerFactory.java @@ -1,9 +1,31 @@ package org.zstack.sdnController; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.network.l3.SdnControllerL3; +import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; +import org.zstack.header.network.sdncontroller.SdnControllerVO; public interface SdnControllerFactory { SdnControllerType getVendorType(); + SdnControllerVO persistSdnController(SdnControllerVO vo); + SdnController getSdnController(SdnControllerVO vo); + + default SdnController getSdnController(String l2NetworkUuid) {return null;}; + + SdnControllerL2 getSdnControllerL2(SdnControllerVO vo); + default SdnControllerL2 getSdnControllerL2(String l2NetworkUuid) {return null;}; + + default SdnControllerL3 getSdnControllerL3(SdnControllerVO vo) {return null;}; + + SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo); + + + default SdnControllerDhcp getSdnControllerDhcp(SdnControllerVO vo) {return null;}; + default SdnControllerDhcp getSdnControllerDhcp(String l2NetworkUuid) {return null;}; + + default FlowChain getSyncChain() {return FlowChainBuilder.newSimpleFlowChain();}; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java new file mode 100644 index 00000000000..0b6a081c454 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerGlobalConfig.java @@ -0,0 +1,21 @@ +package org.zstack.sdnController; + +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigDef; +import org.zstack.core.config.GlobalConfigDefinition; +import org.zstack.core.config.GlobalConfigValidation; + +/** + */ +@GlobalConfigDefinition +public class SdnControllerGlobalConfig { + public static final String CATEGORY = "sdnController"; + + @GlobalConfigValidation(numberGreaterThan = 1) + @GlobalConfigDef(defaultValue = "60", type = Long.class, description = "The interval management server sends ping command to sdn controller, in seconds") + public static GlobalConfig PING_INTERVAL = new GlobalConfig(CATEGORY, "ping.interval"); + + @GlobalConfigValidation(numberGreaterThan = 0, numberLessThan = 100) + @GlobalConfigDef(defaultValue = "5", type = Long.class, description = "The max number of management server sends ping commands to sdn controller in parallel") + public static GlobalConfig PING_PARALLELISM_DEGREE = new GlobalConfig(CATEGORY, "ping.parallelismDegree"); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java new file mode 100644 index 00000000000..502efb5f21f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerL2.java @@ -0,0 +1,44 @@ +package org.zstack.sdnController; + +import org.zstack.header.core.Completion; +import org.zstack.header.host.HostInventory; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.vm.VmNicInventory; +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerDeletionMsg; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.sdnController.header.SdnVlanRange; +import org.zstack.sdnController.header.SdnVniRange; + +import javax.persistence.Tuple; +import java.util.ArrayList; +import java.util.List; + +public interface SdnControllerL2 { + void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion); + void postCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + + void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, List systemTags, Completion completion); + default void attachL2NetworkToHosts(L2VxlanNetworkInventory vxlan, List hinvs, List systemTags, Completion completion) {completion.success();}; + void postAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + + void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInventory sdn, Completion completion); + void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, Completion completion); + void deleteL2Network(L2NetworkInventory inv, Completion completion); + + List getVniRange(SdnControllerInventory controller); + List getVlanRange(SdnControllerInventory controller); + + default List getL2NetworkOfSdnController() { return new ArrayList<>();}; + + default void addVmNics(List nics, Completion completion) {completion.success();}; + default void removeVmNics(List nics, Completion completion) {completion.success();}; + + default void addL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) {completion.success();}; + default void deleteL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) {completion.success();}; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java index 6f89f601c47..8eb382d76bc 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerLogAspect.java @@ -9,9 +9,9 @@ import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.sdnController.header.APIAddSdnControllerMsg; -import org.zstack.sdnController.header.SdnControllerConstant.Processes; -import org.zstack.sdnController.header.SdnControllerConstant.Operations; -import org.zstack.sdnController.header.SdnControllerConstant.ResourceTypes; +import org.zstack.header.network.sdncontroller.SdnControllerConstant.Processes; +import org.zstack.header.network.sdncontroller.SdnControllerConstant.Operations; +import org.zstack.header.network.sdncontroller.SdnControllerConstant.ResourceTypes; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java index 2c99c296cdd..b2a5633bed2 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManager.java @@ -1,9 +1,15 @@ package org.zstack.sdnController; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.core.workflow.FlowChain; +import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.header.network.sdncontroller.SdnControllerVO; public interface SdnControllerManager { SdnControllerFactory getSdnControllerFactory(String type); SdnController getSdnController(SdnControllerVO sdnControllerVO); + SdnControllerL2 getSdnControllerL2(SdnControllerVO sdnControllerVO); + SdnControllerDhcp getSdnControllerDhcp(String l3Uuid); + + FlowChain getSyncChain(SdnControllerVO sdnControllerVO); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java index 059e781ecb4..c9e939b63f4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java @@ -1,46 +1,55 @@ package org.zstack.sdnController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; -import org.zstack.core.cascade.CascadeConstant; -import org.zstack.core.cascade.CascadeFacade; import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; -import org.zstack.core.db.Q; -import org.zstack.core.thread.ChainTask; -import org.zstack.core.thread.SyncTaskChain; -import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.AbstractService; import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.WhileDoneCompletion; -import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.Message; -import org.zstack.header.message.MessageReply; +import org.zstack.header.network.NetworkException; import org.zstack.header.network.l2.*; +import org.zstack.header.network.l3.*; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.SdnControllerL3; +import org.zstack.header.network.sdncontroller.*; +import org.zstack.header.network.service.GetSdnControllerExtensionPoint; +import org.zstack.header.network.service.SdnControllerDhcp; +import org.zstack.header.vm.*; +import org.zstack.network.l2.L2NetworkSystemTags; +import org.zstack.network.l3.L3NetworkHelper; +import org.zstack.network.securitygroup.SecurityGroupGetSdnBackendExtensionPoint; +import org.zstack.network.securitygroup.SecurityGroupManager; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.header.*; import org.zstack.tag.TagManager; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; -import static java.util.Arrays.asList; +import static org.zstack.core.Platform.operr; -public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager { +public class SdnControllerManagerImpl extends AbstractService implements SdnControllerManager, + L2NetworkCreateExtensionPoint, L2NetworkDeleteExtensionPoint, InstantiateResourceOnAttachingNicExtensionPoint, + PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, + ReleaseNetworkServiceOnDetachingNicExtensionPoint, SecurityGroupGetSdnBackendExtensionPoint, + AfterAddIpRangeExtensionPoint, IpRangeDeletionExtensionPoint, GetSdnControllerExtensionPoint { private static final CLogger logger = Utils.getLogger(SdnControllerManagerImpl.class); + private static final Logger log = LoggerFactory.getLogger(SdnControllerManagerImpl.class); @Autowired private CloudBus bus; @@ -51,9 +60,9 @@ public class SdnControllerManagerImpl extends AbstractService implements SdnCont @Autowired private TagManager tagMgr; @Autowired - private CascadeFacade casf; + private SecurityGroupManager sgMgr; @Autowired - private ThreadFacade thdf; + private SdnControllerPingTracker pingTracker; private Map sdnControllerFactories = Collections.synchronizedMap(new HashMap()); @@ -71,119 +80,23 @@ public List getAliasIds() { public void handleMessage(Message msg) { if (msg instanceof APIAddSdnControllerMsg) { handle((APIAddSdnControllerMsg) msg); - } else if (msg instanceof APIRemoveSdnControllerMsg) { - handle((APIRemoveSdnControllerMsg) msg); - } else if (msg instanceof APIUpdateSdnControllerMsg) { - handle((APIUpdateSdnControllerMsg) msg); - } else if (msg instanceof SdnControllerDeletionMsg) { - handle((SdnControllerDeletionMsg) msg); + } else if (msg instanceof SdnControllerMessage) { + handleSdnControllerMessage((SdnControllerMessage) msg); + } else { + bus.dealWithUnknownMessage(msg); } } - private void doDeletionSdnController(SdnControllerDeletionMsg msg, Completion completion) { + private void handleSdnControllerMessage(SdnControllerMessage msg) { SdnControllerVO vo = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class); - SdnControllerInventory sdn = SdnControllerInventory.valueOf(vo); - - SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); - SdnController controller = factory.getSdnController(vo); - - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); - chain.setName(String.format("sdn-controller-deletion-%s", msg.getSdnControllerUuid())); - chain.then(new NoRollbackFlow() { - String __name__ = String.format("detach-hardvxlan-network-of-sdn-controller-%s", vo.getName()); - - @Override - public void run(FlowTrigger trigger, Map data) { - List poolVos = Q.New(HardwareL2VxlanNetworkPoolVO.class) - .eq(HardwareL2VxlanNetworkPoolVO_.sdnControllerUuid, msg.getSdnControllerUuid()).list(); - new While<>(poolVos).all((pool, wcomp) -> { - DeleteL2NetworkMsg msg = new DeleteL2NetworkMsg(); - msg.setUuid(pool.getUuid()); - bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, pool.getUuid()); - bus.send(msg, new CloudBusCallBack(wcomp) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.info(String.format("delete hardware vxpool[uuid:%s] failed, reason:%s", pool.getUuid(), reply.getError().getDetails())); - } - wcomp.done(); - } - }); - }).run(new WhileDoneCompletion(trigger) { - @Override - public void done(ErrorCodeList errorCodeList) { - trigger.next(); - } - }); - } - }).then(new NoRollbackFlow() { - String __name__ = String.format("delete-sdn-controller-%s", vo.getName()); - - @Override - public void run(FlowTrigger trigger, Map data) { - controller.deleteSdnController(msg, sdn, new Completion(completion) { - @Override - public void success() { - completion.success(); - } - - @Override - public void fail(ErrorCode errorCode) { - completion.fail(errorCode); - } - }); - } - }).then(new NoRollbackFlow() { - String __name__ = "delete-sdn-controller-on-db"; - @Override - public void run(FlowTrigger trigger, Map data) { - dbf.removeByPrimaryKey(msg.getSdnControllerUuid(), SdnControllerVO.class); - trigger.next(); - } - }).done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - completion.success(); - } - }).error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }).start(); - } - - private void handle(SdnControllerDeletionMsg msg) { - SdnControllerDeletionReply reply = new SdnControllerDeletionReply(); - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return String.format("sdn-controller-%s", msg.getSdnControllerUuid()); - } - - @Override - public void run(SyncTaskChain chain) { - doDeletionSdnController(msg, new Completion(msg) { - @Override - public void success() { - bus.reply(msg, reply); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - reply.setError(errorCode); - bus.reply(msg, reply); - chain.next(); - } - }); - } + if (vo == null) { + String err = String.format("Cannot find Sdn controller[uuid:%s], it may have been deleted", msg.getSdnControllerUuid()); + bus.replyErrorByMessageType((Message) msg, err); + return; + } - @Override - public String getName() { - return String.format("attach-sdn-controller-%s", msg.getSdnControllerUuid()); - } - }); + SdnControllerBase sdnController = new SdnControllerBase(vo); + sdnController.handleMessage(msg); } private void doCreateSdnController(SdnControllerVO vo, APIAddSdnControllerMsg msg, Completion completion) { @@ -202,6 +115,7 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { + msg.setResourceUuid(vo.getUuid()); controller.preInitSdnController(msg, new Completion(trigger) { @Override public void success() { @@ -220,13 +134,23 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - dbf.persist(vo); - trigger.next(); + controller.createSdnControllerDb(msg, vo, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.debug(String.format("create sdn controller db error: %s", errorCode.getDetails())); + trigger.fail(errorCode); + } + }); } @Override public void rollback(FlowRollback trigger, Map data) { - dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + controller.deleteSdnControllerDb(vo); trigger.rollback(); } }); @@ -235,16 +159,16 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - controller.initSdnController(msg, new Completion(completion) { + controller.initSdnController(msg, new Completion(trigger) { @Override public void success() { - completion.success(); + trigger.next(); } @Override public void fail(ErrorCode errorCode) { - dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); - completion.fail(errorCode); + controller.deleteSdnControllerDb(vo); + trigger.fail(errorCode); } }); } @@ -259,7 +183,7 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - controller.postInitSdnController(msg, new Completion(trigger) { + controller.postInitSdnController(vo, new Completion(trigger) { @Override public void success() { trigger.next(); @@ -276,6 +200,7 @@ public void fail(ErrorCode errorCode) { @Override public void handle(Map data) { logger.debug(String.format("successfully create sdn controller")); + pingTracker.track(vo.getUuid()); completion.success(); } }); @@ -294,6 +219,7 @@ private void handle(APIAddSdnControllerMsg msg) { SdnControllerVO vo = new SdnControllerVO(); vo.setVendorType(msg.getVendorType()); + vo.setVendorVersion(msg.getVendorVersion() == null ? SdnControllerConstant.DEFAULT_VENDOR_VERSION : msg.getVendorVersion()); if (msg.getResourceUuid() != null) { vo.setUuid(msg.getResourceUuid()); } else { @@ -305,6 +231,12 @@ private void handle(APIAddSdnControllerMsg msg) { vo.setUsername(msg.getUserName()); vo.setPassword(msg.getPassword()); vo.setAccountUuid(msg.getSession().getAccountUuid()); + if (msg.getVendorVersion() != null) { + vo.setVendorVersion(msg.getVendorVersion()); + } else { + vo.setVendorVersion(SdnControllerConstant.DEFAULT_SDN_CONTROLLER_VERSION); + } + vo.setStatus(SdnControllerStatus.Connected); doCreateSdnController(vo, msg, new Completion(msg) { @Override @@ -322,101 +254,434 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(APIRemoveSdnControllerMsg msg) { - APIRemoveSdnControllerEvent event = new APIRemoveSdnControllerEvent(msg.getId()); + @Override + public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException { + + } + + @Override + public void postCreateL2Network(L2NetworkInventory l2Network, APICreateL2NetworkMsg msg, Completion completion) { + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.success(); + return; + } + SdnControllerVO sdnControllerVO = getSdnControllerVO(l2Network); + if (sdnControllerVO == null) { + String sdnControllerUuid = null; + List sysTags = msg.getSystemTags(); + if (sysTags == null || sysTags.isEmpty()) { + completion.fail(operr("cannot create sdn l2 network because sdn controller uuid is missing from systemTags in API message")); + return; + } + for (String systag : sysTags) { + if (L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.isMatch(systag)) { + sdnControllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByTag( + systag, L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + } + } + + if (sdnControllerUuid == null) { + completion.fail(operr("cannot create sdn l2 network because sdn controller uuid is missing from API message")); + return; + } + sdnControllerVO = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (sdnControllerVO == null) { + completion.fail(operr("cannot find sdn controller for l2 network[uuid:%s, vswitchType:%s]", + l2Network.getUuid(), l2Network.getvSwitchType())); + return; + } + } + + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + SdnControllerL2 controller = factory.getSdnControllerL2(sdnControllerVO); + controller.createL2Network(l2Network, msg, completion); + } + + @Override + public void afterCreateL2Network(L2NetworkInventory l2Network) { - final String issuer = SdnControllerVO.class.getSimpleName(); - SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); - final List ctx = asList(SdnControllerInventory.valueOf(vo)); - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); - chain.setName(String.format("delete-sdn-controller-%s-name-%s", msg.getUuid(), vo.getName())); - if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { - chain.then(new NoRollbackFlow() { + } + + @Override + public void preDeleteL2Network(L2NetworkInventory inventory) throws L2NetworkException { + + } + + @Override + public void beforeDeleteL2Network(L2NetworkInventory inventory) { + + } + + @Override + public void deleteL2Network(L2NetworkInventory inv, NoErrorCompletion completion) { + VSwitchType vSwitchType = VSwitchType.valueOf(inv.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + //hardware vxlan will go this path + completion.done(); + return; + } + + /* vswitch type: OvnDpdk will go here */ + SdnControllerFactory factory = getSdnControllerFactory(vSwitchType.getSdnControllerType()); + SdnControllerL2 controllerL2 = factory.getSdnControllerL2(inv.getUuid()); + if (controllerL2 == null) { + logger.warn(String.format("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", + inv.getUuid(), inv.getvSwitchType())); + completion.done(); + return; + } + + controllerL2.deleteL2Network(inv, new Completion(completion) { + @Override + public void success() { + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("can not found sdn controller for l2 network[uuid:%s, vswitchType:%s]", + inv.getUuid(), inv.getvSwitchType())); + completion.done(); + } + }); + } + + @Override + public void afterDeleteL2Network(L2NetworkInventory inventory) { + + } + + private void sdnAddVmNic(String sdnControllerUuid, List nics, Completion completion) { + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + if (factory == null) { + completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + return; + } + + SdnControllerL2 controller = factory.getSdnControllerL2(vo); + controller.addVmNics(nics, completion); + } + + private void sdnAddVmNics(Map> nicMaps, Completion completion) { + new While<>(nicMaps.entrySet()).each((e, wcomp) -> { + sdnAddVmNic(e.getKey(), e.getValue(), new Completion(wcomp) { @Override - public void run(final FlowTrigger trigger, Map data) { - casf.asyncCascade(CascadeConstant.DELETION_CHECK_CODE, issuer, ctx, new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); + public void success() { + wcomp.done(); } - }).then(new NoRollbackFlow() { + @Override - public void run(final FlowTrigger trigger, Map data) { - casf.asyncCascade(CascadeConstant.DELETION_DELETE_CODE, issuer, ctx, new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); } }); - } else { - chain.then(new NoRollbackFlow() { + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + completion.success(); + } else { + completion.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + + private void removeOvnLogicalPorts(String controllerUuid, List nics, Completion completion) { + SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + if (factory == null) { + completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + return; + } + + SdnControllerL2 controller = factory.getSdnControllerL2(vo); + controller.removeVmNics(nics, completion); + } + + private void removeLogicalPort(Map> nicMaps, Completion completion) { + new While<>(nicMaps.entrySet()).each((e, wcomp) -> { + removeOvnLogicalPorts(e.getKey(), e.getValue(), new Completion(wcomp) { @Override - public void run(final FlowTrigger trigger, Map data) { - casf.asyncCascade(CascadeConstant.DELETION_FORCE_DELETE_CODE, issuer, ctx, new Completion(trigger) { - @Override - public void success() { - trigger.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - trigger.fail(errorCode); - } - }); + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); } }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + completion.success(); + } else { + completion.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + + @Override + public void releaseVmResource(VmInstanceSpec spec, Completion completion) { + if (VmInstanceConstant.VmOperation.DetachNic != spec.getCurrentVmOperation() && + VmInstanceConstant.VmOperation.Destroy != spec.getCurrentVmOperation()) { + completion.success(); + return; + } + + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { + completion.success(); + return; + } + + // we run into this situation when VM nics are all detached and the + // VM is being rebooted + if (spec.getDestNics().isEmpty()) { + completion.success(); + return; + } + + Map> nicMaps = new HashMap<>(); + for (VmNicInventory nic : spec.getDestNics()) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + if (l3Vo == null) { + continue; + } + + L2NetworkVO l2VO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + if (l2VO == null) { + continue; + } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2VO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + continue; + } + + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + return; + } + + nicMaps.computeIfAbsent(controllerUuid, k -> new ArrayList<>()).add(nic); + } + + if (nicMaps.isEmpty()) { + completion.success(); + return; + } + + removeLogicalPort(nicMaps, completion); + } + + @Override + public void instantiateResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInventory l3, Completion completion) { + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.success(); + return; + } + + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + return; } - chain.done(new FlowDoneHandler(msg) { + Map> nicMaps = new HashMap<>(); + List nics = new ArrayList<>(); + nics.add(spec.getDestNics().get(0)); + nicMaps.put(controllerUuid, nics); + sdnAddVmNics(nicMaps, completion); + } + + @Override + public void releaseResourceOnAttachingNic(VmInstanceSpec spec, L3NetworkInventory l3, NoErrorCompletion completion) { + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.done(); + return; + } + + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + if (controllerUuid == null) { + logger.warn(String.format("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + completion.done(); + return; + } + + Map> nicMaps = new HashMap<>(); + List nics = new ArrayList<>(); + nics.add(spec.getDestNics().get(0)); + nicMaps.put(controllerUuid, nics); + + removeLogicalPort(nicMaps, new Completion(completion) { @Override - public void handle(Map data) { - casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); - bus.publish(event); + public void success() { + completion.done(); } - }).error(new FlowErrorHandler(msg) { + @Override - public void handle(ErrorCode errCode, Map data) { - event.setError(errCode); - bus.publish(event); + public void fail(ErrorCode errorCode) { + logger.info(String.format("failed to remove logical port for vm[uuid:%s] nic[internalName:%s], because: %s", + spec.getVmInventory().getUuid(), spec.getDestNics().get(0).getInternalName(), errorCode.getDetails())); + completion.done(); } - }).start(); + }); + } + + @Override + public void releaseResourceOnDetachingNic(VmInstanceSpec spec, VmNicInventory nic, NoErrorCompletion completion) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + L2NetworkVO l2NetworkVO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + VSwitchType vSwitchType = VSwitchType.valueOf(l2NetworkVO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() == null) { + completion.done(); + return; + } + + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2NetworkVO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + if (controllerUuid == null) { + logger.warn(String.format("sdn l2 network[uuid:%s] is not attached controller", l2NetworkVO.getUuid())); + completion.done(); + return; + } + + Map> nicMaps = new HashMap<>(); + List nics = new ArrayList<>(); + nics.add(spec.getDestNics().get(0)); + nicMaps.put(controllerUuid, nics); + + removeLogicalPort(nicMaps, new Completion(completion) { + @Override + public void success() { + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.info(String.format("failed to remove logical port for vm[uuid:%s] nic[internalName:%s], because: %s", + spec.getVmInventory().getUuid(), spec.getDestNics().get(0).getInternalName(), errorCode.getDetails())); + completion.done(); + } + }); + } + + @Override + public void preBeforeInstantiateVmResource(VmInstanceSpec spec) throws VmInstantiateResourceException { + } - private void handle(APIUpdateSdnControllerMsg msg) { - APIUpdateSdnControllerEvent event = new APIUpdateSdnControllerEvent(msg.getId()); - SdnControllerVO vo = dbf.findByUuid(msg.getUuid(), SdnControllerVO.class); - Boolean changed = false; + @Override + public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) { + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { + completion.success(); + return; + } - if (msg.getName() != null && !msg.getName().equals(vo.getName())) { - vo.setName(msg.getName()); - changed = true; + // we run into this situation when VM nics are all detached and the + // VM is being rebooted + if (spec.getDestNics().isEmpty()) { + completion.success(); + return; } - if (msg.getDescription() != null && !msg.getDescription().equals(vo.getDescription())) { - vo.setDescription(msg.getDescription()); - changed = true; + Map> nicMaps = new HashMap<>(); + for (VmNicInventory nic : spec.getDestNics()) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + if (l3Vo == null) { + continue; + } + + L2NetworkVO l2VO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + if (l2VO == null) { + continue; + } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2VO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() ==null) { + continue; + } + + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + return; + } + + nicMaps.computeIfAbsent(controllerUuid, k -> new ArrayList<>()).add(nic); } - if (changed) { - vo = dbf.updateAndRefresh(vo); + if (nicMaps.isEmpty()) { + completion.success(); + return; } - event.setInventory(SdnControllerInventory.valueOf(vo)); - bus.publish(event); + sdnAddVmNics(nicMaps, completion); + } + + @Override + public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { + if (spec.getL3Networks() == null || spec.getL3Networks().isEmpty()) { + completion.success(); + return; + } + + // we run into this situation when VM nics are all detached and the + // VM is being rebooted + if (spec.getDestNics().isEmpty()) { + completion.success(); + return; + } + + Map> nicMaps = new HashMap<>(); + for (VmNicInventory nic : spec.getDestNics()) { + L3NetworkVO l3Vo = dbf.findByUuid(nic.getL3NetworkUuid(), L3NetworkVO.class); + if (l3Vo == null) { + continue; + } + + L2NetworkVO l2VO = dbf.findByUuid(l3Vo.getL2NetworkUuid(), L2NetworkVO.class); + if (l2VO == null) { + continue; + } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2VO.getvSwitchType()); + if (vSwitchType.getSdnControllerType() ==null) { + continue; + } + + String controllerUuid = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.getTokenByResourceUuid( + l2VO.getUuid(), L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN); + if (controllerUuid == null) { + completion.fail(operr("sdn l2 network[uuid:%s] is not attached controller", l2VO.getUuid())); + return; + } + + nicMaps.computeIfAbsent(controllerUuid, k -> new ArrayList<>()).add(nic); + } + + if (nicMaps.isEmpty()) { + completion.success(); + return; + } + + removeLogicalPort(nicMaps, completion); } @Override @@ -435,6 +700,60 @@ public SdnController getSdnController(SdnControllerVO sdnControllerVO) { return factory.getSdnController(sdnControllerVO); } + @Override + public SdnControllerL2 getSdnControllerL2(SdnControllerVO sdnControllerVO) { + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + return factory.getSdnControllerL2(sdnControllerVO); + } + + @Override + public SecurityGroupSdnBackend getSecurityGroupSdnBackend(String sdnControllerUuid) { + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return null; + } + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + return factory.getSdnControllerSecurityGroup(vo); + } + + @Override + public SdnControllerDhcp getSdnControllerDhcp(String l3Uuid) { + String controllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3Uuid); + if (controllerUuid == null) { + return null; + } + + SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); + if (vo == null) { + throw new CloudRuntimeException(String.format("can not find sdn controller[uuid:%s] for l3 network[uuid:%s]", + controllerUuid, l3Uuid)); + } + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + return factory.getSdnControllerDhcp(vo); + } + + @Override + public SdnControllerL3 getSdnControllerL3(String l2Uuid) { + String controllerUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(l2Uuid); + if (controllerUuid == null) { + return null; + } + + SdnControllerVO vo = dbf.findByUuid(controllerUuid, SdnControllerVO.class); + if (vo == null) { + throw new CloudRuntimeException(String.format("can not find sdn controller[uuid:%s] for l2 network[uuid:%s]", + controllerUuid, l2Uuid)); + } + SdnControllerFactory factory = getSdnControllerFactory(vo.getVendorType()); + return factory.getSdnControllerL3(vo); + } + + @Override + public FlowChain getSyncChain(SdnControllerVO sdnControllerVO) { + SdnControllerFactory f = getSdnControllerFactory(sdnControllerVO.getVendorType()); + return f.getSyncChain(); + } + @Override public String getId() { return bus.makeLocalServiceId(SdnControllerConstant.SERVICE_ID); @@ -458,4 +777,93 @@ public boolean start() { public boolean stop() { return true; } + + + @Override + public void afterAddIpRange(IpRangeInventory ipr, List systemTags) { + L3NetworkVO l3vo = dbf.findByUuid(ipr.getL3NetworkUuid(), L3NetworkVO.class); + if (l3vo == null) { + logger.warn(String.format( + "l3 network[uuid:%s] not found when adding ipRange[uuid:%s], skip syncing to sdn controller", + ipr.getL3NetworkUuid(), ipr.getUuid())); + return; + } + L3NetworkInventory l3Network = L3NetworkInventory.valueOf(l3vo); + SdnControllerVO sdnControllerVO = getSdnControllerVO(l3Network); + if (sdnControllerVO == null) { + return; + } + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + SdnControllerL2 controller = factory.getSdnControllerL2(sdnControllerVO); + controller.addL3NetworkIpRange(l3Network, ipr, new Completion(null) { + @Override + public void success() { + logger.debug(String.format("success to create l3 network[uuid:%s] ipRange on sdn controller[uuid:%s]", + l3Network.getUuid(), sdnControllerVO.getUuid())); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("failed to create l3 network[uuid:%s] ipRange on sdn controller[uuid:%s], because: %s", + l3Network.getUuid(), sdnControllerVO.getUuid(), errorCode.getDetails())); + } + }); + } + + @Override + public void preDeleteIpRange(IpRangeInventory ipRange) { + } + + @Override + public void beforeDeleteIpRange(IpRangeInventory ipRange) { + } + + @Override + public void afterDeleteIpRange(IpRangeInventory ipRange) { + L3NetworkVO l3vo = dbf.findByUuid(ipRange.getL3NetworkUuid(), L3NetworkVO.class); + if (l3vo == null) { + logger.warn(String.format("l3 network[uuid:%s] not found when deleting ipRange[uuid:%s], skip syncing to sdn controller", + ipRange.getL3NetworkUuid(), ipRange.getUuid())); + return; + } + L3NetworkInventory l3Network = L3NetworkInventory.valueOf(l3vo); + SdnControllerVO sdnControllerVO = getSdnControllerVO(l3Network); + if (sdnControllerVO == null) { + return; + } + SdnControllerFactory factory = getSdnControllerFactory(sdnControllerVO.getVendorType()); + SdnControllerL2 controller = factory.getSdnControllerL2(sdnControllerVO); + controller.deleteL3NetworkIpRange(l3Network, ipRange, new Completion(null) { + @Override + public void success() { + logger.debug(String.format("success to delete l3 network[uuid:%s] ipRange on sdn controller[uuid:%s]", + l3Network.getUuid(), sdnControllerVO.getUuid())); + } + + @Override + public void fail(ErrorCode errorCode) { + logger.warn(String.format("failed to delete l3 network[uuid:%s] ipRange on sdn controller[uuid:%s], because: %s", + l3Network.getUuid(), sdnControllerVO.getUuid(), errorCode.getDetails())); + } + }); + } + + @Override + public void failedToDeleteIpRange(IpRangeInventory ipRange, ErrorCode errorCode) { + } + + private SdnControllerVO getSdnControllerVO(L2NetworkInventory l2Network) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(l2Network.getUuid()); + if (sdnControllerUuid == null) { + return null; + } + return dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + } + private SdnControllerVO getSdnControllerVO(L3NetworkInventory l3Network) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3Network.getUuid()); + if (sdnControllerUuid == null) { + return null; + } + return dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java new file mode 100644 index 00000000000..22436283c17 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingMsg.java @@ -0,0 +1,20 @@ +package org.zstack.sdnController; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; + +/** + * Created by shixin.ruan on 06/26/2025. + */ +public class SdnControllerPingMsg extends NeedReplyMessage implements SdnControllerMessage { + private String sdnControllerUuid; + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java new file mode 100644 index 00000000000..6046d785fcb --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingReply.java @@ -0,0 +1,18 @@ +package org.zstack.sdnController; + +import org.zstack.header.message.MessageReply; + +/** + * Created by shixin.ruan on 06/26/2025. + */ +public class SdnControllerPingReply extends MessageReply { + private boolean doReconnect = false; + + public boolean getDoReconnect() { + return doReconnect; + } + + public void setDoReconnect(boolean doReconnect) { + this.doReconnect = doReconnect; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java new file mode 100644 index 00000000000..2deeb4602aa --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerPingTracker.java @@ -0,0 +1,160 @@ +package org.zstack.sdnController; + +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.cloudbus.ResourceDestinationMaker; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.core.config.GlobalConfig; +import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.thread.AsyncThread; +import org.zstack.core.tracker.PingTracker; +import org.zstack.header.core.Completion; +import org.zstack.header.managementnode.ManagementNodeChangeListener; +import org.zstack.header.managementnode.ManagementNodeInventory; +import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; +import org.zstack.header.message.MessageReply; +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerStatus; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; +import org.zstack.sdnController.header.*; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.function.Function; +import org.zstack.utils.logging.CLogger; + +import java.util.List; + +/** + * Created by shixin on 06/26/2025. + */ +public class SdnControllerPingTracker extends PingTracker implements + ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint, SdnControllerDeleteExtensionPoint { + private final static CLogger logger = Utils.getLogger(SdnControllerPingTracker.class); + + @Autowired + private DatabaseFacade dbf; + @Autowired + private ResourceDestinationMaker destinationMaker; + @Autowired + protected PluginRegistry pluginRgty; + @Autowired + protected SdnControllerManager sdnMgr; + + public String getResourceName() { + return "sdn controller"; + } + + // sdn controller will only ping when it's connected or disconnected, + // if ping failed, it will send ReconnectSdnControllerMsg, + @Override + public NeedReplyMessage getPingMessage(String resUuid) { + SdnControllerVO vo = dbf.findByUuid(resUuid, SdnControllerVO.class); + if (vo.getStatus() == SdnControllerStatus.Connecting) { + return null; + } + + SdnControllerPingMsg msg = new SdnControllerPingMsg(); + msg.setSdnControllerUuid(resUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, resUuid); + return msg; + } + + @Override + public int getPingInterval() { + return SdnControllerGlobalConfig.PING_INTERVAL.value(Integer.class); + } + + @Override + public int getParallelismDegree() { + return SdnControllerGlobalConfig.PING_PARALLELISM_DEGREE.value(Integer.class); + } + + @Override + public void handleReply(final String resourceUuid, MessageReply reply) { + SdnControllerVO vo = dbf.findByUuid(resourceUuid, SdnControllerVO.class); + if (vo == null) { + logger.warn(String.format("SDN controller[uuid:%s] has been deleted, skip ping handling", resourceUuid)); + return; + } + + + if (!reply.isSuccess()) { + logger.warn(String.format("[SDN Ping Tracker]: unable to ping the sdn controller[uuid: %s], %s", resourceUuid, reply.getError())); + new SdnControllerBase(vo).changeSdnControllerStatus(SdnControllerStatus.Disconnected); + return; + } + + SdnControllerStatus oldStatus = vo.getStatus(); + new SdnControllerBase(vo).changeSdnControllerStatus(SdnControllerStatus.Connected); + if (oldStatus == SdnControllerStatus.Disconnected) { + ReconnectSdnControllerMsg msg = new ReconnectSdnControllerMsg(); + msg.setControllerUuid(resourceUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SdnControllerConstant.SERVICE_ID, resourceUuid); + bus.send(msg); + } + } + + private void trackOurs() { + List sdnControllerUuids = Q.New(SdnControllerVO.class) + .select(SdnControllerVO_.uuid).listValues(); + List toTrack = CollectionUtils.transformToList(sdnControllerUuids, new Function() { + @Override + public String call(String arg) { + return destinationMaker.isManagedByUs(arg) ? arg : null; + } + }); + + untrackAll(); + track(toTrack); + } + + @Override + public void nodeJoin(ManagementNodeInventory inv) { + trackOurs(); + } + + @Override + public void nodeLeft(ManagementNodeInventory inv) { + trackOurs(); + } + + @Override + public void iAmDead(ManagementNodeInventory inv) { + + } + + @Override + public void iJoin(ManagementNodeInventory inv) { + } + + @Override + protected void startHook() { + SdnControllerGlobalConfig.PING_INTERVAL.installUpdateExtension(new GlobalConfigUpdateExtensionPoint() { + @Override + public void updateGlobalConfig(GlobalConfig oldConfig, GlobalConfig newConfig) { + pingIntervalChanged(); + } + }); + } + + @Override + @AsyncThread + public void managementNodeReady() { + trackOurs(); + } + + @Override + protected void trackHook(String resourceUuid) { + super.trackHook(resourceUuid); + } + + @Override + public void deleteNetworkServiceOfSdnController(String sdnControllerUuid, Completion completion) { + super.untrack(sdnControllerUuid); + completion.success(); + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java new file mode 100644 index 00000000000..9caf040fd75 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerReply.java @@ -0,0 +1,7 @@ +package org.zstack.sdnController; + +import org.zstack.header.message.MessageReply; + +public class SdnControllerReply extends MessageReply { + +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java new file mode 100644 index 00000000000..1ced576c095 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerSystemTags.java @@ -0,0 +1,18 @@ +package org.zstack.sdnController; + +import org.zstack.header.tag.TagDefinition; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class SdnControllerSystemTags { + public static String START_VNI_TOKEN = "startVni"; + public static String END_VNI_TOKEN = "endVni"; + public static PatternedSystemTag VNI_RANGE = new PatternedSystemTag(String.format("startVni::{%s}::endVni::{%s}", + START_VNI_TOKEN, END_VNI_TOKEN), SdnControllerVO.class); + + public static String START_VLAN_TOKEN = "startVlan"; + public static String END_VLAN_TOKEN = "endVlan"; + public static PatternedSystemTag VLAN_RANGE = new PatternedSystemTag(String.format("startVlan::{%s}::endVlan::{%s}", + START_VLAN_TOKEN, END_VLAN_TOKEN), SdnControllerVO.class); +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java index 4a0c1e39839..8583a8b07ee 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcApiInterceptor.java @@ -3,18 +3,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg; import org.zstack.header.network.l2.APIDetachL2NetworkFromClusterMsg; -import org.zstack.header.network.l3.APICreateL3NetworkMsg; +import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.*; +import org.zstack.network.l2.L2NetworkSystemTags; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.APIDeleteVxlanL2Network; import org.zstack.network.l2.vxlan.vxlanNetworkPool.APICreateVniRangeMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; -import org.zstack.sdnController.SdnController; +import org.zstack.network.l3.L3NetworkHelper; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; @@ -24,6 +29,8 @@ import java.util.List; import static org.zstack.core.Platform.argerr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; public class H3cVcfcApiInterceptor implements ApiMessageInterceptor, GlobalApiMessageInterceptor { private static final CLogger logger = Utils.getLogger(H3cVcfcApiInterceptor.class); @@ -54,6 +61,10 @@ public List getMessageClassToIntercept() { ret.add(APIDeleteVxlanL2Network.class); ret.add(APIRemoveSdnControllerMsg.class); ret.add(APICreateL3NetworkMsg.class); + ret.add(APIAddIpRangeMsg.class); + ret.add(APIAddIpRangeByNetworkCidrMsg.class); + ret.add(APIAddIpv6RangeMsg.class); + ret.add(APIAddIpv6RangeByNetworkCidrMsg.class); return ret; } @@ -82,8 +93,15 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti validate((APIRemoveSdnControllerMsg) msg); } else if (msg instanceof APICreateL3NetworkMsg) { validate((APICreateL3NetworkMsg) msg); + } else if (msg instanceof APIAddIpRangeMsg) { + validate((APIAddIpRangeMsg) msg); + } else if (msg instanceof APIAddIpRangeByNetworkCidrMsg) { + validate((APIAddIpRangeByNetworkCidrMsg) msg); + } else if (msg instanceof APIAddIpv6RangeMsg) { + validate((APIAddIpv6RangeMsg) msg); + } else if (msg instanceof APIAddIpv6RangeByNetworkCidrMsg) { + validate((APIAddIpv6RangeByNetworkCidrMsg) msg); } - setServiceId(msg); return msg; @@ -99,7 +117,7 @@ public static boolean isOverlappedVniRange(Integer startVni1, Integer endVni1, I private void validate(APICreateVniRangeMsg msg) { VxlanNetworkPoolVO pool = dbf.findByUuid(msg.getL2NetworkUuid(), VxlanNetworkPoolVO.class); if ( pool == null ) { - throw new ApiMessageInterceptionException(argerr("unable create vni range, because l2 uuid[%s] is not vxlan network pool",msg.getL2NetworkUuid())); + throw new ApiMessageInterceptionException(argerr("Could not create VNI range because the specified L2 network [uuid:%s] is not a VXLAN network pool", msg.getL2NetworkUuid())); } HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(msg.getL2NetworkUuid(), HardwareL2VxlanNetworkPoolVO.class); @@ -114,10 +132,10 @@ private void validate(APICreateVniRangeMsg msg) { // user's vni must <= 4094 if (msg.getStartVni() > 4094 || msg.getEndVni() > 4094) { - throw new ApiMessageInterceptionException(argerr("the vni range:[%s.%s} is illegal, because h3c's controller uses vni as vlan id", msg.getStartVni(), msg.getEndVni())); + throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because H3C controllers use VNI as VLAN ID and the range must be within 1-4094", msg.getStartVni(), msg.getEndVni())); } - - SdnController sdnController = sdnControllerManager.getSdnController(vo); + + SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(vo); SdnVniRange userVniRange = new SdnVniRange(); userVniRange.startVni = msg.getStartVni(); userVniRange.endVni = msg.getEndVni(); @@ -129,10 +147,93 @@ private void validate(APICreateVniRangeMsg msg) { return; } } - throw new ApiMessageInterceptionException(argerr("the vni range:[%s.%s} is illegal, must covered by a sdn's vniRange", userVniRange.startVni, userVniRange.endVni)); + throw new ApiMessageInterceptionException(argerr("Could not create VNI range [%s-%s] because it is not covered by any of the SDN controller's configured VNI ranges", userVniRange.startVni, userVniRange.endVni)); + } + + private void validate(APIAddIpv6RangeMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IPv6 range because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } + } + + private void validate(APIAddIpv6RangeByNetworkCidrMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IPv6 range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } + } + + private void validate(APIAddIpRangeMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IP range because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } + } + + private void validate(APIAddIpRangeByNetworkCidrMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(msg.getL3NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (vo == null) { + return; + } + if (!vo.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { + return; + } + if (vo.getStatus() != SdnControllerStatus.Connected) { + throw new ApiMessageInterceptionException(argerr("Could not add IP range by network CIDR because the SDN controller [uuid:%s] is not connected. Current status: %s", + sdnControllerUuid, vo.getStatus())); + } } private void validate(APICreateL3NetworkMsg msg) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(msg.getL2NetworkUuid()); + if (sdnControllerUuid == null) { + return; + } + SdnControllerVO vo = dbf.findByUuid(sdnControllerUuid, SdnControllerVO.class); + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(vo.getVendorType()) && + SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion()) && + L3NetworkCategory.Public.toString().equals(msg.getCategory())) { + throw new ApiMessageInterceptionException(argerr("can not create l3 network" + + "because H3C VCFC V2 SDN controller does not support l3[type:%s, category:%s]", msg.getType(), msg.getCategory())); + } } private void validate(APIRemoveSdnControllerMsg msg) { @@ -145,6 +246,37 @@ private void validate(APIDetachL2NetworkFromClusterMsg msg) { } private void validate(APICreateL2HardwareVxlanNetworkMsg msg) { + HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(msg.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); + if (poolVO == null) { + return; + } + + SdnControllerVO sdnControllerVO = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + if (sdnControllerVO != null + && SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(sdnControllerVO.getVendorVersion())) { + boolean tenantExist = msg.getH3cTenantUuid() != null && + Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.uuid, msg.getH3cTenantUuid()) + .isExists(); + if (!tenantExist) { + throw new ApiMessageInterceptionException(argerr( + "Could not create hardware VXLAN network because tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); + } + } + + boolean hasSdnControllerTag = msg.getSystemTags() != null && + msg.getSystemTags().stream() + .anyMatch(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID::isMatch); + + if (!hasSdnControllerTag && poolVO.getSdnControllerUuid() != null) { + if (msg.getSystemTags() == null) { + msg.setSystemTags(new ArrayList<>()); + } + String tag = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.instantiateTag( + map(e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, poolVO.getSdnControllerUuid())) + ); + msg.getSystemTags().add(tag); + } } private void validate(APICreateL2HardwareVxlanNetworkPoolMsg msg) { @@ -174,8 +306,8 @@ private void validate(APIAddSdnControllerMsg msg) { if (!msg.getVendorType().equals(SdnControllerConstant.H3C_VCFC_CONTROLLER)) { return; } - if (!validateH3cController(msg)) { - throw new ApiMessageInterceptionException(argerr("H3C VCFC controller must include systemTags vdsUuid::{%s}")); + if (!validateH3cController(msg) && msg.getVendorVersion().equals(SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V1)) { + throw new ApiMessageInterceptionException(argerr("Could not add H3C VCFC controller because VDS UUID system tag is required for H3C VCFC V1 controllers")); } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java index b1977d85feb..604bb4422ac 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcCommands.java @@ -98,7 +98,7 @@ public static class H3cTenantStruct { public String type; } public static class GetH3cTenantsRsp extends H3cRsp { - public List tenants; + public List tenants; } public static class GetH3cTeamLederIpCmd extends H3cCmd { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java index f5c829915fc..8e43b7ed120 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcHttpClient.java @@ -9,6 +9,7 @@ import org.zstack.header.rest.RESTFacade; import org.zstack.utils.gson.JSONObjectUtil; +import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -53,11 +54,23 @@ public T syncCall(String action, String ip, String url, Object body, Map params = JSONObjectUtil.rehashObject(body, Map.class); + UriComponentsBuilder ub = UriComponentsBuilder.fromUriString(fullUrl); + for (Map.Entry entry : params.entrySet()) { + ub.queryParam(entry.getKey(), entry.getValue()); + } + fullUrl = ub.build().toUriString(); + } + return restf.syncJsonGet(fullUrl, null, headers, responseClass); } case "DELETE": { return restf.syncJsonDelete(buildUrl(ip, url), httpBody, headers, responseClass); } + case "PUT": { + return restf.syncJsonPut(buildUrl(ip, url), httpBody, headers, responseClass); + } default: { if (url.equals(H3cVcfcCommands.H3C_VCFC_L2_NETWORKS)) { httpBody = httpBody.replace("\"network_type\"", "\"provider:network_type\"") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java index 1130969da38..f9afed355d9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java @@ -3,21 +3,24 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.http.HttpMethod; import org.springframework.web.util.UriComponentsBuilder; import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.Completion; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.identity.AccountInventory; -import org.zstack.header.network.l2.L2NetworkVO; -import org.zstack.header.network.l3.*; +import org.zstack.header.message.Message; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.*; import org.zstack.header.rest.RESTFacade; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; -import org.zstack.sdnController.SdnController; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; +import org.zstack.sdnController.*; import org.zstack.sdnController.header.*; -import org.zstack.sdnController.SdnControllerLog; import org.zstack.tag.SystemTagCreator; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -29,12 +32,13 @@ import static org.zstack.utils.CollectionDSL.map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class H3cVcfcSdnController implements SdnController { +public class H3cVcfcSdnController implements SdnController, SdnControllerL2 { private static final CLogger logger = Utils.getLogger(H3cVcfcSdnController.class); @Autowired private DatabaseFacade dbf; - + @Autowired + CloudBus bus; @Autowired protected RESTFacade restf; @@ -62,12 +66,7 @@ public H3cVcfcSdnController(SdnControllerVO self) { } private Map getH3cHeaders() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - headers.put("Accept", "application/json"); - headers.put("Cache-Control", "no-cache"); - - return headers; + return getH3cHeaders(null); } private Map getH3cHeaders(String token) { @@ -75,18 +74,20 @@ private Map getH3cHeaders(String token) { headers.put("Content-Type", "application/json"); headers.put("Accept", "application/json"); headers.put("Cache-Control", "no-cache"); - headers.put("X-Auth-Token", token); - + if (token != null) { + headers.put("X-Auth-Token", token); + } return headers; } // from H3cCmd - private void getH3cVniRanges(Completion completion) { - H3cVcfcCommands.GetH3cVniRangeCmd cmd = new H3cVcfcCommands.GetH3cVniRangeCmd(); + public void getH3cVniRanges(Completion completion) { + H3cVcfcCommands.GetH3cVniRangeCmd cmd = getGetH3cVniRangeCmd(); try { - H3cVcfcCommands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.GetH3cVniRangeRsp.class).syncCall("GET", self.getIp(), H3cVcfcCommands.H3C_VCFC_VNI_RANGES, cmd, getH3cHeaders(token)); + H3cVcfcCommands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(getGetH3cVniRangeRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcVniRangesPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("get vni range on sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); return; } @@ -95,13 +96,13 @@ private void getH3cVniRanges(Completion completion) { for (H3cVcfcCommands.VniRangeStruct v : d.vlan_map_list) { Integer startVni = Integer.valueOf(v.start_vxlan); Integer endVni = Integer.valueOf(v.end_vxlan); - SystemTagCreator creator = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.newSystemTagCreator(self.getUuid()); + SystemTagCreator creator = SdnControllerSystemTags.VNI_RANGE.newSystemTagCreator(self.getUuid()); creator.ignoreIfExisting = false; creator.inherent = false; creator.setTagByTokens( map( - e(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN, v.start_vxlan), - e(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN, v.end_vxlan) + e(SdnControllerSystemTags.START_VNI_TOKEN, v.start_vxlan), + e(SdnControllerSystemTags.END_VNI_TOKEN, v.end_vxlan) ) ); creator.create(); @@ -110,22 +111,23 @@ private void getH3cVniRanges(Completion completion) { } if (count == 0) { - completion.fail(operr("there is no vni range on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("get sdn controller [ip:%s] vni range failed because %s", self.getIp(), e.getLocalizedMessage())); + completion.fail(operr("Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); } } private void getH3cDefaultTenant(Completion completion) { - H3cVcfcCommands.GetH3cTenantsCmd cmd = new H3cVcfcCommands.GetH3cTenantsCmd(); + H3cVcfcCommands.GetH3cTenantsCmd cmd = getGetH3cTenantsCmd(); try { - H3cVcfcCommands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.GetH3cTenantsRsp.class).syncCall("GET", self.getIp(), H3cVcfcCommands.H3C_VCFC_TENANTS, cmd, getH3cHeaders(token)); + H3cVcfcCommands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cTenantsRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTenantsPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("there is no vni range on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not retrieve tenants because the SDN controller [ip:%s] did not respond", self.getIp())); return; } @@ -148,13 +150,13 @@ private void getH3cDefaultTenant(Completion completion) { } if (!found) { - completion.fail(operr("there is no vni range on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not initialize SDN controller because no default tenant is configured on controller [ip:%s]", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("there is no default tenant on sdn controller [ip:%s]", self.getIp())); + completion.fail(operr("Could not retrieve default tenant from SDN controller [ip:%s] because of a communication error", self.getIp())); } } @@ -184,8 +186,8 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - for(String systemTag : msg.getSystemTags()) { - if(H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.isMatch(systemTag)) { + for (String systemTag : msg.getSystemTags()) { + if (H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.isMatch(systemTag)) { trigger.next(); return; } @@ -215,12 +217,32 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + @Override + public void handleMessage(SdnControllerMessage msg) { + if (msg instanceof SdnControllerPingMsg) { + handle((SdnControllerPingMsg)msg); + } else { + bus.dealWithUnknownMessage((Message) msg); + } + } + @Override @SdnControllerLog public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { completion.success(); } + @Override + public void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { + dbf.persist(vo); + completion.success(); + } + + @Override + public void deleteSdnControllerDb(SdnControllerVO vo) { + dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + } + @Override @SdnControllerLog public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { @@ -239,7 +261,7 @@ public void fail(ErrorCode errorCode) { @Override @SdnControllerLog - public void postInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { + public void postInitSdnController(SdnControllerVO vo, Completion completion) { completion.success(); } @@ -249,7 +271,7 @@ public void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List sy completion.success(); } - private void createVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void createVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { getH3cControllerLeaderIp(new Completion(completion) { @Override public void success() { @@ -264,26 +286,28 @@ public void fail(ErrorCode errorCode) { } /* H3C VCFC backup node can not handle the create command */ - private void doCreateVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + VxlanNetworkVO vo = dbf.findByUuid(vxlan.getUuid(), VxlanNetworkVO.class); String tenantUuid = H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID.getTokenByResourceUuid(self.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID_TOKEN); String vdsUuid = H3cVcfcSdnControllerSystemTags.H3C_VDS_UUID.getTokenByResourceUuid(self.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_VDS_TOKEN); - H3cVcfcCommands.CreateH3cNetworksCmd cmd = new H3cVcfcCommands.CreateH3cNetworksCmd(); - H3cVcfcCommands.NetworkCmd networkCmd = new H3cVcfcCommands.NetworkCmd(); + H3cVcfcCommands.CreateH3cNetworksCmd cmd = getCreateH3cNetworksCmd(); + H3cVcfcCommands.NetworkCmd networkCmd = getNetworkCmd(); networkCmd.name = vxlan.getName(); networkCmd.tenant_id = tenantUuid; networkCmd.distributed = true; networkCmd.network_type = "VXLAN"; networkCmd.original_network_type = "VXLAN"; networkCmd.domain = vdsUuid; - networkCmd.segmentation_id = vxlan.getVni(); + networkCmd.segmentation_id = vo.getVni(); networkCmd.external = false; networkCmd.force_flat = false; cmd.networks.add(networkCmd); try { - H3cVcfcCommands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.CreateH3cNetworksRsp.class).syncCall("POST", leaderIp, H3cVcfcCommands.H3C_VCFC_L2_NETWORKS, cmd, getH3cHeaders(token)); + H3cVcfcCommands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getCreateH3cNetworksRspClass()) + .syncCall(HttpMethod.POST.name(), leaderIp, getH3cVcfcL2NetworksPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("create vxlan network on sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } H3cVcfcCommands.NetworkCmd network = rsp.networks.get(0); @@ -299,18 +323,18 @@ private void doCreateVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Com completion.success(); } catch (Exception e) { - completion.fail(operr("create vxlan network on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @Override @SdnControllerLog - public void createVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion) { /* initSdnController get the token */ getH3cControllerToken(new Completion(completion) { @Override public void success() { - createVxlanNetworkOnController(vxlan, completion); + createVxlanNetworkOnController(inv, completion); } @Override @@ -334,7 +358,7 @@ public void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, List systemTags, Completion completion) { completion.success(); } @@ -353,11 +377,11 @@ public void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInven @Override @SdnControllerLog - public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion) { + public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, List clusterUuid, Completion completion) { completion.success(); } - private void deleteVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { + private void deleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { getH3cControllerLeaderIp(new Completion(completion) { @Override public void success() { @@ -371,25 +395,26 @@ public void fail(ErrorCode errorCode) { }); } - private void doDeleteVxlanNetworkOnController(L2VxlanNetworkInventory vxlan, Completion completion) { - H3cVcfcCommands.DeleteH3cNetworksCmd cmd = new H3cVcfcCommands.DeleteH3cNetworksCmd(); + private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + H3cVcfcCommands.DeleteH3cNetworksCmd cmd = getDeleteH3cNetworksCmd(); try { String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); - H3cVcfcCommands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.DeleteH3cNetworksRsp.class).syncCall("DELETE", leaderIp, String.format("%s/%s", H3cVcfcCommands.H3C_VCFC_L2_NETWORKS, h3cL2NetworkUuid), cmd, getH3cHeaders(token)); + H3cVcfcCommands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getDeleteH3cNetworksRspClass()) + .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", getH3cVcfcL2NetworksPath(), h3cL2NetworkUuid), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("delete vxlan network on sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not delete VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); return; } completion.success(); } catch (Exception e) { - completion.fail(operr("delete vxlan network on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } @Override @SdnControllerLog - public void deleteVxlanNetwork(L2VxlanNetworkInventory vxlan, Completion completion) { + public void deleteL2Network(L2NetworkInventory vxlan, Completion completion) { /* initSdnController get the token */ getH3cControllerToken(new Completion(completion) { @Override @@ -406,13 +431,13 @@ public void fail(ErrorCode errorCode) { @Override public List getVniRange(SdnControllerInventory controller) { - List> tokenList = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE + List> tokenList = SdnControllerSystemTags.VNI_RANGE .getTokensOfTagsByResourceUuid(controller.getUuid()); List vniRanges = new ArrayList<>(); for (Map tokens : tokenList) { SdnVniRange range = new SdnVniRange(); - range.startVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN)); - range.endVni = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN)); + range.startVni = Integer.valueOf(tokens.get(SdnControllerSystemTags.START_VNI_TOKEN)); + range.endVni = Integer.valueOf(tokens.get(SdnControllerSystemTags.END_VNI_TOKEN)); vniRanges.add(range); } return vniRanges; @@ -421,46 +446,48 @@ public List getVniRange(SdnControllerInventory controller) { @Override public List getVlanRange(SdnControllerInventory controller) { // H3c: access vlan == vni - List> tokenList = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE + List> tokenList = SdnControllerSystemTags.VNI_RANGE .getTokensOfTagsByResourceUuid(controller.getUuid()); List vlanRanges = new ArrayList<>(); for (Map tokens : tokenList) { SdnVlanRange range = new SdnVlanRange(); - range.startVlan = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_START_VNI_TOKEN)); - range.endVlan = Integer.valueOf(tokens.get(H3cVcfcSdnControllerSystemTags.H3C_END_VNI_TOKEN)); + range.startVlan = Integer.valueOf(tokens.get(SdnControllerSystemTags.START_VNI_TOKEN)); + range.endVlan = Integer.valueOf(tokens.get(SdnControllerSystemTags.END_VNI_TOKEN)); vlanRanges.add(range); } return vlanRanges; } private void getH3cControllerLeaderIp(Completion completion) { - H3cVcfcCommands.GetH3cTeamLederIpCmd cmd = new H3cVcfcCommands.GetH3cTeamLederIpCmd(); + H3cVcfcCommands.GetH3cTeamLederIpCmd cmd = getGetH3cTeamLederIpCmd(); try { - H3cVcfcCommands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.GetH3cTeamLederIpReply.class).syncCall("GET", self.getIp(), H3cVcfcCommands.H3C_VCFC_TEAM_LEADERIP, cmd, getH3cHeaders(token)); + H3cVcfcCommands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(getGetH3cTeamLederIpReplyClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTeamLeaderIpPath(), cmd, getH3cHeaders(token)); if (rsp == null) { - completion.fail(operr("get leader of sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); return; } leaderIp = rsp.ip; completion.success(); } catch (Exception e) { - completion.fail(operr("get token of sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } - private void getH3cControllerToken(Completion completion) { - H3cVcfcCommands.GetH3cTokenCmd cmd = new H3cVcfcCommands.GetH3cTokenCmd(); - H3cVcfcCommands.LoginCmd loginCmd = new H3cVcfcCommands.LoginCmd(); + public void getH3cControllerToken(Completion completion) { + H3cVcfcCommands.GetH3cTokenCmd cmd = getGetH3cTokenCmd(); + H3cVcfcCommands.LoginCmd loginCmd = getLoginCmd(); loginCmd.user = self.getUsername(); loginCmd.password = self.getPassword(); cmd.login = loginCmd; try { - H3cVcfcCommands.LoginRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.LoginRsp.class).syncCall("POST", self.getIp(), H3cVcfcCommands.H3C_VCFC_GET_TOKEN, cmd, getH3cHeaders()); + H3cVcfcCommands.LoginRsp rsp = new H3cVcfcHttpClient<>(getLoginRspClass()) + .syncCall(HttpMethod.POST.name(), self.getIp(), getH3cVcfcGetTokenPath(), cmd, getH3cHeaders()); if (rsp == null) { - completion.fail(operr("get token of sdn controller [ip:%s] failed", self.getIp())); + completion.fail(operr("Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); return; } @@ -468,7 +495,117 @@ private void getH3cControllerToken(Completion completion) { completion.success(); } catch (Exception e) { - completion.fail(operr("get token of sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + completion.fail(operr("Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); } } + + void handle(SdnControllerPingMsg msg) { + SdnControllerPingReply reply = new SdnControllerPingReply(); + + getH3cControllerToken(new Completion(msg) { + @Override + public void success() { + reply.setSuccess(true); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + @Override + public void reconnectSdnController(Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + completion.success(); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + // Protected methods for H3cVcfcCommands access, for subclass override + protected Class getGetH3cVniRangeRspClass() { + return H3cVcfcCommands.GetH3cVniRangeRsp.class; + } + + protected H3cVcfcCommands.GetH3cVniRangeCmd getGetH3cVniRangeCmd() { + return new H3cVcfcCommands.GetH3cVniRangeCmd(); + } + + protected String getH3cVcfcVniRangesPath() { + return H3cVcfcCommands.H3C_VCFC_VNI_RANGES; + } + + private Class getGetH3cTenantsRspClass() { + return H3cVcfcCommands.GetH3cTenantsRsp.class; + } + + protected H3cVcfcCommands.GetH3cTenantsCmd getGetH3cTenantsCmd() { + return new H3cVcfcCommands.GetH3cTenantsCmd(); + } + + protected String getH3cVcfcTenantsPath() { + return H3cVcfcCommands.H3C_VCFC_TENANTS; + } + + private H3cVcfcCommands.NetworkCmd getNetworkCmd() { + return new H3cVcfcCommands.NetworkCmd(); + } + + private H3cVcfcCommands.CreateH3cNetworksCmd getCreateH3cNetworksCmd() { + return new H3cVcfcCommands.CreateH3cNetworksCmd(); + } + + private Class getCreateH3cNetworksRspClass() { + return H3cVcfcCommands.CreateH3cNetworksRsp.class; + } + + protected String getH3cVcfcL2NetworksPath() { + return H3cVcfcCommands.H3C_VCFC_L2_NETWORKS; + } + + private H3cVcfcCommands.DeleteH3cNetworksCmd getDeleteH3cNetworksCmd() { + return new H3cVcfcCommands.DeleteH3cNetworksCmd(); + } + + protected Class getDeleteH3cNetworksRspClass() { + return H3cVcfcCommands.DeleteH3cNetworksRsp.class; + } + + protected H3cVcfcCommands.GetH3cTeamLederIpCmd getGetH3cTeamLederIpCmd() { + return new H3cVcfcCommands.GetH3cTeamLederIpCmd(); + } + + protected Class getGetH3cTeamLederIpReplyClass() { + return H3cVcfcCommands.GetH3cTeamLederIpReply.class; + } + + protected String getH3cVcfcTeamLeaderIpPath() { + return H3cVcfcCommands.H3C_VCFC_TEAM_LEADERIP; + } + + protected H3cVcfcCommands.GetH3cTokenCmd getGetH3cTokenCmd() { + return new H3cVcfcCommands.GetH3cTokenCmd(); + } + + protected H3cVcfcCommands.LoginCmd getLoginCmd() { + return new H3cVcfcCommands.LoginCmd(); + } + + protected Class getLoginRspClass() { + return H3cVcfcCommands.LoginRsp.class; + } + + protected String getH3cVcfcGetTokenPath() { + return H3cVcfcCommands.H3C_VCFC_GET_TOKEN; + } } \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java index 83b36f12f96..2d297ca518c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerFactory.java @@ -1,20 +1,52 @@ package org.zstack.sdnController.h3cVcfc; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; -import org.zstack.sdnController.SdnControllerType; -import org.zstack.sdnController.header.*; +import org.zstack.sdnController.*; public class H3cVcfcSdnControllerFactory implements SdnControllerFactory { SdnControllerType sdnControllerType = new SdnControllerType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + @Autowired + DatabaseFacade dbf; + @Override public SdnControllerType getVendorType() { return sdnControllerType; } + @Override + public SdnControllerVO persistSdnController(SdnControllerVO vo) { + vo = dbf.persistAndRefresh(vo); + return vo; + } + + @Override public SdnController getSdnController(SdnControllerVO vo) { - return new H3cVcfcSdnController(vo); + if (SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion())) { + return new H3cVcfcV2SdnController(vo); + } else { + return new H3cVcfcSdnController(vo); + } + } + + @Override + public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { + if (SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2.equals(vo.getVendorVersion())) { + return new H3cVcfcV2SdnController(vo); + } else { + return new H3cVcfcSdnController(vo); + } + } + + @Override + public SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo) { + return null; } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java index becff8a3708..f0c56fbfe4c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerGlobalProperty.java @@ -14,4 +14,7 @@ public class H3cVcfcSdnControllerGlobalProperty { /* default timeout 30 seconds */ @GlobalProperty(name="H3c.Timeout", defaultValue = "30000000") public static Long H3C_CONTROLLER_TIMEOUT; + + @GlobalProperty(name="H3c.Mgtip.Is.LeaderIp", defaultValue = "true") + public static Boolean H3C_MGT_IP_IS_LEADER_IP; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java index 22d30cf63c1..cd504aa258b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnControllerSystemTags.java @@ -2,7 +2,7 @@ import org.zstack.header.tag.TagDefinition; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.tag.PatternedSystemTag; @TagDefinition @@ -13,10 +13,12 @@ public class H3cVcfcSdnControllerSystemTags { public static String H3C_VDS_TOKEN = "vdsUuid"; public static PatternedSystemTag H3C_VDS_UUID = new PatternedSystemTag(String.format("vdsUuid::{%s}", H3C_VDS_TOKEN), SdnControllerVO.class); - public static String H3C_START_VNI_TOKEN = "startVni"; - public static String H3C_END_VNI_TOKEN = "endVni"; - public static PatternedSystemTag H3C_VNI_RANGE = new PatternedSystemTag(String.format("startVni::{%s}::endVni::{%s}", H3C_START_VNI_TOKEN, H3C_END_VNI_TOKEN), SdnControllerVO.class); - public static String H3C_L2_NETWORK_UUID_TOKEN = "h3cL2NetworkUuid"; public static PatternedSystemTag H3C_L2_NETWORK_UUID = new PatternedSystemTag(String.format("h3cL2NetworkUuid::{%s}", H3C_L2_NETWORK_UUID_TOKEN), VxlanNetworkVO.class); + + public static String H3C_L2_VROUTER_UUID_TOKEN = "h3cL2RouterUuid"; + public static PatternedSystemTag H3C_L2_VROUTER_UUID = new PatternedSystemTag(String.format("h3cL2RouterUuid::{%s}", H3C_L2_VROUTER_UUID_TOKEN), VxlanNetworkVO.class); + + public static String H3C_L2_TENANT_UUID_TOKEN = "h3cL2TenantUuid"; + public static PatternedSystemTag H3C_L2_TENANT_UUID = new PatternedSystemTag(String.format("h3cL2TenantUuid::{%s}", H3C_L2_TENANT_UUID_TOKEN), VxlanNetworkVO.class); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java new file mode 100644 index 00000000000..1fcd577f96b --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2Commands.java @@ -0,0 +1,136 @@ +package org.zstack.sdnController.h3cVcfc; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by boce.wang on 04/28/2025. + */ +public class H3cVcfcV2Commands extends H3cVcfcCommands { + + public static final String H3C_VCFC_SUBNETS = "/vds/1.0/subnets"; + public static final String H3C_VCFC_ROUTERS = "/vds/1.0/routers"; + public static final String H3C_VCFC_VDS = "/vds/1.0/h3c_vdsconf"; + + public static class NetworkCmd extends H3cVcfcCommands.NetworkCmd { + String tenant_name; + String vds_name; + } + + public static class CreateH3cNetworksCmd extends H3cCmd { + List networks = new ArrayList<>(); + } + + public static class CreateH3cNetworksRsp extends H3cRsp { + List networks = new ArrayList<>(); + } + + public static class H3cTenantStruct extends H3cVcfcCommands.H3cTenantStruct { + public List vds_list; + public String cloud_region_name; + public String cloud_domain_name; + + public H3cTenantStruct() { + vds_list = new ArrayList<>(); + } + } + + public static class GetH3cTenantsRsp extends H3cRsp { + public List tenants; + } + + public static class AllocationPoolStruct { + public String start; + public String end; + } + + public static class SubnetCmd { + String id; + String name; + String network_id; + String nqa_profile_id; + String segment_id; + String cidr; + String gateway_ip; + Boolean enable_dhcp; + List allocation_pools; + List dns_nameservers; + List service_types; + String cloud_region_name; + List protocal_ips; + String tenant_name; + String vds_name; + } + + public static class CreateH3cSubnetsCmd extends H3cCmd { + public List subnets = new ArrayList<>(); + } + + public static class CreateH3cSubnetsRsp extends H3cRsp { + public List subnets = new ArrayList<>(); + } + + public static class GetH3cSubnetsCmd extends H3cCmd { + public String network_id; + } + public static class GetH3cSubnetsRsp extends H3cRsp { + public List subnets = new ArrayList<>(); + } + + public static class RouterCmd { + String id; + String name; + String tenant_id; + } + + public static class CreateH3cRoutersCmd extends H3cCmd { + public List routers = new ArrayList<>(); + } + + public static class CreateH3cRoutersRsp extends H3cRsp { + public List routers = new ArrayList<>(); + } + + public static class DeleteH3cRoutersCmd extends H3cCmd { + } + + public static class DeleteH3cRoutersRsp extends H3cRsp { + } + + public static class AddRouterInterfaceCmd extends H3cCmd { + public String subnet_id; + } + + public static class AddRouterInterfaceRsp extends H3cRsp { + public String id; + public String subnet_id; + public String tenant_id; + public String port_id; + } + + public static class RemoveRouterInterfaceCmd extends H3cCmd { + public String subnet_id; + } + + public static class RemoveRouterInterfaceRsp extends H3cRsp { + } + + public static class H3cVdsStruct { + public String uuid; + public String name; + public String bridge; + public String status; + public String openflow_hard_age; + public String vxlan_tunnel_name; + public String vxlan_range; + public String virtual_mac; + public String forwarding_mode; + } + + public static class GetH3cVdsCmd extends H3cCmd { + } + + public static class GetH3cVdsRsp extends H3cRsp { + public List vds; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java new file mode 100644 index 00000000000..778d641c5e4 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java @@ -0,0 +1,693 @@ +package org.zstack.sdnController.h3cVcfc; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.http.HttpMethod; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.Completion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l3.IpRangeInventory; +import org.zstack.header.network.l3.L3NetworkConstant; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; +import org.zstack.sdnController.SdnControllerLog; +import org.zstack.sdnController.SdnControllerSystemTags; +import org.zstack.sdnController.header.*; +import org.zstack.tag.SystemTagCreator; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.*; +import java.util.stream.Collectors; + +import static org.codehaus.groovy.runtime.InvokerHelper.asList; +import static org.zstack.core.Platform.operr; +import static org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerGlobalProperty.H3C_MGT_IP_IS_LEADER_IP; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; + +/** + * H3C VCFC SDN Controller V2 Implementation. + * Extends the base H3cVcfcSdnController to support newer versions or features. + */ +@Slf4j +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class H3cVcfcV2SdnController extends H3cVcfcSdnController { + private static final CLogger logger = Utils.getLogger(H3cVcfcV2SdnController.class); + + @Autowired + private DatabaseFacade dbf; + private SdnControllerVO self; + private String token; + private String leaderIp; + + private Map getH3cHeaders() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + headers.put("Accept", "application/json"); + headers.put("Cache-Control", "no-cache"); + + return headers; + } + + private Map getH3cHeaders(String token) { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + headers.put("Accept", "application/json"); + headers.put("Cache-Control", "no-cache"); + headers.put("X-Auth-Token", token); + + return headers; + } + + public H3cVcfcV2SdnController(SdnControllerVO self) { + super(self); + this.self = self; + logger.debug(String.format("Instantiated H3C VCFC V2 Controller for VO [uuid:%s, name:%s]", self.getUuid(), self.getName())); + } + + @Override + @SdnControllerLog + public void addL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + addL3NetworkIpRangeOnController(inv, ipr, completion); + } + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void deleteL3NetworkIpRange(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + deleteL3NetworkIpRangeOnController(inv, ipr, completion); + } + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion) { + /* initSdnController get the token */ + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + createVxlanNetworkOnController(inv, (APICreateL2HardwareVxlanNetworkMsg) msg, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void deleteL2Network(L2NetworkInventory vxlan, Completion completion) { + /* initSdnController get the token */ + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + deleteVxlanNetworkOnController(vxlan, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + @SdnControllerLog + public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { + getH3cControllerToken(new Completion(completion) { + @Override + public void success() { + getH3cParameters(msg, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void addL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + try { + String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(inv.getL2NetworkUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); + List subnets = getSubnetsByNetworkUuid(h3cL2NetworkUuid); + H3cVcfcV2Commands.SubnetCmd subnet = subnets.stream() + .filter(s -> ipr.getNetworkCidr().equals(s.cidr)) + .findFirst() + .orElse(null); + if (subnet == null) { + logger.debug(String.format("addL3NetworkIpRangeOnController: subnet %s not exist in controller", ipr.getNetworkCidr())); + H3cVcfcV2Commands.SubnetCmd newSubnet = new H3cVcfcV2Commands.SubnetCmd(); + newSubnet.cidr = ipr.getNetworkCidr(); + newSubnet.gateway_ip = ipr.getGateway(); + newSubnet.name = ipr.getNetworkCidr(); + newSubnet.network_id = h3cL2NetworkUuid; + subnet = (H3cVcfcV2Commands.SubnetCmd) createSubnets(asList(newSubnet)).get(0); + } + if (subnet == null) { + completion.fail(operr("Could not add IP range because subnet creation failed on the SDN controller")); + return; + } + if (!Q.New(H3cSdnSubnetIpRangeRefVO.class) + .eq(H3cSdnSubnetIpRangeRefVO_.l2NetworkUuid, inv.getL2NetworkUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.ipRangeUuid, ipr.getUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.sdnControllerUuid, self.getUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.subnetUuid, subnet.id) + .isExists()) { + H3cSdnSubnetIpRangeRefVO newRef = new H3cSdnSubnetIpRangeRefVO(); + newRef.setL2NetworkUuid(inv.getL2NetworkUuid()); + newRef.setIpRangeUuid(ipr.getUuid()); + newRef.setSdnControllerUuid(self.getUuid()); + newRef.setSubnetUuid(subnet.id); + dbf.persist(newRef); + String h3cL2VRouterUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID.getTokenByResourceUuid(inv.getL2NetworkUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID_TOKEN); + if(h3cL2VRouterUuid != null && !inv.getType().equals(L3NetworkConstant.L3_BASIC_NETWORK_TYPE)) { + addRouterInterface(h3cL2VRouterUuid, subnet.id); + } + } + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not add IP range to L3 network because %s", e.getMessage())); + } + } + + private void deleteL3NetworkIpRangeOnController(L3NetworkInventory inv, IpRangeInventory ipr, Completion completion) { + try { + String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid( + inv.getL2NetworkUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); + List subnets = getSubnetsByNetworkUuid(h3cL2NetworkUuid); + H3cVcfcV2Commands.SubnetCmd subnet = subnets.stream() + .filter(s -> ipr.getNetworkCidr().equals(s.cidr)) + .findFirst() + .orElse(null); + if (subnet == null) { + dbf.removeCollection( + Q.New(H3cSdnSubnetIpRangeRefVO.class).eq(H3cSdnSubnetIpRangeRefVO_.ipRangeUuid, ipr.getUuid()).list(), + H3cSdnSubnetIpRangeRefVO.class + ); + } else { + List refs = Q.New(H3cSdnSubnetIpRangeRefVO.class) + .eq(H3cSdnSubnetIpRangeRefVO_.l2NetworkUuid, inv.getL2NetworkUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.sdnControllerUuid, self.getUuid()) + .eq(H3cSdnSubnetIpRangeRefVO_.subnetUuid, subnet.id).list(); + List refsToDelete = refs.stream() + .filter(ref -> ref.getIpRangeUuid().equals(ipr.getUuid())) + .collect(Collectors.toList()); + refs.removeAll(refsToDelete); + if (refs.isEmpty()) { + deleteSubnet(subnet.id); + } + dbf.removeCollection(refsToDelete, H3cSdnSubnetIpRangeRefVO.class); + } + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not delete IP range from L3 network because %s", e.getMessage())); + } + } + + private void createVxlanNetworkOnController(L2NetworkInventory vxlan, APICreateL2HardwareVxlanNetworkMsg msg, Completion completion) { + getH3cControllerLeaderIp(new Completion(completion) { + @Override + public void success() { + doCreateVxlanNetworkOnController(vxlan, msg, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void getH3cControllerLeaderIp(Completion completion) { + if (H3C_MGT_IP_IS_LEADER_IP) { + leaderIp = self.getIp(); + completion.success(); + return; + } + + H3cVcfcV2Commands.GetH3cTeamLederIpCmd cmd = getGetH3cTeamLederIpCmd(); + + try { + H3cVcfcV2Commands.GetH3cTeamLederIpReply rsp = new H3cVcfcHttpClient<>(getGetH3cTeamLederIpReplyClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcTeamLeaderIpPath(), cmd, getH3cHeaders(token)); + if (rsp == null) { + completion.fail(operr("Could not determine cluster leader because the SDN controller [ip:%s] did not respond", self.getIp())); + return; + } + + leaderIp = rsp.ip; + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not determine cluster leader for SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + @Override + public void getH3cControllerToken(Completion completion) { + H3cVcfcV2Commands.GetH3cTokenCmd cmd = getGetH3cTokenCmd(); + H3cVcfcV2Commands.LoginCmd loginCmd = getLoginCmd(); + loginCmd.user = self.getUsername(); + loginCmd.password = self.getPassword(); + cmd.login = loginCmd; + + try { + H3cVcfcV2Commands.LoginRsp rsp = new H3cVcfcHttpClient<>(getLoginRspClass()) + .syncCall(HttpMethod.POST.name(), self.getIp(), getH3cVcfcGetTokenPath(), cmd, getH3cHeaders()); + if (rsp == null) { + completion.fail(operr("Could not authenticate with SDN controller because controller [ip:%s] did not respond", self.getIp())); + return; + } + + token = rsp.record.token; + + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not authenticate with SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + @Override + public void getH3cVniRanges(Completion completion) { + H3cVcfcV2Commands.GetH3cVniRangeCmd cmd = getGetH3cVniRangeCmd(); + try { + H3cVcfcV2Commands.GetH3cVniRangeRsp rsp = new H3cVcfcHttpClient<>(getGetH3cVniRangeRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), getH3cVcfcVniRangesPath(), cmd, getH3cHeaders(token)); + if (rsp == null) { + completion.fail(operr("Could not retrieve VNI ranges because the SDN controller [ip:%s] did not respond", self.getIp())); + return; + } + // Delete previous inherent VNI range tags before creating new ones + SdnControllerSystemTags.VNI_RANGE.delete(self.getUuid()); + int count = 0; + for (H3cVcfcV2Commands.H3cVniRangeStruct d : rsp.domains) { + for (H3cVcfcV2Commands.VniRangeStruct v : d.vlan_map_list) { + SystemTagCreator creator = SdnControllerSystemTags.VNI_RANGE.newSystemTagCreator(self.getUuid()); + creator.ignoreIfExisting = false; + creator.inherent = false; + creator.setTagByTokens( + map( + e(SdnControllerSystemTags.START_VNI_TOKEN, v.start_vxlan), + e(SdnControllerSystemTags.END_VNI_TOKEN, v.end_vxlan) + ) + ); + creator.create(); + count++; + } + } + + if (count == 0) { + completion.fail(operr("Could not initialize SDN controller because no VNI ranges are configured on controller [ip:%s]", self.getIp())); + return; + } + + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not retrieve VNI ranges from SDN controller [ip:%s] because %s", self.getIp(), e.getLocalizedMessage())); + } + } + + private void getH3cParameters(APIAddSdnControllerMsg msg, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("get-h3c-parameters-%s", self.getIp())); + chain.then(new NoRollbackFlow() { + String __name__ = "get_h3c_controller_token"; + + @Override + public void run(FlowTrigger trigger, Map data) { + getH3cControllerToken(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "get_h3c_vni_ranges"; + + @Override + public void run(FlowTrigger trigger, Map data) { + getH3cVniRanges(new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + private void doCreateVxlanNetworkOnController(L2NetworkInventory vxlan, APICreateL2HardwareVxlanNetworkMsg msg, Completion completion) { + VxlanNetworkVO vo = dbf.findByUuid(vxlan.getUuid(), VxlanNetworkVO.class); + if (msg.getH3cTenantUuid() == null) { + completion.fail(operr("Could not create hardware VXLAN network because H3C tenant UUID is a mandatory parameter for the H3C VCFC V2 controller")); + return; + } + H3cSdnControllerTenantVO tenantVO = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.uuid, msg.getH3cTenantUuid()) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, self.getUuid()) + .limit(1) + .find(); + if (tenantVO == null) { + completion.fail(operr("Could not create hardware VXLAN network because the specified tenant does not exist in the SDN controller")); + return; + } + + H3cVcfcV2Commands.CreateH3cNetworksCmd cmd = getCreateH3cNetworksCmd(); + H3cVcfcV2Commands.NetworkCmd networkCmd = getNetworkCmd(); + networkCmd.name = vxlan.getName(); + networkCmd.tenant_id = tenantVO.getTenantUuid(); + networkCmd.distributed = true; + networkCmd.network_type = "VXLAN"; + networkCmd.original_network_type = "VXLAN"; + networkCmd.domain = tenantVO.getVdsUuid(); + networkCmd.segmentation_id = vo.getVni(); + networkCmd.external = false; + networkCmd.force_flat = false; + + cmd.networks.add(networkCmd); + try { + H3cVcfcV2Commands.CreateH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getCreateH3cNetworksRspClass()) + .syncCall(HttpMethod.POST.name(), leaderIp, getH3cVcfcL2NetworksPath(), cmd, getH3cHeaders(token)); + if (rsp == null) { + completion.fail(operr("Could not create VXLAN network because the SDN controller [ip:%s] did not respond", self.getIp())); + return; + } + H3cVcfcV2Commands.NetworkCmd network = rsp.networks.get(0); + SystemTagCreator creator = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.newSystemTagCreator(vxlan.getUuid()); + creator.ignoreIfExisting = false; + creator.inherent = false; + creator.setTagByTokens( + map( + e(H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN, network.id) + ) + ); + creator.create(); + + String routerId = createVirtualRouterOnController(SdnControllerConstant.SDN_CONTROLLER_VROUTER_PREFIX + network.name, tenantVO.getUuid()); + if (routerId != null) { + SystemTagCreator routerTagCreator = H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID.newSystemTagCreator(vxlan.getUuid()); + routerTagCreator.ignoreIfExisting = false; + routerTagCreator.inherent = false; + routerTagCreator.setTagByTokens(map(e(H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID_TOKEN, routerId))); + routerTagCreator.create(); + } + + if (tenantVO != null) { + SystemTagCreator tenantTagCreator = H3cVcfcSdnControllerSystemTags.H3C_L2_TENANT_UUID.newSystemTagCreator(vxlan.getUuid()); + tenantTagCreator.ignoreIfExisting = false; + tenantTagCreator.inherent = false; + tenantTagCreator.setTagByTokens(map(e(H3cVcfcSdnControllerSystemTags.H3C_L2_TENANT_UUID_TOKEN, tenantVO.getTenantUuid()))); + tenantTagCreator.create(); + } + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not create VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + private void deleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + getH3cControllerLeaderIp(new Completion(completion) { + @Override + public void success() { + doDeleteVxlanNetworkOnController(vxlan, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + private void doDeleteVxlanNetworkOnController(L2NetworkInventory vxlan, Completion completion) { + H3cVcfcV2Commands.DeleteH3cNetworksCmd cmd = getDeleteH3cNetworksCmd(); + try { + String h3cL2NetworkUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_NETWORK_UUID_TOKEN); + H3cVcfcV2Commands.DeleteH3cNetworksRsp rsp = new H3cVcfcHttpClient<>(getDeleteH3cNetworksRspClass()) + .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", getH3cVcfcL2NetworksPath(), h3cL2NetworkUuid), cmd, getH3cHeaders(token)); + + String h3cL2VRouterUuid = H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID.getTokenByResourceUuid(vxlan.getUuid(), H3cVcfcSdnControllerSystemTags.H3C_L2_VROUTER_UUID_TOKEN); + if(h3cL2VRouterUuid != null) { + deleteVirtualRouterOnController(h3cL2VRouterUuid); + } + + completion.success(); + } catch (Exception e) { + completion.fail(operr("Could not delete VXLAN network on SDN controller [ip:%s] because %s", self.getIp(), e.getMessage())); + } + } + + private H3cVcfcCommands.DeleteH3cNetworksCmd getDeleteH3cNetworksCmd() { + return new H3cVcfcV2Commands.DeleteH3cNetworksCmd(); + } + + private H3cVcfcV2Commands.NetworkCmd getNetworkCmd() { + return new H3cVcfcV2Commands.NetworkCmd(); + } + + private H3cVcfcV2Commands.CreateH3cNetworksCmd getCreateH3cNetworksCmd() { + return new H3cVcfcV2Commands.CreateH3cNetworksCmd(); + } + + private Class getCreateH3cNetworksRspClass() { + return H3cVcfcV2Commands.CreateH3cNetworksRsp.class; + } + + private Class getGetH3cTenantsRspClass() { + return H3cVcfcV2Commands.GetH3cTenantsRsp.class; + } + + private Class getGetH3cSubnetsRspClass() { + return H3cVcfcV2Commands.GetH3cSubnetsRsp.class; + } + + @Override + protected String getH3cVcfcTenantsPath() { + return H3cVcfcV2Commands.H3C_VCFC_TENANTS; + } + + public List getAllH3cTenants() { + H3cVcfcV2Commands.GetH3cTenantsCmd cmd = new H3cVcfcV2Commands.GetH3cTenantsCmd(); + try { + H3cVcfcV2Commands.GetH3cTenantsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cTenantsRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_TENANTS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.tenants == null) { + return new ArrayList<>(); + } + + // Validate response by checking for default tenant presence + boolean hasDefaultTenant = rsp.tenants.stream() + .anyMatch(tenant -> SdnControllerConstant.H3C_SDN_CONTROLLER_DEFAULT_TENANT_ID.equals(tenant.id)); + + if (!hasDefaultTenant) { + throw new RuntimeException(String.format("No default tenant found in SDN controller [ip:%s]", self.getIp())); + } + + return rsp.tenants; + } catch (Exception e) { + logger.error("Failed to get all tenants from SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to get all tenants from SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + public List getAllH3cVds() { + H3cVcfcV2Commands.GetH3cVdsCmd cmd = new H3cVcfcV2Commands.GetH3cVdsCmd(); + try { + H3cVcfcV2Commands.GetH3cVdsRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.GetH3cVdsRsp.class) + .syncCall(HttpMethod.GET.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_VDS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.vds == null) { + return new ArrayList<>(); + } + + return rsp.vds; + } catch (Exception e) { + logger.error("Failed to get all VDS from SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to get all VDS from SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private List getSubnetsByNetworkUuid(String networkUuid) { + H3cVcfcV2Commands.GetH3cSubnetsCmd cmd = new H3cVcfcV2Commands.GetH3cSubnetsCmd(); + cmd.network_id = networkUuid; + try { + H3cVcfcV2Commands.GetH3cSubnetsRsp rsp = new H3cVcfcHttpClient<>(getGetH3cSubnetsRspClass()) + .syncCall(HttpMethod.GET.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_SUBNETS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.subnets == null) { + return new ArrayList<>(); + } + return rsp.subnets; + } catch (Exception e) { + logger.error("Failed to get all subnets from SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to get all subnets from SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private List createSubnets(List subnets) { + H3cVcfcV2Commands.CreateH3cSubnetsCmd cmd = new H3cVcfcV2Commands.CreateH3cSubnetsCmd(); + cmd.subnets = subnets; + try { + H3cVcfcV2Commands.CreateH3cSubnetsRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.CreateH3cSubnetsRsp.class) + .syncCall(HttpMethod.POST.name(), self.getIp(), H3cVcfcV2Commands.H3C_VCFC_SUBNETS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.subnets == null) { + return new ArrayList<>(); + } + return rsp.subnets; + } catch (Exception e) { + logger.error("Failed to create subnets on SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to create subnets on SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private void deleteSubnet(String subnetId) { + H3cVcfcCommands.H3cCmd cmd = new H3cVcfcCommands.H3cCmd(); + try { + H3cVcfcCommands.H3cRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcCommands.H3cRsp.class) + .syncCall(HttpMethod.DELETE.name(), self.getIp(), String.format("%s/%s", H3cVcfcV2Commands.H3C_VCFC_SUBNETS, subnetId), cmd, getH3cHeaders(token)); + } catch (Exception e) { + logger.error("Failed to delete subnets on SDN controller: " + e.getMessage(), e); + throw new RuntimeException(String.format("failed to delete subnets on SDN controller [ip:%s], error: %s", self.getIp(), e.getMessage()), e); + } + } + + private String createVirtualRouterOnController(String routerName, String tenantUuid) { + H3cSdnControllerTenantVO tenantVO = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.uuid, tenantUuid) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, self.getUuid()) + .limit(1) + .find(); + if (tenantVO == null) { + logger.warn(String.format("cannot find tenant in sdn controller for virtual router [name:%s]", routerName)); + return null; + } + + H3cVcfcV2Commands.CreateH3cRoutersCmd cmd = new H3cVcfcV2Commands.CreateH3cRoutersCmd(); + H3cVcfcV2Commands.RouterCmd routerCmd = new H3cVcfcV2Commands.RouterCmd(); + routerCmd.name = routerName; + routerCmd.tenant_id = tenantVO.getTenantUuid(); + + cmd.routers.add(routerCmd); + try { + H3cVcfcV2Commands.CreateH3cRoutersRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.CreateH3cRoutersRsp.class) + .syncCall(HttpMethod.POST.name(), leaderIp, H3cVcfcV2Commands.H3C_VCFC_ROUTERS, cmd, getH3cHeaders(token)); + if (rsp == null || rsp.routers == null || rsp.routers.isEmpty()) { + logger.warn(String.format("create virtual router on sdn controller [ip:%s] failed", self.getIp())); + return null; + } + + H3cVcfcV2Commands.RouterCmd router = rsp.routers.get(0); + logger.info(String.format("Successfully created virtual router [name:%s, id:%s] on sdn controller [ip:%s]", + router.name, router.id, self.getIp())); + return router.id; + } catch (Exception e) { + logger.warn(String.format("create virtual router on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + } + return null; + } + + private void deleteVirtualRouterOnController(String routerId) { + H3cVcfcV2Commands.DeleteH3cRoutersCmd cmd = new H3cVcfcV2Commands.DeleteH3cRoutersCmd(); + try { + H3cVcfcV2Commands.DeleteH3cRoutersRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.DeleteH3cRoutersRsp.class) + .syncCall(HttpMethod.DELETE.name(), leaderIp, String.format("%s/%s", H3cVcfcV2Commands.H3C_VCFC_ROUTERS, routerId), cmd, getH3cHeaders(token)); + if (rsp == null) { + logger.warn(String.format("delete virtual router on sdn controller [ip:%s] failed", self.getIp())); + return; + } + + logger.info(String.format("Successfully deleted virtual router [id:%s] on sdn controller [ip:%s]", + routerId, self.getIp())); + + } catch (Exception e) { + logger.warn(String.format("delete virtual router on sdn controller [ip:%s] failed because %s", self.getIp(), e.getMessage())); + } + } + + private void addRouterInterface(String routerId, String subnetId) { + H3cVcfcV2Commands.AddRouterInterfaceCmd cmd = new H3cVcfcV2Commands.AddRouterInterfaceCmd(); + cmd.subnet_id = subnetId; + + try { + H3cVcfcV2Commands.AddRouterInterfaceRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.AddRouterInterfaceRsp.class) + .syncCall(HttpMethod.PUT.name(), self.getIp(), String.format("%s/%s/add_router_interface", H3cVcfcV2Commands.H3C_VCFC_ROUTERS, routerId), cmd, getH3cHeaders(token)); + if (rsp == null) { + logger.warn(String.format("add router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s]", + self.getIp(), routerId, subnetId)); + } else { + logger.info(String.format("Successfully added router interface for router [id:%s] subnet [id:%s] on sdn controller [ip:%s]", + routerId, subnetId, self.getIp())); + } + } catch (Exception e) { + logger.warn(String.format("add router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s] because %s", + self.getIp(), routerId, subnetId, e.getMessage())); + } + } + + private void removeRouterInterface(String routerId, String subnetId) { + H3cVcfcV2Commands.RemoveRouterInterfaceCmd cmd = new H3cVcfcV2Commands.RemoveRouterInterfaceCmd(); + cmd.subnet_id = subnetId; + + try { + H3cVcfcV2Commands.RemoveRouterInterfaceRsp rsp = new H3cVcfcHttpClient<>(H3cVcfcV2Commands.RemoveRouterInterfaceRsp.class) + .syncCall(HttpMethod.PUT.name(), self.getIp(), String.format("%s/%s/remove_router_interface", H3cVcfcV2Commands.H3C_VCFC_ROUTERS, routerId), cmd, getH3cHeaders(token)); + if (rsp == null) { + logger.warn(String.format("remove router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s]", + self.getIp(), routerId, subnetId)); + } else { + logger.info(String.format("Successfully removed router interface for router [id:%s] subnet [id:%s] on sdn controller [ip:%s]", + routerId, subnetId, self.getIp())); + } + } catch (Exception e) { + logger.warn(String.format("remove router interface on sdn controller [ip:%s] failed for router [id:%s] subnet [id:%s] because %s", + self.getIp(), routerId, subnetId, e.getMessage())); + } + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java index f57d06b0a67..b21d317c240 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetwork.java @@ -10,10 +10,12 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.host.*; import org.zstack.header.network.l2.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.*; -import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -37,11 +39,11 @@ public HardwareVxlanNetwork(L2NetworkVO self) { } @Override - public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion) { HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController sdnController = sdnControllerManager.getSdnController(sdn); - sdnController.createVxlanNetwork(vxlan, systemTags, completion); + SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(sdn); + sdnController.createL2Network(vxlan, msg, completion); } @Override @@ -53,8 +55,8 @@ public void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion comp } SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController sdnController = sdnControllerManager.getSdnController(sdn); - sdnController.deleteVxlanNetwork(L2VxlanNetworkInventory.valueOf(vo), completion); + SdnControllerL2 sdnController = sdnControllerManager.getSdnControllerL2(sdn); + sdnController.deleteL2Network(L2VxlanNetworkInventory.valueOf(vo), completion); } private void realizeNetwork(String hostUuid, String htype, L2VxlanNetworkInventory inv , Completion completion) { @@ -66,20 +68,7 @@ private void realizeNetwork(String hostUuid, String htype, L2VxlanNetworkInvento ext.realize(inv, hostUuid, completion); } - @Override - public void attachL2NetworkToClusterOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { - List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, vxlan.getPoolUuid()) - .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); - if (clusterUuids == null || clusterUuids.isEmpty()) { - completion.success(); - return; - } - - List hosts = Q.New(HostVO.class).in(HostVO_.clusterUuid, clusterUuids) - .notIn(HostVO_.state, asList(HostState.PreMaintenance, HostState.Maintenance)) - .eq(HostVO_.status, HostStatus.Connected).list(); - List hvinvs = HostInventory.valueOf(hosts); - + public void attachL2NetworkToHosts(L2VxlanNetworkInventory vxlan, List hvinvs, Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("attach-hardware-vxlan-%s-on-hosts", vxlan.getUuid())); chain.then(new NoRollbackFlow() { @@ -122,18 +111,128 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + @Override + public void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion) { + List clusterUuids = Q.New(L2NetworkClusterRefVO.class).eq(L2NetworkClusterRefVO_.l2NetworkUuid, vxlan.getPoolUuid()) + .select(L2NetworkClusterRefVO_.clusterUuid).listValues(); + if (clusterUuids == null || clusterUuids.isEmpty()) { + logger.debug(String.format("no cluster attached to hardware vxlan network[uuid:%s, name:%s]", + vxlan.getUuid(), vxlan.getName())); + completion.success(); + return; + } + + List hosts = Q.New(HostVO.class).in(HostVO_.clusterUuid, clusterUuids) + .notIn(HostVO_.state, asList(HostState.PreMaintenance, HostState.Maintenance)) + .eq(HostVO_.status, HostStatus.Connected).list(); + List hvinvs = HostInventory.valueOf(hosts); + + attachL2NetworkToHosts(vxlan, hvinvs, completion); + } + @Override public void deleteHook(Completion completion) { - deleteVxlanNetworkOnSdnController((VxlanNetworkVO) self, new Completion(completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-hardware-vxlan")); + chain.then(new NoRollbackFlow() { + final String __name__ = "delete-hardware-vxlan-from-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + deleteVxlanNetworkOnSdnController((VxlanNetworkVO) self, new Completion(completion) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + @Override + public void run(FlowTrigger trigger, Map data) { + HardwareVxlanNetwork.super.deleteL2Bridge(null, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).done(new FlowDoneHandler(completion) { @Override - public void success() { + public void handle(Map data) { completion.success(); } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + + // called by handle(DetachL2NetworkFromClusterMsg msg) + @Override + protected void deleteL2Bridge(List clusterUuids, Completion completion) { + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("detach-hardware-vxlan")); + chain.then(new NoRollbackFlow() { + final String __name__ = "detach-hardware-vxlan-from-sdn"; @Override - public void fail(ErrorCode errorCode) { + public void run(FlowTrigger trigger, Map data) { + L2VxlanNetworkInventory vxlan = getSelfInventory(); + HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); + SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + controller.detachL2NetworkFromCluster(vxlan, clusterUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).then(new NoRollbackFlow() { + final String __name__ = "detach-hardware-vxlan-from-host"; + + @Override + public void run(FlowTrigger trigger, Map data) { + HardwareVxlanNetwork.super.deleteL2Bridge(clusterUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.next(); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { completion.success(); } - }); + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java index 459e730a59c..15da376c78e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkExtensionPoint.java @@ -1,13 +1,14 @@ package org.zstack.sdnController.hardwareVxlan; import org.zstack.header.core.Completion; +import org.zstack.header.network.l2.APICreateL2NetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import java.util.List; public interface HardwareVxlanNetworkExtensionPoint { - void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); - void attachL2NetworkToClusterOnSdnController(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion); + void createVxlanNetworkOnSdnController(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion); + void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, APICreateL2NetworkMsg msg, Completion completion); void deleteVxlanNetworkOnSdnController(VxlanNetworkVO vo, Completion completion); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java index 811b390e434..bc356a6a4c5 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkFactory.java @@ -23,6 +23,10 @@ import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.vm.VmInstanceMigrateExtensionPoint; import org.zstack.header.vm.VmNicInventory; @@ -30,16 +34,17 @@ import org.zstack.network.l2.L2NetworkCascadeFilterExtensionPoint; import org.zstack.network.l2.L2NetworkDefaultMtu; import org.zstack.network.l2.L2NetworkManager; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; +import org.zstack.network.l2.L2NetworkSystemTags; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.l2.vxlan.vxlanNetworkPool.AllocateVniMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.AllocateVniReply; -import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; import org.zstack.network.service.NetworkServiceGlobalConfig; import org.zstack.resourceconfig.ResourceConfigFacade; -import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.*; +import org.zstack.tag.SystemTagCreator; +import org.zstack.tag.TagManager; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -49,8 +54,9 @@ import java.util.Map; import java.util.stream.Collectors; -import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; /** * Created by shixin.ruan on 09/17/2019. @@ -69,6 +75,8 @@ public class HardwareVxlanNetworkFactory implements L2NetworkFactory, VmInstance private L2NetworkManager l2Mgr; @Autowired private ResourceConfigFacade rcf; + @Autowired + private TagManager tagMgr; @Override public L2NetworkType getType() { @@ -78,12 +86,22 @@ public L2NetworkType getType() { @Override public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { APICreateL2HardwareVxlanNetworkMsg amsg = (APICreateL2HardwareVxlanNetworkMsg) msg; - VxlanNetworkVO vo = new VxlanNetworkVO(ovo); + HardwareL2VxlanNetworkVO vo = new HardwareL2VxlanNetworkVO(ovo); + HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(amsg.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); + SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + if (sdn == null) { + completion.fail(operr("can not find sdn controller %s", poolVO.getSdnControllerUuid())); + return; + } + SdnControllerL2 controller = sdnControllerManager.getSdnControllerL2(sdn); + vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setPoolUuid((amsg.getPoolUuid())); - VxlanNetworkPoolVO poolVO = dbf.findByUuid(vo.getPoolUuid(), VxlanNetworkPoolVO.class); + vo.setPoolUuid(amsg.getPoolUuid()); vo.setPhysicalInterface(poolVO.getPhysicalInterface()); vo.setVni(0); + if (amsg.getVlan() != null) { + vo.setVlan(amsg.getVlan()); + } HardwareVxlanNetwork hardwareVxlan = new HardwareVxlanNetwork(vo); @@ -99,16 +117,7 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(vo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - if (poolVO == null || poolVO.getSdnControllerUuid() == null) { - completion.fail(argerr("there is no sdn controller for vxlan pool [uuid:%s]", vxlan.getPoolUuid())); - return; - } - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - SdnController controller = sdnControllerManager.getSdnController(sdn); - - controller.preCreateVxlanNetwork(vxlan, msg.getSystemTags(), new Completion(trigger) { + controller.preCreateVxlanNetwork(HardwareL2VxlanNetworkInventory.valueOf(vo), msg.getSystemTags(), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -140,9 +149,21 @@ public void run(MessageReply reply) { AllocateVniReply r = reply.castReply(); vo.setVni(r.getVni()); - vo.setVirtualNetworkId(vo.getVni()); + vo.setVirtualNetworkId(r.getVni()); dbf.persist(vo); + tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), L2NetworkVO.class.getSimpleName()); + + SystemTagCreator creator = L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID.newSystemTagCreator(vo.getUuid()); + creator.ignoreIfExisting = true; + creator.inherent = false; + creator.setTagByTokens( + map( + e(L2NetworkSystemTags.L2_NETWORK_SDN_CONTROLLER_UUID_TOKEN, poolVO.getSdnControllerUuid()) + ) + ); + creator.create(); + data.put(SdnControllerConstant.Params.VXLAN_NETWORK.toString(), vo); trigger.next(); } @@ -151,7 +172,6 @@ public void run(MessageReply reply) { @Override public void rollback(FlowRollback trigger, Map data) { - /* no need to release vni because vni is saved in VxlanNetworkVO */ trigger.rollback(); } }); @@ -160,9 +180,9 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - hardwareVxlan.createVxlanNetworkOnSdnController(vxlan, msg.getSystemTags(), new Completion(trigger) { + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + hardwareVxlan.createVxlanNetworkOnSdnController(vxlan, msg, new Completion(trigger) { @Override public void success() { trigger.next(); @@ -177,7 +197,7 @@ public void fail(ErrorCode errorCode) { @Override public void rollback(FlowRollback trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); hardwareVxlan.deleteVxlanNetworkOnSdnController(ovo, new Completion(trigger) { @Override public void success() { @@ -196,12 +216,8 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - - SdnController controller = sdnControllerManager.getSdnController(sdn); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); controller.postCreateVxlanNetwork(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -220,12 +236,8 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - - SdnController controller = sdnControllerManager.getSdnController(sdn); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); controller.preAttachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -244,9 +256,9 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO vov = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(vov); - hardwareVxlan.attachL2NetworkToClusterOnSdnController(vxlan, msg.getSystemTags(), new Completion(trigger) { + HardwareL2VxlanNetworkVO vov = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vov); + hardwareVxlan.attachL2NetworkToCluster(vxlan, msg, new Completion(trigger) { @Override public void success() { trigger.next(); @@ -270,13 +282,15 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); + List clusterUuids = HardwareL2VxlanNetworkPoolInventory.valueOf(poolVO).getAttachedClusterUuids(); + if (clusterUuids.isEmpty()) { + trigger.next(); + return; + } - SdnController controller = sdnControllerManager.getSdnController(sdn); - controller.attachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + controller.attachL2NetworkToCluster(vxlan, clusterUuids, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -291,7 +305,20 @@ public void fail(ErrorCode errorCode) { @Override public void rollback(FlowRollback trigger, Map data) { - trigger.rollback(); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + + controller.detachL2NetworkFromCluster(vxlan, null, new Completion(trigger) { + @Override + public void success() { + trigger.rollback(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.rollback(); + } + }); } }); flow(new NoRollbackFlow() { @@ -299,12 +326,9 @@ public void rollback(FlowRollback trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - VxlanNetworkVO ovo = (VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(ovo); - HardwareL2VxlanNetworkPoolVO poolVO = dbf.findByUuid(vxlan.getPoolUuid(), HardwareL2VxlanNetworkPoolVO.class); - SdnControllerVO sdn = dbf.findByUuid(poolVO.getSdnControllerUuid(), SdnControllerVO.class); - - SdnController controller = sdnControllerManager.getSdnController(sdn); + HardwareL2VxlanNetworkVO ovo = (HardwareL2VxlanNetworkVO)data.get(SdnControllerConstant.Params.VXLAN_NETWORK.toString()); + HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(ovo); + controller.postAttachL2NetworkToCluster(vxlan, msg.getSystemTags(), new Completion(trigger) { @Override public void success() { @@ -337,13 +361,14 @@ public void handle(Map data) { dbf.persistCollection(refs); } - completion.success(L2VxlanNetworkInventory.valueOf(dbf.findByUuid(vo.getUuid(), VxlanNetworkVO.class))); + completion.success(HardwareL2VxlanNetworkInventory.valueOf(dbf.findByUuid(vo.getUuid(), + HardwareL2VxlanNetworkVO.class))); } }); error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - dbf.removeByPrimaryKey(vo.getUuid(), VxlanNetworkVO.class); + dbf.removeByPrimaryKey(vo.getUuid(), HardwareL2VxlanNetworkVO.class); completion.fail(errCode); } }); @@ -427,11 +452,11 @@ public Integer getDefaultMtu(L2NetworkInventory inv) { @Override public Integer getL2NetworkVni(String l2NetworkUuid, String hostUuid) { - VxlanNetworkVO vxlan = dbf.findByUuid(l2NetworkUuid, VxlanNetworkVO.class); + HardwareL2VxlanNetworkVO vxlan = dbf.findByUuid(l2NetworkUuid, HardwareL2VxlanNetworkVO.class); HostInventory host = HostInventory.valueOf(dbf.findByUuid(hostUuid, HostVO.class)); HardwareVxlanHelper.VxlanHostMappingStruct struct = HardwareVxlanHelper.getHardwareVxlanMappingVxlanId( - L2VxlanNetworkInventory.valueOf(vxlan), host); + HardwareL2VxlanNetworkInventory.valueOf(vxlan), host); return struct.getVlanId(); } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java index 213e426abb2..f16da37a90e 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPool.java @@ -6,28 +6,34 @@ import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.Q; +import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.core.Completion; import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.HostConstant; +import org.zstack.header.host.HostInventory; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.*; -import org.zstack.network.l2.vxlan.vtep.APICreateVxlanVtepMsg; -import org.zstack.network.l2.vxlan.vtep.CreateVtepMsg; -import org.zstack.network.l2.vxlan.vtep.DeleteVtepMsg; -import org.zstack.network.l2.vxlan.vtep.PopulateVtepPeersMsg; +import org.zstack.network.l2.vxlan.vtep.*; +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; import org.zstack.network.l2.vxlan.vxlanNetworkPool.*; +import org.zstack.sdnController.SdnControllerFactory; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerManager; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; -import java.util.List; +import java.util.*; -import static org.zstack.core.Platform.argerr; +import static org.zstack.core.Platform.operr; /** * Created by shixin.ruan on 09/17/2019. @@ -47,6 +53,7 @@ private HardwareL2VxlanNetworkPoolVO getSelf1() { return (HardwareL2VxlanNetworkPoolVO) self; } + @Override protected HardwareL2VxlanNetworkPoolInventory getSelfInventory() { return HardwareL2VxlanNetworkPoolInventory.valueOf(getSelf1()); } @@ -77,8 +84,149 @@ protected void afterDetachVxlanPoolFromCluster(APIDetachL2NetworkFromClusterMsg } @Override - protected void afterAttachVxlanPoolFromClusterFailed(APIAttachL2NetworkToClusterMsg msg) { - super.afterAttachVxlanPoolFromClusterFailed(msg); + public void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List hosts, boolean applyToSdn, final Completion completion) { + List vxlanVos = Q.New(VxlanNetworkVO.class) + .eq(VxlanNetworkVO_.poolUuid, self.getUuid()).list(); + SdnControllerVO vo = dbf.findByUuid(getSelf1().getSdnControllerUuid(), SdnControllerVO.class); + SdnControllerFactory factory = sdnControllerManager.getSdnControllerFactory(vo.getVendorType()); + if (factory == null) { + completion.fail(operr("there is no sdn controller factory for sdn controller type:%s", vo.getVendorType())); + return; + } + + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("prepare-l2-%s-on-hosts", self.getUuid())); + chain.then(new NoRollbackFlow() { + String __name__ = "check-physical-interface"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + List cmsgs = new ArrayList(); + for (HostInventory h : hosts) { + CheckNetworkPhysicalInterfaceMsg cmsg = new CheckNetworkPhysicalInterfaceMsg(); + cmsg.setHostUuid(h.getUuid()); + cmsg.setPhysicalInterface(self.getPhysicalInterface()); + bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, h.getUuid()); + cmsgs.add(cmsg); + } + + if (cmsgs.isEmpty()) { + trigger.next(); + return; + } + + new While<>(cmsgs).step((msg, wcomp) -> { + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + wcomp.done(); + } else { + wcomp.addError(reply.getError()); + wcomp.allDone(); + } + } + }); + }, L2NetworkConstant.MAX_PARALLEL_HOST_MSG).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().isEmpty()) { + trigger.next(); + } else { + trigger.fail(errorCodeList.getCauses().get(0)); + } + } + }); + } + }).then(new NoRollbackFlow() { + String __name__ = "realize-vxlan-network"; + + @Override + public void run(final FlowTrigger trigger, Map data) { + if (vxlanVos.isEmpty()) { + trigger.next(); + return; + } + + new While<>(vxlanVos).each((vxlan, whileCompletion) -> { + HardwareVxlanNetwork nw = new HardwareVxlanNetwork(vxlan); + nw.attachL2NetworkToHosts(L2VxlanNetworkInventory.valueOf(vxlan), + hosts, new Completion(whileCompletion) { + @Override + public void success() { + whileCompletion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + whileCompletion.addError(errorCode); + whileCompletion.allDone(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + trigger.fail(errorCodeList.getCauses().get(0)); + } else { + trigger.next(); + } + } + + }); + } + + }).then(new NoRollbackFlow() { + String __name__ = "attach-vxlan-network-on-sdn"; + @Override + public void run(FlowTrigger trigger, Map data) { + if (vxlanVos.isEmpty()) { + trigger.next(); + return; + } + + if (!applyToSdn) { + trigger.next(); + return; + } + + SdnControllerL2 controller = factory.getSdnControllerL2(vo); + new While<>(vxlanVos).each((vxlan, whileCompletion) -> { + controller.attachL2NetworkToHosts(L2VxlanNetworkInventory.valueOf(vxlan), hosts, new ArrayList<>(), new Completion(whileCompletion) { + @Override + public void success() { + whileCompletion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + whileCompletion.addError(errorCode); + whileCompletion.allDone(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + trigger.fail(errorCodeList.getCauses().get(0)); + } else { + trigger.next(); + } + } + + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); } @Override diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java index 769125d6312..e56adeeda2d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/HardwareVxlanNetworkPoolFactory.java @@ -12,9 +12,14 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.APICreateL3NetworkMsg; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory; +import org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkChecker; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO; +import org.zstack.network.l3.L3NetworkHelper; import org.zstack.sdnController.header.*; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; @@ -45,9 +50,10 @@ public L2NetworkType getType() { @Override @Transactional public void createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg, ReturnValueCompletion completion) { + APICreateL2HardwareVxlanNetworkPoolMsg vxlanMsg = (APICreateL2HardwareVxlanNetworkPoolMsg) msg; HardwareL2VxlanNetworkPoolVO vo = new HardwareL2VxlanNetworkPoolVO(ovo); vo.setAccountUuid(msg.getSession().getAccountUuid()); - vo.setSdnControllerUuid(((APICreateL2HardwareVxlanNetworkPoolMsg) msg).getSdnControllerUuid()); + vo.setSdnControllerUuid(vxlanMsg.getSdnControllerUuid()); vo = dbf.persistAndRefresh(vo); HardwareL2VxlanNetworkPoolInventory inv = HardwareL2VxlanNetworkPoolInventory.valueOf(vo); @@ -103,7 +109,19 @@ private void validate(APIAttachL2NetworkToClusterMsg msg) { vxlanInterceptor.validateSystemTagFormat(msg.getSystemTags()); } - vxlanInterceptor.validateVniRangeOverlap(L2NetworkInventory.valueOf(l2NetworkVO), msg.getClusterUuid()); + String sdnUuid = L3NetworkHelper.getSdnControllerUuidFromL2Uuid(msg.getL2NetworkUuid()); + if (sdnUuid == null) { + return; + } + + SdnControllerVO sdnControllerVO = dbf.findByUuid(sdnUuid, SdnControllerVO.class); + if (sdnControllerVO == null) { + logger.warn(String.format("skip VNI overlap validation: SDN controller[%s] not found", sdnUuid)); + return; + } + if (SdnControllerConstant.H3C_VCFC_CONTROLLER.equals(sdnControllerVO.getVendorType())) { + vxlanInterceptor.validateVniRangeOverlap(L2NetworkInventory.valueOf(l2NetworkVO), msg.getClusterUuid()); + } } private void validate(APICreateL3NetworkMsg msg) { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java index 88ec1bdc2d6..2c90803b403 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMConnectExtensionForHardwareVxlanNetwork.java @@ -20,7 +20,7 @@ import org.zstack.kvm.KVMHostConnectedContext; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; -import org.zstack.sdnController.header.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import javax.persistence.TypedQuery; import java.util.ArrayList; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java index 3ae1025f684..71ccb7db63d 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java @@ -13,6 +13,7 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmNicInventory; import org.zstack.kvm.*; @@ -21,8 +22,6 @@ import org.zstack.kvm.KVMAgentCommands.CreateVlanBridgeResponse; import org.zstack.kvm.KVMAgentCommands.NicTO; import org.zstack.network.l2.L2NetworkManager; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; -import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; import org.zstack.network.service.MtuGetter; import org.zstack.sdnController.header.*; import org.zstack.tag.SystemTagCreator; @@ -49,7 +48,8 @@ private String makeBridgeName(String l2Uuid, int vlan) { @Override public void realize(final L2NetworkInventory l2Network, final String hostUuid, boolean noStatusCheck, final Completion completion) { - final L2VxlanNetworkInventory vxlan = (L2VxlanNetworkInventory) l2Network; + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + final HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); HostInventory host = HostInventory.valueOf(dbf.findByUuid(hostUuid, HostVO.class)); HardwareVxlanHelper.VxlanHostMappingStruct struct = HardwareVxlanHelper.getHardwareVxlanMappingVxlanId(vxlan, host); @@ -112,7 +112,8 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, f } public void check(final L2NetworkInventory l2Network, final String hostUuid, boolean noStatusCheck, final Completion completion) { - final L2VxlanNetworkInventory vxlan = (L2VxlanNetworkInventory) l2Network; + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + final HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); HostInventory host = HostInventory.valueOf(dbf.findByUuid(hostUuid, HostVO.class)); HardwareVxlanHelper.VxlanHostMappingStruct struct = HardwareVxlanHelper.getHardwareVxlanMappingVxlanId(vxlan, host); @@ -182,7 +183,8 @@ public VSwitchType getSupportedVSwitchType() { @Override public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInventory l3Network, VmNicInventory nic) { - L2VxlanNetworkInventory vxlan = L2VxlanNetworkInventory.valueOf(dbf.findByUuid(l2Network.getUuid(), VxlanNetworkVO.class)); + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + final HardwareL2VxlanNetworkInventory vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); VmInstanceVO vm = dbf.findByUuid(nic.getVmInstanceUuid(), VmInstanceVO.class); /* TODO vm must have hostUuid */ @@ -199,7 +201,7 @@ public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInven @Override public String getBridgeName(L2NetworkInventory l2Network) { - VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), VxlanNetworkVO.class); + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); /* * to be done */ @@ -207,6 +209,43 @@ public String getBridgeName(L2NetworkInventory l2Network) { } public void delete(L2NetworkInventory l2Network, String hostUuid, Completion completion) { - completion.success(); + HardwareL2VxlanNetworkVO vo = dbf.findByUuid(l2Network.getUuid(), HardwareL2VxlanNetworkVO.class); + HardwareL2VxlanNetworkInventory l2Vxlan = HardwareL2VxlanNetworkInventory.valueOf(vo); + KVMAgentCommands.DeleteVlanBridgeCmd cmd = new KVMAgentCommands.DeleteVlanBridgeCmd(); + cmd.setPhysicalInterfaceName(l2Network.getPhysicalInterface()); + cmd.setBridgeName(makeBridgeName(l2Vxlan.getUuid(), l2Vxlan.getVlan())); + cmd.setVlan(l2Vxlan.getVlan()); + cmd.setL2NetworkUuid(l2Network.getUuid()); + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(hostUuid); + msg.setCommand(cmd); + msg.setPath(KVMConstant.KVM_DELETE_L2VLAN_NETWORK_PATH); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, hostUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply hreply = reply.castReply(); + KVMAgentCommands.DeleteVlanBridgeResponse rsp = hreply.toResponse(KVMAgentCommands.DeleteVlanBridgeResponse.class); + if (!rsp.isSuccess()) { + ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s], because %s", + cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2Vxlan.getVlan(), hostUuid, rsp.getError()); + completion.fail(err); + return; + } + + String message = String.format( + "successfully delete bridge[%s] for l2Network[uuid:%s, type:%s, vlan:%s] on kvm host[uuid:%s]", cmd + .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2Vxlan.getVlan(), hostUuid); + logger.debug(message); + + completion.success(); + } + }); } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java index f12ecb4dc40..df44da2ee64 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanPoolNetworkBackend.java @@ -20,7 +20,7 @@ import org.zstack.kvm.KVMConstant; import org.zstack.kvm.KVMHostUtils; import org.zstack.network.service.MtuGetter; -import org.zstack.sdnController.header.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java index afc08a1997c..8e8ffdffbc9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEvent.java @@ -1,6 +1,8 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; @RestResponse(allTo = "inventory") diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy index 19500a17b76..3973ff9b695 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerEventDoc_zh_cn.groovy @@ -1,6 +1,7 @@ package org.zstack.sdnController.header import org.zstack.header.errorcode.ErrorCode +import org.zstack.header.network.sdncontroller.SdnControllerInventory doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java index 7346df37dff..2f544dd627a 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsg.java @@ -4,6 +4,8 @@ import org.zstack.header.identity.Action; import org.zstack.header.log.NoLogging; import org.zstack.header.message.*; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.other.APIAuditor; import org.zstack.header.rest.RestRequest; import org.zstack.header.tag.TagResourceType; @@ -20,6 +22,9 @@ public class APIAddSdnControllerMsg extends APICreateMessage implements APIAudit @APIParam(maxLength = 255) private String vendorType; + @APIParam(required = false, maxLength = 255) + private String vendorVersion; + @APIParam(maxLength = 255) private String name; @@ -29,10 +34,10 @@ public class APIAddSdnControllerMsg extends APICreateMessage implements APIAudit @APIParam(maxLength = 255) private String ip; - @APIParam(maxLength = 255) + @APIParam(required = false, maxLength = 255) private String userName; - @APIParam(maxLength = 255) + @APIParam(required = false, maxLength = 255) @NoLogging private String password; @@ -44,6 +49,14 @@ public void setVendorType(String vendorType) { this.vendorType = vendorType; } + public String getVendorVersion() { + return vendorVersion; + } + + public void setVendorVersion(String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public String getIp() { return ip; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy index 0b010c4d087..8c2c6af8e7c 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIAddSdnControllerMsgDoc_zh_cn.groovy @@ -63,7 +63,7 @@ doc { desc "" location "body" type "String" - optional false + optional true since "3.7" } column { @@ -72,7 +72,7 @@ doc { desc "" location "body" type "String" - optional false + optional true since "3.7" } column { @@ -111,6 +111,15 @@ doc { optional true since "3.7" } + column { + name "zoneUuid" + enclosedIn "params" + desc "区域UUID" + location "body" + type "String" + optional true + since "5.3.0" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java new file mode 100644 index 00000000000..a0852ec4ce9 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEvent.java @@ -0,0 +1,51 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.rest.RestResponse; + +/** + * API event for changing SDN controller configuration + */ +@RestResponse(allTo = "inventory") +public class APIChangeSdnControllerEvent extends APIEvent { + + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APIChangeSdnControllerEvent() { + super(null); + } + + public APIChangeSdnControllerEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APIChangeSdnControllerEvent __example__() { + APIChangeSdnControllerEvent event = new APIChangeSdnControllerEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType("H3C-VCFC"); + inventory.setName("updated-sdn-controller"); + inventory.setDescription("Updated SDN controller configuration"); + inventory.setIp("192.168.1.100"); + inventory.setUsername("admin"); + inventory.setPassword("newpassword"); + inventory.setCreateDate(new java.sql.Timestamp(org.zstack.header.message.DocUtils.date)); + inventory.setLastOpDate(new java.sql.Timestamp(org.zstack.header.message.DocUtils.date)); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..e13d620d737 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.header.network.sdncontroller.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "Upate SDN Controller" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APIChangeSdnControllerEvent.inventory" + desc "Updated SDN controller inventory after change operation" + type "SdnControllerInventory" + since "5.3.28" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.sdnController.header.APIChangeSdnControllerEvent.error" + desc "Error code, null if operation succeeds, non-null if operation fails",false + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java new file mode 100644 index 00000000000..cd57adda7d9 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsg.java @@ -0,0 +1,87 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.message.DefaultTimeout; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * API message for changing SDN controller configuration + */ +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{uuid}/actions", + method = HttpMethod.PUT, + responseClass = APIChangeSdnControllerEvent.class, + isAction = true +) +@DefaultTimeout(timeunit = TimeUnit.MINUTES, value = 30) +public class APIChangeSdnControllerMsg extends APIMessage implements SdnControllerMessage { + + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + @APIParam(required = false, maxLength = 255) + private String userName; + + @APIParam(required = false, maxLength = 255) + @NoLogging + private String password; + + @APIParam(required = false, maxLength = 255) + private List vlanRanges; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String getSdnControllerUuid() { + return uuid; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public List getVlanRanges() { + return vlanRanges; + } + + public void setVlanRanges(List vlanRanges) { + this.vlanRanges = vlanRanges; + } + + public static APIChangeSdnControllerMsg __example__() { + APIChangeSdnControllerMsg msg = new APIChangeSdnControllerMsg(); + msg.setUuid(uuid()); + msg.setUserName("sdnuser"); + msg.setPassword("newpassword"); + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..dcfc216e75f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIChangeSdnControllerMsgDoc_zh_cn.groovy @@ -0,0 +1,85 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APIChangeSdnControllerEvent + +doc { + title "ChangeSdnController" + + category "SdnController" + + desc """Changes SDN controller""" + + rest { + request { + url "PUT /v1/sdn-controllers/{uuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIChangeSdnControllerMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "changeSdnController" + desc "UUID of the SDN controller resource" + location "url" + type "String" + optional false + since "5.3.28" + } + column { + name "userName" + enclosedIn "changeSdnController" + desc "New user name for the SDN controller" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "password" + enclosedIn "changeSdnController" + desc "New password for the SDN controller" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "systemTags" + enclosedIn "" + desc "System tags" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "userTags" + enclosedIn "" + desc "User tags" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "vlanRanges" + enclosedIn "changeSdnController" + desc "" + location "body" + type "List" + optional true + since "5.3.28" + } + } + } + + response { + clz APIChangeSdnControllerEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java index 58308f1ae33..55f71c8f8e5 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsg.java @@ -6,10 +6,14 @@ import org.zstack.header.message.OverriddenApiParam; import org.zstack.header.message.OverriddenApiParams; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; import org.zstack.header.zone.ZoneVO; import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolConstant; +@TagResourceType(SdnControllerVO.class) @Action(category = VxlanNetworkPoolConstant.ACTION_CATEGORY) @OverriddenApiParams({ @OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)), @@ -28,6 +32,12 @@ public class APICreateL2HardwareVxlanNetworkMsg extends APICreateL2NetworkMsg { @APIParam(required = true, resourceType = HardwareL2VxlanNetworkPoolVO.class) private String poolUuid; + @APIParam(required = false, resourceType = H3cSdnControllerTenantVO.class) + private String h3cTenantUuid; + + @APIParam(required = false, numberRange = {1, 4095}) + private Integer vlan; + public Integer getVni() { return vni; } @@ -49,6 +59,22 @@ public void setPoolUuid(String poolUuid) { this.poolUuid = poolUuid; } + public String getH3cTenantUuid() { + return h3cTenantUuid; + } + + public void setH3cTenantUuid(String h3cTenantUuid) { + this.h3cTenantUuid = h3cTenantUuid; + } + + public Integer getVlan() { + return vlan; + } + + public void setVlan(Integer vlan) { + this.vlan = vlan; + } + public static APICreateL2HardwareVxlanNetworkMsg __example__() { APICreateL2HardwareVxlanNetworkMsg msg = new APICreateL2HardwareVxlanNetworkMsg(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy index 78b84db85aa..863f275cbe4 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkMsgDoc_zh_cn.groovy @@ -148,6 +148,24 @@ doc { optional true since "4.8.0" } + column { + name "h3cTenantUuid" + enclosedIn "params" + desc "" + location "body" + type "String" + optional true + since "5.3.28" + } + column { + name "vlan" + enclosedIn "params" + desc "" + location "body" + type "Integer" + optional true + since "5.4.0" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java index c31f48fc7b7..5841ec9e943 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolEvent.java @@ -1,6 +1,7 @@ package org.zstack.sdnController.header; import org.zstack.header.network.l2.APICreateL2NetworkEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; import org.zstack.header.rest.RestResponse; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java index efccb43fa72..17a9a7b3ea9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsg.java @@ -3,6 +3,8 @@ import org.springframework.http.HttpMethod; import org.zstack.header.message.APIParam; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; @RestRequest( diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy index 7384b3985b4..ec4edea5cc7 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APICreateL2HardwareVxlanNetworkPoolMsgDoc_zh_cn.groovy @@ -139,6 +139,24 @@ doc { optional true since "4.8.0" } + column { + name "startVlan" + enclosedIn "params" + desc "" + location "body" + type "Integer" + optional true + since "5.3.28" + } + column { + name "endVlan" + enclosedIn "params" + desc "" + location "body" + type "Integer" + optional true + since "5.3.28" + } } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java new file mode 100644 index 00000000000..e0e536b323f --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEvent.java @@ -0,0 +1,38 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by boce.wang on 06/13/2025. + */ + +@RestResponse(allTo = "inventories") +public class APIPullSdnControllerTenantEvent extends APIEvent { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } + + public APIPullSdnControllerTenantEvent(){ + } + + public APIPullSdnControllerTenantEvent(String apiId) { + super(apiId); + } + + public static APIPullSdnControllerTenantEvent __example__() { + APIPullSdnControllerTenantEvent event = new APIPullSdnControllerTenantEvent(); + List inventories = new ArrayList<>(); + event.setInventories(inventories); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..a32bca97ab3 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.H3cSdnControllerTenantInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "拉取SDN控制器租户结果" + + ref { + name "inventories" + path "org.zstack.sdnController.header.APIPullSdnControllerTenantEvent.inventories" + desc "null" + type "List" + since "5.3.28" + clz H3cSdnControllerTenantInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.28" + } + ref { + name "error" + path "org.zstack.sdnController.header.APIPullSdnControllerTenantEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.28" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java new file mode 100644 index 00000000000..c2dbc23c40c --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsg.java @@ -0,0 +1,46 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + +/** + * Created by boce.wang on 06/13/2025. + */ + +@RestRequest( + path = "/sdn-controllers/{uuid}/tenant/actions", + method = HttpMethod.PUT, + responseClass = APIPullSdnControllerTenantEvent.class, + isAction = true +) +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +public class APIPullSdnControllerTenantMsg extends APIMessage implements SdnControllerMessage { + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String getSdnControllerUuid() { + return uuid; + } + + public static APIPullSdnControllerTenantMsg __example__() { + APIPullSdnControllerTenantMsg msg = new APIPullSdnControllerTenantMsg(); + msg.setUuid(uuid()); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..420c5c2d677 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APIPullSdnControllerTenantEvent + +doc { + title "PullSdnControllerTenant" + + category "SdnController" + + desc """拉取SDN控制器租户""" + + rest { + request { + url "PUT /v1/sdn-controllers/{uuid}/tenant/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIPullSdnControllerTenantMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "pullSdnControllerTenant" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.3.28" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.28" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.28" + } + } + } + + response { + clz APIPullSdnControllerTenantEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java index fc06c781cc0..bd092b0194b 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerMsg.java @@ -2,6 +2,8 @@ import org.springframework.http.HttpMethod; import org.zstack.header.identity.Action; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.APIQueryMessage; import org.zstack.header.query.AutoQuery; import org.zstack.header.rest.RestRequest; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java index 38c251b4072..e678c696c41 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReply.java @@ -1,5 +1,6 @@ package org.zstack.sdnController.header; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.APIQueryReply; import org.zstack.header.rest.RestResponse; diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy index 955b56b0240..ddbc0982463 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIQuerySdnControllerReplyDoc_zh_cn.groovy @@ -1,6 +1,7 @@ package org.zstack.sdnController.header import org.zstack.header.errorcode.ErrorCode +import org.zstack.header.network.sdncontroller.SdnControllerInventory doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java new file mode 100644 index 00000000000..8c8b350fc20 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEvent.java @@ -0,0 +1,46 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.rest.RestResponse; + +/** + * Created by shixin.ruan on 09/19/2019. + */ +@RestResponse(allTo = "inventory") +public class APIReconnectSdnControllerEvent extends APIEvent { + private SdnControllerInventory inventory; + + public SdnControllerInventory getInventory() { + return inventory; + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public APIReconnectSdnControllerEvent() { + } + + public APIReconnectSdnControllerEvent(String apiId) { + super(apiId); + } + + public static APIReconnectSdnControllerEvent __example__() { + APIReconnectSdnControllerEvent event = new APIReconnectSdnControllerEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } + +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..658780d216a --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.header.network.sdncontroller.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "重连SDN控制器清单" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APIReconnectSdnControllerEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APIReconnectSdnControllerEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java new file mode 100644 index 00000000000..0ecdf5c9615 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsg.java @@ -0,0 +1,41 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + +/** + * Created by shixin.ruan on 01/04/2024. + */ +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/actions", + method = HttpMethod.PUT, + responseClass = APIReconnectSdnControllerEvent.class, + isAction = true +) +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +public class APIReconnectSdnControllerMsg extends APIMessage implements SdnControllerMessage { + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public static APIReconnectSdnControllerMsg __example__() { + APIReconnectSdnControllerMsg msg = new APIReconnectSdnControllerMsg(); + msg.setSdnControllerUuid(uuid()); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..4343981688d --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIReconnectSdnControllerMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APIReconnectSdnControllerEvent + +doc { + title "ReconnectSdnController" + + category "SdnController" + + desc """重连SDN控制器""" + + rest { + request { + url "PUT /v1/sdn-controllers/{sdnControllerUuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIReconnectSdnControllerMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "reconnectSdnController" + desc "" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APIReconnectSdnControllerEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java index b354db57361..78c805b44d0 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIRemoveSdnControllerMsg.java @@ -4,6 +4,9 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; @Action(category = SdnControllerConstant.ACTION_CATEGORY) @@ -12,7 +15,7 @@ method = HttpMethod.DELETE, responseClass = APIRemoveSdnControllerEvent.class ) -public class APIRemoveSdnControllerMsg extends APIDeleteMessage { +public class APIRemoveSdnControllerMsg extends APIDeleteMessage implements SdnControllerMessage { @APIParam(checkAccount = true, operationTarget = true, successIfResourceNotExisting = true, resourceType = SdnControllerVO.class) private String uuid; @@ -24,7 +27,11 @@ public void setUuid(String uuid) { this.uuid = uuid; } - + @Override + public String getSdnControllerUuid() { + return uuid; + } + public static APIRemoveSdnControllerMsg __example__() { APIRemoveSdnControllerMsg msg = new APIRemoveSdnControllerMsg(); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java new file mode 100644 index 00000000000..4014d2a6d23 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEvent.java @@ -0,0 +1,46 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISdnControllerAddHostEvent extends APIEvent { + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APISdnControllerAddHostEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public APISdnControllerAddHostEvent() { + super(null); + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APISdnControllerAddHostEvent __example__() { + APISdnControllerAddHostEvent event = new APISdnControllerAddHostEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..b7a2ac7c56c --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.header.network.sdncontroller.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "SDN控制器添加物理机清单" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerAddHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerAddHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java new file mode 100644 index 00000000000..a4d8b601cdd --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsg.java @@ -0,0 +1,152 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostVO; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}", + method = HttpMethod.POST, + responseClass = APISdnControllerAddHostEvent.class, + parameterName = "null" +) +public class APISdnControllerAddHostMsg extends APIMessage implements SdnControllerMessage { + /** + * @desc l2Network uuid + */ + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + /** + * @desc cluster uuid. See :ref:`ClusterInventory` + */ + @APIParam(resourceType = HostVO.class) + private String hostUuid; + + /** + * @desc vSwitch type + */ + @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) + private String vSwitchType = "OvnDpdk"; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(nonempty = true) + private List nicNames; + + /** + * @desc VTEP (VXLAN Tunnel End Point) IP address + */ + @APIParam(required = false) + private String vtepIp; + + /** + * @desc Netmask for the VTEP IP address + */ + @APIParam(required = false) + private String netmask; + + /** + * @desc bonding mode + */ + @APIParam(required = false) + private String bondMode; + + /** + * @desc lacp mode + */ + @APIParam(required = false) + private String lacpMode; + + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public List getNicNames() { + return nicNames; + } + + public void setNicNames(List nicNames) { + this.nicNames = nicNames; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + + public static APISdnControllerAddHostMsg __example__() { + APISdnControllerAddHostMsg msg = new APISdnControllerAddHostMsg(); + + msg.setSdnControllerUuid(uuid()); + msg.setHostUuid(uuid()); + msg.setvSwitchType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + msg.setVtepIp("192.168.1.101"); + msg.setNetmask("255.255.255.0"); + msg.setNetmask("ens1 ens2"); + msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..1183e68acac --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerAddHostMsgDoc_zh_cn.groovy @@ -0,0 +1,122 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APISdnControllerAddHostEvent + +doc { + title "SdnControllerAddHost" + + category "SdnController" + + desc """SDN控制器添加物理机""" + + rest { + request { + url "POST /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerAddHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "" + desc "SDN控制器Uuid" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "" + desc "虚拟交换机类型" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvsKernel","OvsDpdk","SRIOV") + } + column { + name "nicNames" + enclosedIn "" + desc "物理机网卡名称列表" + location "body" + type "List" + optional false + since "5.3.0" + } + column { + name "vtepIp" + enclosedIn "" + desc "物理机VTEP IP" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "netmask" + enclosedIn "" + desc "物理机VTEP IP掩码" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "bondMode" + enclosedIn "" + desc "物理机网卡bond模式" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "lacpMode" + enclosedIn "" + desc "物理机网卡LACP模式" + location "body" + type "String" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerAddHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java new file mode 100644 index 00000000000..ab86e2d07a9 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEvent.java @@ -0,0 +1,46 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISdnControllerChangeHostEvent extends APIEvent { + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APISdnControllerChangeHostEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public APISdnControllerChangeHostEvent() { + super(null); + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APISdnControllerChangeHostEvent __example__() { + APISdnControllerChangeHostEvent event = new APISdnControllerChangeHostEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..a75ee6d301d --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.header.network.sdncontroller.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "SDN控制器修改物理机清单" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerChangeHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerChangeHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java new file mode 100644 index 00000000000..2dd5780b76c --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsg.java @@ -0,0 +1,150 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostVO; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + +import java.util.List; + +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}/actions", + method = HttpMethod.PUT, + responseClass = APISdnControllerChangeHostEvent.class, + isAction = true +) +public class APISdnControllerChangeHostMsg extends APIMessage implements SdnControllerMessage { + /** + * @desc l2Network uuid + */ + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + /** + * @desc cluster uuid. See :ref:`ClusterInventory` + */ + @APIParam(resourceType = HostVO.class) + private String hostUuid; + + /** + * @desc vSwitch type + */ + @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) + private String vSwitchType = "OvnDpdk"; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(nonempty = true, required = false) + private List nicNames; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(required = false) + private String vtepIp; + + /** + * @desc physical nics used by vSwitchType + */ + @APIParam(required = false) + private String netmask; + + /** + * @desc bonding mode + */ + @APIParam(required = false) + private String bondMode; + + /** + * @desc lacp mode + */ + @APIParam(required = false) + private String lacpMode; + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public List getNicNames() { + return nicNames; + } + + public void setNicNames(List nicNames) { + this.nicNames = nicNames; + } + + public String getVtepIp() { + return vtepIp; + } + + public void setVtepIp(String vtepIp) { + this.vtepIp = vtepIp; + } + + public String getBondMode() { + return bondMode; + } + + public void setBondMode(String bondMode) { + this.bondMode = bondMode; + } + + public String getNetmask() { + return netmask; + } + + public void setNetmask(String netmask) { + this.netmask = netmask; + } + + public String getLacpMode() { + return lacpMode; + } + + public void setLacpMode(String lacpMode) { + this.lacpMode = lacpMode; + } + + public static APISdnControllerChangeHostMsg __example__() { + APISdnControllerChangeHostMsg msg = new APISdnControllerChangeHostMsg(); + + msg.setSdnControllerUuid(uuid()); + msg.setHostUuid(uuid()); + msg.setvSwitchType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + msg.setVtepIp("192.168.1.101"); + msg.setNetmask("255.255.255.0"); + msg.setNetmask("ens1 ens2"); + msg.setBondMode(L2NetworkConstant.BONDING_MODE_AB); + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..829c5465372 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerChangeHostMsgDoc_zh_cn.groovy @@ -0,0 +1,122 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APISdnControllerChangeHostEvent + +doc { + title "SdnControllerChangeHost" + + category "SdnController" + + desc """SDN控制器修改物理机""" + + rest { + request { + url "PUT /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}/actions" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerChangeHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "sdnControllerChangeHost" + desc "SDN控制器Uuid" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "sdnControllerChangeHost" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "sdnControllerChangeHost" + desc "虚拟交换机类型" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvnDpdk","OvnKernel") + } + column { + name "nicNames" + enclosedIn "sdnControllerChangeHost" + desc "物理机网卡名称列表" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "vtepIp" + enclosedIn "sdnControllerChangeHost" + desc "物理机VTEP IP" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "netmask" + enclosedIn "sdnControllerChangeHost" + desc "物理机VTEP IP掩码" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "bondMode" + enclosedIn "sdnControllerChangeHost" + desc "物理机网卡bond模式" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "lacpMode" + enclosedIn "sdnControllerChangeHost" + desc "物理机网卡LACP模式" + location "body" + type "String" + optional true + since "5.3.0" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerChangeHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java new file mode 100644 index 00000000000..8229b842df2 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEvent.java @@ -0,0 +1,46 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.rest.RestResponse; + +@RestResponse(allTo = "inventory") +public class APISdnControllerRemoveHostEvent extends APIEvent { + /** + * @desc see :ref:`SdnControllerInventory` + */ + private SdnControllerInventory inventory; + + public APISdnControllerRemoveHostEvent(String apiId) { + super(apiId); + } + + public SdnControllerInventory getInventory() { + return inventory; + } + + public APISdnControllerRemoveHostEvent() { + super(null); + } + + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + + public static APISdnControllerRemoveHostEvent __example__() { + APISdnControllerRemoveHostEvent event = new APISdnControllerRemoveHostEvent(); + SdnControllerInventory inventory = new SdnControllerInventory(); + + inventory.setUuid(uuid()); + inventory.setVendorType(SdnControllerConstant.H3C_VCFC_CONTROLLER); + inventory.setName("sdn-1"); + inventory.setDescription("sdn controller from vendor"); + inventory.setIp("192.168.1.1"); + inventory.setUsername("admin"); + inventory.setPassword("password"); + + event.setInventory(inventory); + return event; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..d84ebbca9cd --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.sdnController.header + +import org.zstack.header.network.sdncontroller.SdnControllerInventory +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "SDN控制器删除物理机清单" + + ref { + name "inventory" + path "org.zstack.sdnController.header.APISdnControllerRemoveHostEvent.inventory" + desc "null" + type "SdnControllerInventory" + since "5.3.0" + clz SdnControllerInventory.class + } + field { + name "success" + desc "" + type "boolean" + since "5.3.0" + } + ref { + name "error" + path "org.zstack.sdnController.header.APISdnControllerRemoveHostEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.3.0" + clz ErrorCode.class + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java new file mode 100644 index 00000000000..6606c033c09 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsg.java @@ -0,0 +1,72 @@ +package org.zstack.sdnController.header; + +import org.springframework.http.HttpMethod; +import org.zstack.header.host.HostVO; +import org.zstack.header.identity.Action; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.rest.RestRequest; + + +@Action(category = SdnControllerConstant.ACTION_CATEGORY) +@RestRequest( + path = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}", + method = HttpMethod.DELETE, + responseClass = APISdnControllerRemoveHostEvent.class +) +public class APISdnControllerRemoveHostMsg extends APIMessage implements SdnControllerMessage { + /** + * @desc l2Network uuid + */ + @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) + private String sdnControllerUuid; + /** + * @desc cluster uuid. See :ref:`ClusterInventory` + */ + @APIParam(resourceType = HostVO.class) + private String hostUuid; + + /** + * @desc vSwitch type + */ + @APIParam(required = false, validValues = {"OvnDpdk", "OvnKernel"}) + private String vSwitchType = "OvnDpdk"; + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + + public static APISdnControllerRemoveHostMsg __example__() { + APISdnControllerRemoveHostMsg msg = new APISdnControllerRemoveHostMsg(); + + msg.setSdnControllerUuid(uuid()); + msg.setHostUuid(uuid()); + msg.setvSwitchType("OvnDpdk"); + + return msg; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..6e52d34edad --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APISdnControllerRemoveHostMsgDoc_zh_cn.groovy @@ -0,0 +1,77 @@ +package org.zstack.sdnController.header + +import org.zstack.sdnController.header.APISdnControllerRemoveHostEvent + +doc { + title "SdnControllerRemoveHost" + + category "SdnController" + + desc """SDN控制器移除物理机""" + + rest { + request { + url "DELETE /v1/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}" + + header (Authorization: 'OAuth the-session-uuid') + + clz APISdnControllerRemoveHostMsg.class + + desc """""" + + params { + + column { + name "sdnControllerUuid" + enclosedIn "" + desc "SDN控制器Uuid" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "hostUuid" + enclosedIn "" + desc "物理机UUID" + location "url" + type "String" + optional false + since "5.3.0" + } + column { + name "vSwitchType" + enclosedIn "" + desc "虚拟交换机类型" + location "body" + type "String" + optional true + since "5.3.0" + values ("OvnDpdk","OvnKernel") + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "body" + type "List" + optional true + since "5.3.0" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "body" + type "List" + optional true + since "5.3.0" + } + } + } + + response { + clz APISdnControllerRemoveHostEvent.class + } + } +} \ No newline at end of file diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java index b38e3268fa4..3d720302ef9 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEvent.java @@ -1,6 +1,8 @@ package org.zstack.sdnController.header; import org.zstack.header.message.APIEvent; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.rest.RestResponse; /** diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy index 0205e1be276..5977a9e0a92 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerEventDoc_zh_cn.groovy @@ -1,6 +1,7 @@ package org.zstack.sdnController.header import org.zstack.header.errorcode.ErrorCode +import org.zstack.header.network.sdncontroller.SdnControllerInventory doc { diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java index d6f94e18bed..7ec4d9f4029 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIUpdateSdnControllerMsg.java @@ -4,7 +4,9 @@ import org.zstack.header.identity.Action; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; -import org.zstack.header.network.l2.L2NetworkMessage; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.rest.RestRequest; /** @@ -17,7 +19,7 @@ isAction = true ) @Action(category = SdnControllerConstant.ACTION_CATEGORY) -public class APIUpdateSdnControllerMsg extends APIMessage implements L2NetworkMessage { +public class APIUpdateSdnControllerMsg extends APIMessage implements SdnControllerMessage { @APIParam(resourceType = SdnControllerVO.class, checkAccount = true, operationTarget = true) private String uuid; @APIParam(maxLength = 255, required = false) @@ -50,10 +52,10 @@ public void setDescription(String description) { } @Override - public String getL2NetworkUuid() { + public String getSdnControllerUuid() { return uuid; } - + public static APIUpdateSdnControllerMsg __example__() { APIUpdateSdnControllerMsg msg = new APIUpdateSdnControllerMsg(); msg.setUuid(uuid()); diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java new file mode 100644 index 00000000000..787f93dbd9d --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventory.java @@ -0,0 +1,135 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.query.ExpandedQueries; +import org.zstack.header.query.ExpandedQuery; +import org.zstack.header.search.Inventory; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by boce.wang on 06/16/2025. + */ +@Inventory(mappingVOClass = H3cSdnControllerTenantVO.class) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "sdnController", inventoryClass = SdnControllerInventory.class, + foreignKey = "sdnControllerUuid", expandedInventoryKey = "uuid") +}) +public class H3cSdnControllerTenantInventory { + private String uuid; + private String sdnControllerUuid; + private String tenantUuid; + private String vdsUuid; + private String tenantName; + private String vdsName; + private String cloudDomainName; + private String state; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static H3cSdnControllerTenantInventory valueOf(H3cSdnControllerTenantVO vo) { + H3cSdnControllerTenantInventory inv = new H3cSdnControllerTenantInventory(); + inv.setUuid(vo.getUuid()); + inv.setSdnControllerUuid(vo.getSdnControllerUuid()); + inv.setTenantUuid(vo.getTenantUuid()); + inv.setVdsUuid(vo.getVdsUuid()); + inv.setTenantName(vo.getTenantName()); + inv.setVdsName(vo.getVdsName()); + inv.setCloudDomainName(vo.getCloudDomainName()); + inv.setState(vo.getState()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList(); + for (H3cSdnControllerTenantVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getTenantUuid() { + return tenantUuid; + } + + public void setTenantUuid(String tenantUuid) { + this.tenantUuid = tenantUuid; + } + + public String getVdsUuid() { + return vdsUuid; + } + + public void setVdsUuid(String vdsUuid) { + this.vdsUuid = vdsUuid; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getVdsName() { + return vdsName; + } + + public void setVdsName(String vdsName) { + this.vdsName = vdsName; + } + + public String getCloudDomainName() { + return cloudDomainName; + } + + public void setCloudDomainName(String cloudDomainName) { + this.cloudDomainName = cloudDomainName; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..f0232fe9282 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy @@ -0,0 +1,69 @@ +package org.zstack.sdnController.header + +import java.sql.Timestamp + +doc { + + title "SDN控制器租户清单" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.3.28" + } + field { + name "sdnControllerUuid" + desc "" + type "String" + since "5.3.28" + } + field { + name "tenantUuid" + desc "" + type "String" + since "5.3.28" + } + field { + name "vdsUuid" + desc "" + type "String" + since "5.3.28" + } + field { + name "tenantName" + desc "" + type "String" + since "5.3.28" + } + field { + name "vdsName" + desc "" + type "String" + since "5.3.28" + } + field { + name "cloudDomainName" + desc "" + type "String" + since "5.3.28" + } + field { + name "status" + desc "" + type "String" + since "5.3.28" + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.3.28" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.3.28" + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java new file mode 100644 index 00000000000..3d50629bede --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO.java @@ -0,0 +1,133 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 06/13/2025. + */ +@Entity +@Table +@EntityGraph( + friends = { + @EntityGraph.Neighbour(type = SdnControllerVO.class, myField = "sdnControllerUuid", targetField = "uuid"), + } +) +public class H3cSdnControllerTenantVO { + + @Column + @Id + private String uuid; + + @Column + @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String sdnControllerUuid; + + @Column + private String tenantUuid; + @Column + private String vdsUuid; + @Column + private String tenantName; + @Column + private String vdsName; + @Column + private String cloudDomainName; + @Column + private String state; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getTenantUuid() { + return tenantUuid; + } + + public void setTenantUuid(String tenantUuid) { + this.tenantUuid = tenantUuid; + } + + public String getVdsUuid() { + return vdsUuid; + } + + public void setVdsUuid(String vdsUuid) { + this.vdsUuid = vdsUuid; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getVdsName() { + return vdsName; + } + + public void setVdsName(String vdsName) { + this.vdsName = vdsName; + } + + public String getCloudDomainName() { + return cloudDomainName; + } + + public void setCloudDomainName(String cloudDomainName) { + this.cloudDomainName = cloudDomainName; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java new file mode 100644 index 00000000000..e93073735b1 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantVO_.java @@ -0,0 +1,22 @@ +package org.zstack.sdnController.header; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 06/16/2025. + */ +@StaticMetamodel(H3cSdnControllerTenantVO.class) +public class H3cSdnControllerTenantVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute tenantUuid; + public static volatile SingularAttribute vdsUuid; + public static volatile SingularAttribute tenantName; + public static volatile SingularAttribute vdsName; + public static volatile SingularAttribute cloudDomainName; + public static volatile SingularAttribute state; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java new file mode 100644 index 00000000000..4d7ef95fcfd --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java @@ -0,0 +1,110 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.l3.IpRangeEO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ForeignKey.ReferenceOption; + +import javax.persistence.*; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 07/02/2025. + */ + +@Entity +@Table +@org.zstack.header.vo.EntityGraph( + friends = { + @EntityGraph.Neighbour(type = SdnControllerVO.class, myField = "sdnControllerUuid", targetField = "uuid"), + @EntityGraph.Neighbour(type = IpRangeEO.class, myField = "ipRangeUuid", targetField = "uuid") + } +) +public class H3cSdnSubnetIpRangeRefVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ReferenceOption.CASCADE) + private String sdnControllerUuid; + + @Column + @ForeignKey(parentEntityClass = IpRangeEO.class, onDeleteAction = ReferenceOption.CASCADE) + private String ipRangeUuid; + + @Column + private String subnetUuid; + + @Column + private String l2NetworkUuid; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getIpRangeUuid() { + return ipRangeUuid; + } + + public void setIpRangeUuid(String ipRangeUuid) { + this.ipRangeUuid = ipRangeUuid; + } + + public String getSubnetUuid() { + return subnetUuid; + } + + public void setSubnetUuid(String subnetUuid) { + this.subnetUuid = subnetUuid; + } + + public String getL2NetworkUuid() { + return l2NetworkUuid; + } + + public void setL2NetworkUuid(String l2NetworkUuid) { + this.l2NetworkUuid = l2NetworkUuid; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java new file mode 100644 index 00000000000..a74ac66cee7 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO_.java @@ -0,0 +1,19 @@ +package org.zstack.sdnController.header; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +/** + * Created by boce.wang on 07/02/2025. + */ +@StaticMetamodel(H3cSdnSubnetIpRangeRefVO.class) +public class H3cSdnSubnetIpRangeRefVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute ipRangeUuid; + public static volatile SingularAttribute subnetUuid; + public static volatile SingularAttribute l2NetworkUuid; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java new file mode 100644 index 00000000000..6820d8b9d89 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkInventory.java @@ -0,0 +1,54 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; +import org.zstack.header.query.ExpandedQueries; +import org.zstack.header.query.ExpandedQuery; +import org.zstack.header.search.Inventory; +import org.zstack.header.search.Parent; +import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@PythonClassInventory +@Inventory(mappingVOClass = HardwareL2VxlanNetworkVO.class, collectionValueOfMethod = "valueOf2", + parent = {@Parent(inventoryClass = L2NetworkInventory.class, type = SdnControllerConstant.HARDWARE_VXLAN_NETWORK_TYPE)}) +@ExpandedQueries({ + @ExpandedQuery(expandedField = "sdnController", inventoryClass = SdnControllerInventory.class, + foreignKey = "sdnControllerUuid", expandedInventoryKey = "uuid"), +}) +public class HardwareL2VxlanNetworkInventory extends L2VxlanNetworkInventory { + private Integer vlan; + + public HardwareL2VxlanNetworkInventory() { + } + + protected HardwareL2VxlanNetworkInventory(HardwareL2VxlanNetworkVO vo) { + super(vo); + this.setVlan(vo.getVlan()); + } + + public static HardwareL2VxlanNetworkInventory valueOf(HardwareL2VxlanNetworkVO vo) { + return new HardwareL2VxlanNetworkInventory(vo); + } + + public static List valueOf2(Collection vos) { + List invs = new ArrayList(vos.size()); + for (HardwareL2VxlanNetworkVO vo : vos) { + invs.add(new HardwareL2VxlanNetworkInventory(vo)); + } + return invs; + } + + public Integer getVlan() { + return vlan; + } + + public void setVlan(Integer vlan) { + this.vlan = vlan; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java index 923445031b3..2ede24d3e76 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventory.java @@ -3,6 +3,8 @@ import org.zstack.core.db.Q; import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; @@ -27,6 +29,8 @@ }) public class HardwareL2VxlanNetworkPoolInventory extends L2VxlanNetworkPoolInventory { private String sdnControllerUuid; + private Integer startVlan; + private Integer endVlan; public HardwareL2VxlanNetworkPoolInventory() { } @@ -34,6 +38,8 @@ public HardwareL2VxlanNetworkPoolInventory() { protected HardwareL2VxlanNetworkPoolInventory(HardwareL2VxlanNetworkPoolVO vo) { super(vo); setSdnControllerUuid(vo.getSdnControllerUuid()); + setStartVlan(vo.getStartVlan()); + setEndVlan(vo.getEndVlan()); setAttachedVniRanges(VniRangeInventory.valueOf(vo.getAttachedVniRanges())); List networkVOS = Q.New(VxlanNetworkVO.class).eq(VxlanNetworkVO_.poolUuid, vo.getUuid()).list(); setAttachedVxlanNetworkRefs(L2VxlanNetworkInventory.valueOf1(networkVOS)); @@ -58,4 +64,20 @@ public String getSdnControllerUuid() { public void setSdnControllerUuid(String sdnControllerUuid) { this.sdnControllerUuid = sdnControllerUuid; } + + public Integer getStartVlan() { + return startVlan; + } + + public void setStartVlan(Integer startVlan) { + this.startVlan = startVlan; + } + + public Integer getEndVlan() { + return endVlan; + } + + public void setEndVlan(Integer endVlan) { + this.endVlan = endVlan; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy index ff27c417693..3d003dec971 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolInventoryDoc_zh_cn.groovy @@ -1,35 +1,41 @@ package org.zstack.sdnController.header - import org.zstack.network.l2.vxlan.vtep.VtepInventory +import org.zstack.network.l2.vxlan.vtep.RemoteVtepInventory import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory import org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory -import java.sql.Timestamp -import java.sql.Timestamp doc { - title "硬件VXLAN资源池器清单" + title "硬件VXLAN资源池清单" field { name "sdnControllerUuid" - desc "SDN控制器UUID" + desc "" type "String" - since "3.7" + since "5.3.0" } ref { name "attachedVtepRefs" path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.attachedVtepRefs" desc "null" type "List" - since "3.7" + since "5.3.0" clz VtepInventory.class } + ref { + name "remoteVteps" + path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.remoteVteps" + desc "null" + type "List" + since "5.3.0" + clz RemoteVtepInventory.class + } ref { name "attachedVxlanNetworkRefs" path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.attachedVxlanNetworkRefs" desc "null" type "List" - since "3.7" + since "5.3.0" clz L2VxlanNetworkInventory.class } ref { @@ -37,67 +43,91 @@ doc { path "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory.attachedVniRanges" desc "null" type "List" - since "3.7" + since "5.3.0" clz VniRangeInventory.class } field { name "attachedCidrs" - desc "已加载CIDR映射表" + desc "" type "Map" - since "3.7" + since "5.3.0" } field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "3.7" + since "5.3.0" } field { name "name" desc "资源名称" type "String" - since "3.7" + since "5.3.0" } field { name "description" desc "资源的详细描述" type "String" - since "3.7" + since "5.3.0" } field { name "zoneUuid" desc "区域UUID" type "String" - since "3.7" + since "5.3.0" } field { name "physicalInterface" - desc "物理网卡" + desc "" type "String" - since "3.7" + since "5.3.0" } field { name "type" - desc "二层网络类型" + desc "" + type "String" + since "5.3.0" + } + field { + name "vSwitchType" + desc "" + type "String" + since "5.3.0" + } + field { + name "virtualNetworkId" + desc "" + type "Integer" + since "5.3.0" + } + field { + name "isolated" + desc "" + type "Boolean" + since "5.3.0" + } + field { + name "pvlan" + desc "" type "String" - since "3.7" + since "5.3.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "3.7" + since "5.3.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "3.7" + since "5.3.0" } field { name "attachedClusterUuids" - desc "挂载集群的UUID列表" + desc "" type "List" - since "3.7" + since "5.3.0" } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java index c77d4445470..20374e4b6e3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO.java @@ -2,6 +2,7 @@ import org.zstack.header.network.l2.L2NetworkEO; import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; import org.zstack.header.tag.AutoDeleteTag; import org.zstack.header.vo.EO; import org.zstack.header.vo.ForeignKey; @@ -22,6 +23,12 @@ public class HardwareL2VxlanNetworkPoolVO extends VxlanNetworkPoolVO { @ForeignKey(parentEntityClass = SdnControllerVO.class, onDeleteAction = ForeignKey.ReferenceOption.RESTRICT) private String sdnControllerUuid; + @Column + private Integer startVlan; + + @Column + private Integer endVlan; + public HardwareL2VxlanNetworkPoolVO() { } @@ -36,4 +43,20 @@ public String getSdnControllerUuid() { public void setSdnControllerUuid(String sdnControllerUuid) { this.sdnControllerUuid = sdnControllerUuid; } + + public Integer getStartVlan() { + return startVlan; + } + + public void setStartVlan(Integer startVlan) { + this.startVlan = startVlan; + } + + public Integer getEndVlan() { + return endVlan; + } + + public void setEndVlan(Integer endVlan) { + this.endVlan = endVlan; + } } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java index 16960eba093..d0363da0cef 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkPoolVO_.java @@ -11,4 +11,6 @@ @StaticMetamodel(HardwareL2VxlanNetworkPoolVO.class) public class HardwareL2VxlanNetworkPoolVO_ extends L2NetworkVO_ { public static volatile SingularAttribute sdnControllerUuid; + public static volatile SingularAttribute startVlan; + public static volatile SingularAttribute endVlan; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java new file mode 100644 index 00000000000..1f3e6b3d377 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO.java @@ -0,0 +1,40 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.l2.L2NetworkEO; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.tag.AutoDeleteTag; +import org.zstack.header.vo.EO; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +/** + * Created by shixin.ruan on 07/09/2027. + */ +@Entity +@Table +@PrimaryKeyJoinColumn(name = "uuid", referencedColumnName = "uuid") +@EO(EOClazz = L2NetworkEO.class, needView = false) +@AutoDeleteTag +public class HardwareL2VxlanNetworkVO extends VxlanNetworkVO { + @Column + private int vlan; + + public HardwareL2VxlanNetworkVO() { + } + + public HardwareL2VxlanNetworkVO(L2NetworkVO vo) { + super(vo); + } + + public int getVlan() { + return vlan; + } + + public void setVlan(int vlan) { + this.vlan = vlan; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java new file mode 100644 index 00000000000..1098f3a5e28 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareL2VxlanNetworkVO_.java @@ -0,0 +1,15 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.network.l2.L2NetworkVO_; +import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +/** + * Created by shixin.ruan on 09/20/2019. + */ +@StaticMetamodel(HardwareL2VxlanNetworkVO.class) +public class HardwareL2VxlanNetworkVO_ extends VxlanNetworkVO_ { + public static volatile SingularAttribute vlan; +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java index 2077a520462..92d84e56cb3 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/HardwareVxlanHelper.java @@ -2,7 +2,6 @@ import org.zstack.core.db.Q; import org.zstack.header.host.HostInventory; -import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; public class HardwareVxlanHelper { public static class VxlanHostMappingStruct { @@ -29,7 +28,7 @@ public void setPhysicalInterface(String physicalInterface) { } } - public static VxlanHostMappingStruct getHardwareVxlanMappingVxlanId(L2VxlanNetworkInventory vxlan, HostInventory host) { + public static VxlanHostMappingStruct getHardwareVxlanMappingVxlanId(HardwareL2VxlanNetworkInventory vxlan, HostInventory host) { String phyNic = Q.New(HardwareL2VxlanNetworkPoolVO.class) .eq(HardwareL2VxlanNetworkPoolVO_.uuid, vxlan.getPoolUuid()) .select(HardwareL2VxlanNetworkPoolVO_.physicalInterface).findValue(); @@ -63,7 +62,11 @@ public static VxlanHostMappingStruct getHardwareVxlanMappingVxlanId(L2VxlanNetwo return struct; } - struct.setVlanId(vxlan.getVni()); + if (vxlan.getVlan() != 0) { + struct.setVlanId(vxlan.getVlan()); + } else { + struct.setVlanId(vxlan.getVirtualNetworkId()); + } struct.setPhysicalInterface(phyNic); return struct; } diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java new file mode 100644 index 00000000000..64837cd2b58 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantMsg.java @@ -0,0 +1,26 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; + +/** + * Created by boce.wang on 06/13/2025. + */ +public class PullSdnControllerTenantMsg extends NeedReplyMessage implements SdnControllerMessage { + private String sdnControllerUuid; + + public static PullSdnControllerTenantMsg fromApi(APIPullSdnControllerTenantMsg amsg) { + PullSdnControllerTenantMsg msg = new PullSdnControllerTenantMsg(); + msg.setSdnControllerUuid(amsg.getSdnControllerUuid()); + return msg; + } + + @Override + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java new file mode 100644 index 00000000000..4332fc9d1df --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/PullSdnControllerTenantReply.java @@ -0,0 +1,20 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; + +import java.util.List; + +/** + * Created by boce.wang on 06/13/2025. + */ +public class PullSdnControllerTenantReply extends MessageReply { + private List inventories; + + public List getInventories() { + return inventories; + } + + public void setInventories(List inventories) { + this.inventories = inventories; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java new file mode 100644 index 00000000000..dffe66fa86b --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerMsg.java @@ -0,0 +1,21 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.network.sdncontroller.SdnControllerMessage; + +public class ReconnectSdnControllerMsg extends NeedReplyMessage implements SdnControllerMessage { + private String controllerUuid; + + public String getControllerUuid() { + return controllerUuid; + } + + public void setControllerUuid(String controllerUuid) { + this.controllerUuid = controllerUuid; + } + + @Override + public String getSdnControllerUuid() { + return controllerUuid; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java new file mode 100644 index 00000000000..0d980fa8632 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/ReconnectSdnControllerReply.java @@ -0,0 +1,6 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.MessageReply; + +public class ReconnectSdnControllerReply extends MessageReply { +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java new file mode 100644 index 00000000000..1375de42ec2 --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerCanonicalEvents.java @@ -0,0 +1,59 @@ +package org.zstack.sdnController.header; + +import org.zstack.header.message.NeedJsonSchema; +import org.zstack.header.network.sdncontroller.SdnControllerInventory; + +public class SdnControllerCanonicalEvents { + public static final String SDNCONTROLLER_STATE_CHANGED_PATH = "/sdnController/state/change"; + public static final String SDNCONTROLLER_STATUS_CHANGED_PATH = "/sdnController/status/change"; + + @NeedJsonSchema + public static class SdnControllerStatusChangedData { + private String sdnControllerUuid; + private String sdnControllerType; + private String oldStatus; + private String newStatus; + private SdnControllerInventory inv; + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getSdnControllerType() { + return sdnControllerType; + } + + public void setSdnControllerType(String sdnControllerType) { + this.sdnControllerType = sdnControllerType; + } + + public String getOldStatus() { + return oldStatus; + } + + public void setOldStatus(String oldStatus) { + this.oldStatus = oldStatus; + } + + public String getNewStatus() { + return newStatus; + } + + public void setNewStatus(String newStatus) { + this.newStatus = newStatus; + } + + public SdnControllerInventory getInv() { + return inv; + } + + public void setInv(SdnControllerInventory inv) { + this.inv = inv; + } + } + +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java new file mode 100644 index 00000000000..7682575f00c --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerFlowDataParam.java @@ -0,0 +1,8 @@ +package org.zstack.sdnController.header; + +public enum SdnControllerFlowDataParam { + SDN_CONTROLLER_UUID, + SDN_CONTROLLER_PASSWORD, + SDN_CONTROLLER_USERNAME, + SDN_CONTROLLER_CHANGED, +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java new file mode 100644 index 00000000000..3352d966dce --- /dev/null +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnControllerTableState.java @@ -0,0 +1,17 @@ +package org.zstack.sdnController.header; + +public enum SdnControllerTableState { + Enabled("Enabled"), + Disabled("Disabled"); + + public final String value; + private SdnControllerTableState(String value) { + this.value = value; + } + + + @Override + public String toString() { + return value; + } +} diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy index d110b4a83fe..8f7beb9ab16 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/header/SdnVniRangeDoc_zh_cn.groovy @@ -1,6 +1,5 @@ package org.zstack.sdnController.header -import java.lang.Integer import java.lang.Integer doc { diff --git a/plugin/securityGroup/pom.xml b/plugin/securityGroup/pom.xml index 1080cc0ef11..f3651c37eba 100755 --- a/plugin/securityGroup/pom.xml +++ b/plugin/securityGroup/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 securityGroup diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java index dfade9fe4de..aec49c60391 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsg.java @@ -6,8 +6,10 @@ import org.zstack.header.message.APIEvent; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; +import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.other.APIAuditor; import org.zstack.header.rest.RestRequest; +import org.zstack.header.tag.TagResourceType; /** * @api @@ -45,6 +47,7 @@ * * see :ref:`APICreateSecurityGroupEvent` */ +@TagResourceType(SecurityGroupVO.class) @Action(category = SecurityGroupConstant.ACTION_CATEGORY) @RestRequest( path = "/security-groups", @@ -68,6 +71,20 @@ public class APICreateSecurityGroupMsg extends APICreateMessage implements APIAu @APIParam(required = false, validValues = {"4", "6"}) private Integer ipVersion; + /** + * @desc vSwitch type + */ + @APIParam(required = false, maxLength = 1024, validValues = {"LinuxBridge", "OvnDpdk"}) + private String vSwitchType = "LinuxBridge"; + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public String getName() { return name; } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy index 2b30f299f07..556af7a2f0f 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APICreateSecurityGroupMsgDoc_zh_cn.groovy @@ -85,6 +85,16 @@ doc { optional true since "3.4.0" } + column { + name "vSwitchType" + enclosedIn "params" + desc "虚拟交换机类型,用于指定安全组所使用的网络虚拟化技术" + location "body" + type "String" + optional true + since "5.3.20" + values ("LinuxBridge","OvnDpdk") + } } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java index 09288b5b55b..9d40e197548 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/CreateSecurityGroupMsg.java @@ -9,6 +9,8 @@ public class CreateSecurityGroupMsg extends NeedReplyMessage { private String name; private String description; private String accountUuid; + private String vSwitchType = "LinuxBridge"; + private String sdnControllerUuid; public String getName() { return name; @@ -33,4 +35,20 @@ public String getAccountUuid() { public void setAccountUuid(String accountUuid) { this.accountUuid = accountUuid; } + + public String getSdnControllerUuid() { + return sdnControllerUuid; + } + + public void setSdnControllerUuid(String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java index e395bb82b10..506eed44bea 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RefreshSecurityGroupRulesOnVmMsg.java @@ -1,6 +1,7 @@ package org.zstack.network.securitygroup; import org.zstack.header.message.NeedReplyMessage; +import org.zstack.header.vm.VmInstanceConstant; import java.util.List; @@ -10,6 +11,7 @@ public class RefreshSecurityGroupRulesOnVmMsg extends NeedReplyMessage { private boolean deleteAllRules; private List vNicUuids; private List sgUuids; + private VmInstanceConstant.VmOperation operation; public List getNicUuids() { return vNicUuids; } public void setNicUuids(List uuids) { this.vNicUuids = uuids; } @@ -45,4 +47,20 @@ public List getSgUuids() { public void setSgUuids(List sgUuids) { this.sgUuids = sgUuids; } + + public VmInstanceConstant.VmOperation getOperation() { + return operation; + } + + public void setOperation(VmInstanceConstant.VmOperation operation) { + this.operation = operation; + } + + public List getvNicUuids() { + return vNicUuids; + } + + public void setvNicUuids(List vNicUuids) { + this.vNicUuids = vNicUuids; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java index ad565d44577..670e9934db2 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/RuleTO.java @@ -5,7 +5,7 @@ public class RuleTO { private int ipVersion; private int priority; - private String type; + private String ruleType; private String remoteGroupUuid; private List remoteGroupVmIps; private String state; @@ -59,7 +59,7 @@ public String getSrcIpRange() { } public void setSrcIpRange(String srcIpRange) { - this.srcIpRange = srcIpRange; + this.srcIpRange = srcIpRange == null ? null : srcIpRange.replaceAll("\\s+", ""); } public String getDstIpRange() { @@ -67,7 +67,7 @@ public String getDstIpRange() { } public void setDstIpRange(String dstIpRange) { - this.dstIpRange = dstIpRange; + this.dstIpRange = dstIpRange == null ? null : dstIpRange.replaceAll("\\s+", ""); } public String getDstPortRange() { @@ -75,7 +75,7 @@ public String getDstPortRange() { } public void setDstPortRange(String dstPortRange) { - this.dstPortRange = dstPortRange; + this.dstPortRange = dstPortRange == null ? null : dstPortRange.replaceAll("\\s+", ""); } public String getProtocol() { @@ -84,11 +84,13 @@ public String getProtocol() { public void setProtocol(String protocol) { this.protocol = protocol; } - public String getType() { - return type; + + public String getRuleType() { + return ruleType; } - public void setType(String type) { - this.type = type; + + public void setRuleType(String ruleType) { + this.ruleType = ruleType; } public void setRemoteGroupVmIps(List remoteGroupVmIps) { @@ -136,7 +138,7 @@ public void setAllowedCidr(String allowedCidr) { public String toString() { StringBuilder sb = new StringBuilder(); sb.append(String.format("ipVersion: %s,", this.ipVersion)); - sb.append(String.format("type: %s,", this.type)); + sb.append(String.format("type: %s,", this.ruleType)); sb.append(String.format("state: %s,", this.state)); sb.append(String.format("priority: %s,", this.priority)); sb.append(String.format("action: %s,", this.action)); @@ -152,7 +154,7 @@ public String toString() { public String toFullString() { StringBuilder sb = new StringBuilder(); sb.append(String.format("ipVersion: %s,", this.ipVersion)); - sb.append(String.format("type: %s,", this.type)); + sb.append(String.format("type: %s,", this.ruleType)); sb.append(String.format("state: %s,", this.state)); sb.append(String.format("priority: %s", this.priority)); sb.append(String.format("action: %s,", this.action)); diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java index 55520f344f1..3bd2f78aa36 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupApiInterceptor.java @@ -127,6 +127,9 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti return msg; } + private String normalizeIpOrPort(String value) { + return value == null ? null : StringUtils.deleteWhitespace(value); + } private void validate(APIChangeResourceOwnerMsg msg) { AccountResourceRefVO ref = Q.New(AccountResourceRefVO.class).eq(AccountResourceRefVO_.resourceUuid, msg.getResourceUuid()).find(); @@ -168,6 +171,8 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { if (msg.getAllowedCidr() == null) { msg.setAllowedCidr(msg.getIpVersion() == IPv6Constants.IPv4 ? SecurityGroupConstant.WORLD_OPEN_CIDR : SecurityGroupConstant.WORLD_OPEN_CIDR_IPV6); } else { + //remove extra space characters + msg.setAllowedCidr(normalizeIpOrPort(msg.getAllowedCidr())); validateIps(msg.getAllowedCidr(), msg.getIpVersion()); } @@ -180,14 +185,17 @@ private void validate(APIValidateSecurityGroupRuleMsg msg) { } if (msg.getSrcIpRange() != null) { + msg.setSrcIpRange(normalizeIpOrPort(msg.getSrcIpRange()));; validateIps(msg.getSrcIpRange(), msg.getIpVersion()); } if (msg.getDstIpRange() != null) { + msg.setDstIpRange(normalizeIpOrPort(msg.getDstIpRange())); validateIps(msg.getDstIpRange(), msg.getIpVersion()); } if (msg.getDstPortRange() != null) { + msg.setDstPortRange(normalizeIpOrPort(msg.getDstPortRange())); validatePorts(msg.getDstPortRange()); } @@ -575,6 +583,8 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { throw new ApiMessageInterceptionException(argerr("could not change security group rule, because srcIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getSrcIpRange(), msg.getRemoteSecurityGroupUuid())); } + + msg.setSrcIpRange(normalizeIpOrPort(msg.getSrcIpRange())); validateIps(msg.getSrcIpRange(), vo.getIpVersion()); } @@ -588,6 +598,8 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (StringUtils.isNotEmpty(msg.getRemoteSecurityGroupUuid())) { throw new ApiMessageInterceptionException(argerr("could not change security group rule, because dstIpRange[%s] is set, remoteSecurityGroupUuid[%s] must be empty", msg.getDstIpRange(), msg.getRemoteSecurityGroupUuid())); } + + msg.setDstIpRange(normalizeIpOrPort(msg.getDstIpRange())); validateIps(msg.getDstIpRange(), vo.getIpVersion()); } @@ -638,6 +650,7 @@ private void validate(APIChangeSecurityGroupRuleMsg msg) { if (SecurityGroupRuleProtocolType.ICMP.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.ALL.toString().equals(msg.getProtocol())) { throw new ApiMessageInterceptionException(argerr("could not change security group rule, because rule protocol is [%s], dstPortRange cannot be set", msg.getProtocol())); } + msg.setDstPortRange(normalizeIpOrPort(msg.getDstPortRange())); validatePorts(msg.getDstPortRange()); } else if (msg.getDstPortRange() != null) { if (SecurityGroupRuleProtocolType.TCP.toString().equals(msg.getProtocol()) || SecurityGroupRuleProtocolType.UDP.toString().equals(msg.getProtocol())) { @@ -691,9 +704,10 @@ private void validatePorts(String ports) { } String portArray[]; if (ports.contains(SecurityGroupConstant.IP_SPLIT)) { + // The port range in iptables, such as 10-20, will occupy the number of two multiports String[] tmpPorts = ports.split(String.format("%s|%s", SecurityGroupConstant.IP_SPLIT, SecurityGroupConstant.RANGE_SPLIT)); - if (tmpPorts.length > SecurityGroupConstant.PORT_GROUP_NUMBER_LIMIT) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupConstant.PORT_GROUP_NUMBER_LIMIT)); + if (tmpPorts.length > SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_PORT_FIELD_ERROR, "invalid ports[%s], port range[%s] number[%d] is out of max limit[%d]", ports, Arrays.toString(tmpPorts), tmpPorts.length, SecurityGroupGlobalProperty.PORT_GROUP_NUMBER_LIMIT)); } portArray = ports.split(SecurityGroupConstant.IP_SPLIT); @@ -746,8 +760,8 @@ private void validateIps(String ips, Integer ipVersion) { String ipArray[]; if (ips.contains(SecurityGroupConstant.IP_SPLIT)) { ipArray = ips.split(SecurityGroupConstant.IP_SPLIT); - if (ipArray.length > SecurityGroupConstant.IP_GROUP_NUMBER_LIMIT) { - throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip number[%d] is out of max limit[%d]", ips, ipArray.length, SecurityGroupConstant.IP_GROUP_NUMBER_LIMIT)); + if (ipArray.length > SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip number[%d] is out of max limit[%d]", ips, ipArray.length, SecurityGroupGlobalProperty.IP_GROUP_NUMBER_LIMIT)); } Stream stream = Stream.of(ipArray).distinct(); if (ipArray.length != stream.count()) { @@ -755,7 +769,7 @@ private void validateIps(String ips, Integer ipVersion) { } if (ipVersion == IPv6Constants.IPv6) { List ipv6List = Stream.of(ipArray).filter(ip -> ip.contains(SecurityGroupConstant.RANGE_SPLIT)).collect(Collectors.toList()); - if (ipv6List.size() > 0) { + if (!ipv6List.isEmpty()) { throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid ips[%s], ip range cannot be used when specifying multiple ipv6 addresses", ips)); } } @@ -771,6 +785,11 @@ private void validateIps(String ips, Integer ipVersion) { if (!NetworkUtils.isCidr(ip, ipVersion)) { throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "invalid cidr[%s], ipVersion[%d]", ip, ipVersion)); } + if (ipVersion == IPv6Constants.IPv4 && NetworkUtils.isFullCidr(ip)) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv4 cidr can not be 0.0.0.0/0")); + } if (ipVersion == IPv6Constants.IPv6 && IPv6NetworkUtils.isFullCidr(ip)) { + throw new ApiMessageInterceptionException(err(SecurityGroupErrors.RULE_IP_FIELD_ERROR, "ipv6 cidr can not be ::/0")); + } continue; } if (ip.contains(SecurityGroupConstant.RANGE_SPLIT)) { @@ -1060,6 +1079,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (ao.getRemoteSecurityGroupUuid() != null) { throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getDstIpRange(), ao.getRemoteSecurityGroupUuid())); } + ao.setDstIpRange(normalizeIpOrPort(ao.getDstIpRange())); validateIps(ao.getDstIpRange(), ao.getIpVersion()); } } else { @@ -1078,6 +1098,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (ao.getRemoteSecurityGroupUuid() != null) { throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the ip range[%s] and remoteSecurityGroupUuid[%s] are in conflict", ao.getSrcIpRange(), ao.getRemoteSecurityGroupUuid())); } + ao.setSrcIpRange(normalizeIpOrPort(ao.getSrcIpRange())); validateIps(ao.getSrcIpRange(), ao.getIpVersion()); } } @@ -1117,6 +1138,7 @@ private void validate(APIAddSecurityGroupRuleMsg msg) { if (ao.getDstPortRange() == null) { throw new ApiMessageInterceptionException(argerr("could not add security group rule, because the protocol type TCP/UDP must set dstPortRange")); } + ao.setDstPortRange(normalizeIpOrPort(ao.getDstPortRange())); validatePorts(ao.getDstPortRange()); } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java index 1a6cb823c5a..b21fe374a7a 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupCascadeExtension.java @@ -9,6 +9,7 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.CloudBusListCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatchWithReturn; import org.zstack.core.db.SimpleQuery; import org.zstack.header.core.Completion; @@ -40,7 +41,7 @@ public class SecurityGroupCascadeExtension extends AbstractAsyncCascadeExtension @Autowired private CloudBus bus; - private static String NAME = VmNicSecurityGroupRefVO.class.getSimpleName(); + private static String NAME = SecurityGroupVO.class.getSimpleName(); @Override public void asyncCascade(CascadeAction action, Completion completion) { @@ -64,103 +65,57 @@ private void handleDeletionCheck(CascadeAction action, Completion completion) { completion.success(); } - private void handleSecurityGroupRefDeletion(CascadeAction action, final Completion completion) { - List refs = refFromAction(action); - if (refs.isEmpty()) { + private void handleDeletion(CascadeAction action, final Completion completion) { + List sgInv = securityGroupUuidsFromAction(action); + if (sgInv == null || sgInv.isEmpty()) { completion.success(); return; } - Map> map = new HashMap>(); - for (VmNicSecurityGroupRefInventory ref : refs) { - List nicUuids = map.get(ref.getSecurityGroupUuid()); - if (nicUuids == null) { - nicUuids = new ArrayList(); - map.put(ref.getSecurityGroupUuid(), nicUuids); - } - nicUuids.add(ref.getVmNicUuid()); - } - - List msgs = new ArrayList(); - for (Map.Entry> e : map.entrySet()) { - RemoveVmNicFromSecurityGroupMsg msg = new RemoveVmNicFromSecurityGroupMsg(); - msg.setSecurityGroupUuid(e.getKey()); - msg.setVmNicUuids(e.getValue()); - bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, e.getKey()); - msgs.add(msg); - } - - bus.send(msgs, new CloudBusListCallBack(completion) { - @Override - public void run(List replies) { - for (MessageReply reply : replies) { + new While<>(sgInv).each((inv, wcomp) -> { + SecurityGroupDeletionMsg msg = new SecurityGroupDeletionMsg(); + msg.setUuid(inv.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, inv.getUuid()); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { if (!reply.isSuccess()) { - logger.warn(String.format("failed to remove vm nic from some security group for some destroyed vm," + - "no worry, security group will catch it up later. %s", reply.getError())); + logger.warn(String.format("failed to delete security group[uuid:%s], %s", msg.getUuid(), reply.getError())); } - } + wcomp.done(); + } + }); + }).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { completion.success(); } }); } - private void handleDeletion(CascadeAction action, final Completion completion) { - if (VmInstanceVO.class.getSimpleName().equals(action.getParentIssuer())) { - handleSecurityGroupRefDeletion(action, completion); - } else { - handleSecurityGroupDeletion(action, completion); - } - - } - - private void handleSecurityGroupDeletion(CascadeAction action, final Completion completion) { - List accounts = action.getParentIssuerContext(); - List accountUuids = accounts.stream().map(AccountInventory::getUuid).collect(Collectors.toList()); - - List msgs = new SQLBatchWithReturn>() { - @Override - protected List scripts() { - List uuids = q(AccountResourceRefVO.class) - .select(AccountResourceRefVO_.resourceUuid) - .eq(AccountResourceRefVO_.resourceType, SecurityGroupVO.class.getSimpleName()) - .in(AccountResourceRefVO_.ownerAccountUuid, accountUuids) - .listValues(); - - if (uuids.isEmpty()) { - return null; - } - - return uuids.stream().map(auuid -> { - SecurityGroupDeletionMsg msg = new SecurityGroupDeletionMsg(); - msg.setUuid(auuid); - bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, auuid); - return msg; - }).collect(Collectors.toList()); + private List securityGroupUuidsFromAction(CascadeAction action) { + List ret = null; + if (NAME.equals(action.getParentIssuer())) { + ret = action.getParentIssuerContext(); + } else if (AccountVO.class.getSimpleName().equals(action.getParentIssuer())) { + List accounts = action.getParentIssuerContext(); + List accountUuids = accounts.stream().map(AccountInventory::getUuid).collect(Collectors.toList()); + + List sgUuids= Q.New(AccountResourceRefVO.class) + .select(AccountResourceRefVO_.resourceUuid) + .eq(AccountResourceRefVO_.resourceType, SecurityGroupVO.class.getSimpleName()) + .in(AccountResourceRefVO_.ownerAccountUuid, accountUuids) + .listValues(); + if (sgUuids.isEmpty()) { + return null; } - }.execute(); - - if (msgs == null) { - completion.success(); - return; + List sgVos = Q.New(SecurityGroupVO.class) + .in(SecurityGroupVO_.uuid, sgUuids).list(); + ret = SecurityGroupInventory.valueOf(sgVos); } - - new While<>(msgs).all((msg, com) -> bus.send(msg, new CloudBusCallBack(com) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.warn(String.format("failed to delete scheduler[uuid:%s], %s", msg.getUuid(), reply.getError())); - } - - com.done(); - } - })).run(new WhileDoneCompletion(completion) { - @Override - public void done(ErrorCodeList errorCodeList) { - completion.success(); - } - }); + return ret; } @Override @@ -173,44 +128,16 @@ public String getCascadeResourceName() { return NAME; } - private List refFromAction(CascadeAction action) { - List vms = action.getParentIssuerContext(); - List nicUuids = new ArrayList(); - for (VmDeletionStruct vm : vms) { - nicUuids.addAll(CollectionUtils.transformToList(vm.getInventory().getVmNics(), new Function() { - @Override - public String call(VmNicInventory arg) { - return arg.getUuid(); - } - })); - } - - - if (nicUuids.isEmpty()) { - return new ArrayList(); - } - - SimpleQuery q = dbf.createQuery(VmNicSecurityGroupRefVO.class); - q.add(VmNicSecurityGroupRefVO_.vmNicUuid, SimpleQuery.Op.IN, nicUuids); - List vos = q.list(); - return VmNicSecurityGroupRefInventory.valueOf(vos); - } - @Override public CascadeAction createActionForChildResource(CascadeAction action) { - if (CascadeConstant.DELETION_CLEANUP_CODE.equals(action.getActionCode())) { - return null; - } - - if (!action.getParentIssuer().equals(VmInstanceVO.class.getSimpleName())) { - return null; - } - - List refs = refFromAction(action); - if (refs.isEmpty()) { - return null; + if (CascadeConstant.DELETION_CODES.contains(action.getActionCode())) { + List sgInvs = securityGroupUuidsFromAction(action); + if (sgInvs != null && !sgInvs.isEmpty()) { + return action.copy().setParentIssuer(NAME).setParentIssuerContext(sgInvs); + } + return action; } - return action.copy().setParentIssuer(NAME).setParentIssuerContext(refs); + return null; } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java index 4b96f7f7acc..9d306000580 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupConstant.java @@ -26,7 +26,7 @@ public static enum Param { SECURITY_GROUP_RULE_VO, SECURITY_GROUP_VO, SECURITY_GROUP_UUIDS, + SECURITY_GROUP_REFS, VM_NIC_UUIDS, - HOST_SECURITY_GROUP_MEMBERS_TO } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java new file mode 100644 index 00000000000..9a1ef0524d0 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGetSdnBackendExtensionPoint.java @@ -0,0 +1,5 @@ +package org.zstack.network.securitygroup; + +public interface SecurityGroupGetSdnBackendExtensionPoint { + SecurityGroupSdnBackend getSecurityGroupSdnBackend(String sdnControllerUuid); +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java index db97996b0c7..c0cf749bc73 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalConfig.java @@ -25,4 +25,12 @@ public class SecurityGroupGlobalConfig { @GlobalConfigValidation(inNumberRange = {100, 1000}) @GlobalConfigDef(defaultValue = "100", type = Integer.class, description = "security group rules num limit") public static GlobalConfig SECURITY_GROUP_RULES_NUM_LIMIT = new GlobalConfig(CATEGORY, "rules.num.limit"); + + @GlobalConfigValidation(inNumberRange = {10, 20}) + @GlobalConfigDef(defaultValue = "10", type = Integer.class, description = "security groups attached to vmnic num limit") + public static GlobalConfig VMNIC_SECURITY_GROUP_NUM_LIMIT = new GlobalConfig(CATEGORY, "vnic.sg.num.limit"); + + @GlobalConfigValidation(inNumberRange = {25000, 30000}) + @GlobalConfigDef(defaultValue = "30000", type = Integer.class, description = "security group rule max priority in ovn") + public static GlobalConfig OVN_ACL_MAX_PRIORITY = new GlobalConfig(CATEGORY, "ovn.max.priority"); } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java index da80dbdc6ce..2c3537c7058 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupGlobalProperty.java @@ -7,4 +7,8 @@ public class SecurityGroupGlobalProperty { @GlobalProperty(name="upgradeSecurityGroup", defaultValue = "false") public static boolean UPGRADE_SECURITY_GROUP; + @GlobalProperty(name="SecurityGroupRuleIpLimit", defaultValue = "50") + public static int IP_GROUP_NUMBER_LIMIT; + @GlobalProperty(name="SecurityGroupRulePortLimit", defaultValue = "15") //The max number of multiport modes in iptables is 15 + public static int PORT_GROUP_NUMBER_LIMIT; } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java new file mode 100644 index 00000000000..88b010dc382 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupHelper.java @@ -0,0 +1,23 @@ +package org.zstack.network.securitygroup; + +import java.util.List; + +public class SecurityGroupHelper { + public static String getSdnControllerUuid(List systemTags) { + if (systemTags == null) { + return null; + } + + for (String tag : systemTags) { + if (SecurityGroupSystemTags.SDN_CONTROLLER_UUID.isMatch(tag)) { + return SecurityGroupSystemTags.SDN_CONTROLLER_UUID.getTokenByTag(tag, SecurityGroupSystemTags.SDN_CONTROLLER_UUID_TOKEN); + } + } + + return null; + } + + public static String getSdnControllerUuid(String sgUuid) { + return SecurityGroupSystemTags.SDN_CONTROLLER_UUID.getTokenByResourceUuid(sgUuid, SecurityGroupSystemTags.SDN_CONTROLLER_UUID_TOKEN); + } +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java index ec460dcb910..f99064771d2 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupInventory.java @@ -5,6 +5,7 @@ import org.zstack.header.rest.APINoSee; import org.zstack.header.search.Inventory; +import javax.persistence.Column; import javax.persistence.JoinColumn; import java.sql.Timestamp; import java.util.*; @@ -91,6 +92,8 @@ public class SecurityGroupInventory { @Deprecated private Integer ipVersion; + private String vSwitchType; + /** * @desc the time this resource gets created */ @@ -99,10 +102,8 @@ public class SecurityGroupInventory { * @desc last time this resource gets operated */ private Timestamp lastOpDate; - /** - * @ignore - */ - @APINoSee + + private long internalId; /** * @desc @@ -131,6 +132,7 @@ protected SecurityGroupInventory(SecurityGroupVO vo) { this.setLastOpDate(vo.getLastOpDate()); this.setRules(SecurityGroupRuleInventory.valueOf(vo.getRules())); this.setState(vo.getState().toString()); + this.setvSwitchType(vo.getvSwitchType()); Set l3Uuids= new HashSet(vo.getAttachedL3NetworkRefs().size()); for (SecurityGroupL3NetworkRefVO ref : vo.getAttachedL3NetworkRefs()) { l3Uuids.add(ref.getL3NetworkUuid()); @@ -231,4 +233,12 @@ public Integer getIpVersion() { public void setIpVersion(Integer ipVersion) { this.ipVersion = ipVersion; } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java index bfc1ccf1a4a..e02b5a6934e 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManager.java @@ -1,6 +1,7 @@ package org.zstack.network.securitygroup; -import org.zstack.header.Service; +import java.util.List; public interface SecurityGroupManager { + VmNicSecurityGroupTo getVmNicSecurityGroupRules(List sgUuids); } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index b45ad810137..ba7a4d41d7d 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -7,6 +7,10 @@ import org.springframework.transaction.annotation.Transactional; import org.zstack.core.Platform; import static org.zstack.core.Platform.operr; + +import org.zstack.core.asyncbatch.While; +import org.zstack.core.cascade.CascadeConstant; +import org.zstack.core.cascade.CascadeFacade; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.MessageSafe; @@ -15,6 +19,8 @@ import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; +import org.zstack.core.defer.Defer; +import org.zstack.core.defer.Deferred; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.thread.AsyncThread; import org.zstack.core.thread.ChainTask; @@ -26,13 +32,11 @@ import org.zstack.header.AbstractService; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.core.Completion; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowChain; -import org.zstack.header.core.workflow.FlowDoneHandler; -import org.zstack.header.core.workflow.FlowErrorHandler; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.core.NopeCompletion; +import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; @@ -45,14 +49,14 @@ import org.zstack.header.identity.ReportQuotaExtensionPoint; import org.zstack.header.identity.quota.QuotaMessageHandler; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; +import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; -import org.zstack.header.network.l3.IpRangeInventory; -import org.zstack.header.network.l3.L3NetworkInventory; -import org.zstack.header.network.l3.L3NetworkVO; -import org.zstack.header.network.l3.UsedIpVO; -import org.zstack.header.network.l3.UsedIpVO_; +import org.zstack.header.network.l2.L2NetworkConstant; +import org.zstack.header.network.l2.SdnControllerDeleteExtensionPoint; +import org.zstack.header.network.l2.VSwitchType; +import org.zstack.header.network.l3.*; import org.zstack.header.network.service.NetworkServiceL3NetworkRefVO; import org.zstack.header.network.service.NetworkServiceL3NetworkRefVO_; import org.zstack.header.query.AddExpandedQueryExtensionPoint; @@ -62,10 +66,12 @@ import org.zstack.identity.AccountManager; import org.zstack.identity.QuotaUtil; import org.zstack.network.l3.IpRangeHelper; +import org.zstack.network.l3.L3NetworkHelper; import org.zstack.network.securitygroup.APIUpdateSecurityGroupRulePriorityMsg.SecurityGroupRulePriorityAO; import org.zstack.network.securitygroup.APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO; import org.zstack.network.securitygroup.APISetVmNicSecurityGroupMsg.VmNicSecurityGroupRefAO; import org.zstack.query.QueryFacade; +import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; @@ -85,14 +91,15 @@ import java.util.stream.Stream; import static java.util.Arrays.asList; -import static org.zstack.core.Platform.i18n; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.err; +import static org.zstack.network.securitygroup.SecurityGroupConstant.Param.*; import static org.zstack.network.securitygroup.SecurityGroupMembersTO.ACTION_CODE_DELETE_GROUP; -import static org.zstack.utils.CollectionDSL.list; +import static org.zstack.utils.CollectionDSL.*; public class SecurityGroupManagerImpl extends AbstractService implements SecurityGroupManager, ManagementNodeReadyExtensionPoint, - VmInstanceMigrateExtensionPoint, AddExpandedQueryExtensionPoint, ReportQuotaExtensionPoint, ValidateL3SecurityGroupExtensionPoint { + VmInstanceMigrateExtensionPoint, AddExpandedQueryExtensionPoint, ReportQuotaExtensionPoint, ValidateL3SecurityGroupExtensionPoint, + SdnControllerDeleteExtensionPoint { private static CLogger logger = Utils.getLogger(SecurityGroupManagerImpl.class); @Autowired @@ -113,6 +120,8 @@ public class SecurityGroupManagerImpl extends AbstractService implements Securit private TagManager tagMgr; @Autowired private ErrorFacade errf; + @Autowired + protected CascadeFacade casf; protected Map hypervisorBackends; private int failureHostWorkerInterval; @@ -156,6 +165,50 @@ public void validateSystemtagL3SecurityGroup(String l3Uuid, List securit } } + private List getVmIpsBySecurityGroup(String sgUuid, int ipVersion){ + List ret = new ArrayList<>(); + String sql = "select ip.ip" + + " from VmNicVO nic, VmNicSecurityGroupRefVO ref, SecurityGroupVO sg, UsedIpVO ip" + + " where sg.uuid = ref.securityGroupUuid and ref.vmNicUuid = nic.uuid" + + " and ref.securityGroupUuid = :sgUuid" + + " and nic.uuid = ip.vmNicUuid and ip.ipVersion = :ipVersion"; + TypedQuery internalIpQuery = dbf.getEntityManager().createQuery(sql, String.class); + internalIpQuery.setParameter("sgUuid", sgUuid); + internalIpQuery.setParameter("ipVersion", ipVersion); + + List ips = internalIpQuery.getResultList(); + if (ips != null) { + ret.addAll(ips); + } + + /* add gateway address to group list */ + List attachedL3Uuids = Q.New(SecurityGroupL3NetworkRefVO.class).select(SecurityGroupL3NetworkRefVO_.l3NetworkUuid) + .eq(SecurityGroupL3NetworkRefVO_.securityGroupUuid, sgUuid).listValues(); + + List nicL3Uuids = SQL.New("select distinct l3.uuid from VmNicVO nic, VmNicSecurityGroupRefVO ref, L3NetworkVO l3" + + " where ref.securityGroupUuid = :sgUuid" + + " and ref.vmNicUuid = nic.uuid" + + " and l3.uuid = nic.l3NetworkUuid", String.class) + .param("sgUuid", sgUuid) + .list(); + + List resultL3Uuids = Stream.concat(attachedL3Uuids.stream(), nicL3Uuids.stream()).distinct().collect(Collectors.toList()); + + for (String uuid: resultL3Uuids) { + L3NetworkInventory inv = L3NetworkInventory.valueOf(dbf.findByUuid(uuid, L3NetworkVO.class)); + List iprs = IpRangeHelper.getNormalIpRanges(inv, ipVersion); + if (!iprs.isEmpty()) { + ret.add(iprs.get(0).getGateway()); + } + } + + for (SecurityGroupGetDefaultRuleExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetDefaultRuleExtensionPoint.class)) { + ret.addAll(exp.getGroupMembers(sgUuid, ipVersion)); + } + + return ret.stream().distinct().collect(Collectors.toList()); + } + private class RuleCalculator { private List vmNicUuids; private List l3NetworkUuids; @@ -222,11 +275,13 @@ private List calculateByHost() { String sql = "select nic.uuid from VmNicVO nic, VmInstanceVO vm, VmNicSecurityGroupRefVO ref, SecurityGroupVO sg" + " where nic.uuid = ref.vmNicUuid and nic.vmInstanceUuid = vm.uuid"+ " and ref.securityGroupUuid = sg.uuid and sg.state in (:sgState)" + + " and sg.vSwitchType = :vSwitchType" + " and vm.hostUuid in (:hostUuids) and vm.state in (:vmStates)"; TypedQuery insgQuery = dbf.getEntityManager().createQuery(sql, String.class); insgQuery.setParameter("hostUuids", hostUuids); insgQuery.setParameter("vmStates", vmStates); insgQuery.setParameter("sgState", sgStates); + insgQuery.setParameter("vSwitchType", L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE); List nicsInSg = insgQuery.getResultList(); sql = "select nic.uuid from VmNicVO nic, VmInstanceVO vm where nic.vmInstanceUuid = vm.uuid" + @@ -295,7 +350,7 @@ private List calculateRuleTOBySecurityGroup(String sgUuid, String l3Uuid RuleTO rto = new RuleTO(); rto.setIpVersion(r.getIpVersion()); rto.setPriority(r.getPriority()); - rto.setType(r.getType().toString()); + rto.setRuleType(r.getType().toString()); rto.setState(r.getState().toString()); rto.setRemoteGroupUuid(r.getRemoteSecurityGroupUuid()); rto.setRemoteGroupVmIps(getVmIpsBySecurityGroup(r.getRemoteSecurityGroupUuid(), r.getIpVersion())); @@ -303,7 +358,7 @@ private List calculateRuleTOBySecurityGroup(String sgUuid, String l3Uuid rto.setSrcIpRange(r.getSrcIpRange()); rto.setDstIpRange(r.getDstIpRange()); rto.setDstPortRange(r.getDstPortRange()); - rto.setAction(r.getAction().toString()); + rto.setAction(r.getAction()); ret.add(rto); } @@ -319,49 +374,123 @@ private List calculateRuleTOBySecurityGroup(String sgUuid, String l3Uuid return ret; } - private List getVmIpsBySecurityGroup(String sgUuid, int ipVersion){ - List ret = new ArrayList<>(); - // TODO: if two L3 network which have same ip segment attached same sg, it might has a problem - String sql = "select ip.ip" + - " from VmNicVO nic, VmNicSecurityGroupRefVO ref, SecurityGroupVO sg, UsedIpVO ip" + - " where sg.uuid = ref.securityGroupUuid and ref.vmNicUuid = nic.uuid" + - " and ref.securityGroupUuid = :sgUuid" + - " and nic.uuid = ip.vmNicUuid and ip.ipVersion = :ipVersion"; - TypedQuery internalIpQuery = dbf.getEntityManager().createQuery(sql, String.class); - internalIpQuery.setParameter("sgUuid", sgUuid); - internalIpQuery.setParameter("ipVersion", ipVersion); - - List ips = internalIpQuery.getResultList(); - if (ips != null) { - ret.addAll(ips); + @Transactional(readOnly = true) + public VmNicSecurityGroupTo calculateVmNicSecurityGroupTO() { + if (sgStates == null) { + sgStates = asList(SecurityGroupState.Enabled); } - /* add gateway address to group list */ - List attachedL3Uuids = Q.New(SecurityGroupL3NetworkRefVO.class).select(SecurityGroupL3NetworkRefVO_.l3NetworkUuid) - .eq(SecurityGroupL3NetworkRefVO_.securityGroupUuid, sgUuid).listValues(); + VmNicSecurityGroupTo to = new VmNicSecurityGroupTo(); + if (vmNicUuids != null && !vmNicUuids.isEmpty()) { + // calculate nic security group priority + List ts = SQL.New("select nic.uuid, nic.internalName, nic.mac" + + " from VmInstanceVO vm, VmNicVO nic" + + " where nic.uuid in (:vmNicUuids) and nic.vmInstanceUuid = vm.uuid", Tuple.class) + .param("vmNicUuids", vmNicUuids) + .list(); + if (ts.isEmpty()) { + logger.debug(String.format("security group calculateVmNicSecurityGroupTO: no match nics[%s] ", vmNicUuids)); + return to; + } - List nicL3Uuids = SQL.New("select distinct l3.uuid from VmNicVO nic, VmNicSecurityGroupRefVO ref, L3NetworkVO l3" + - " where ref.securityGroupUuid = :sgUuid" + - " and ref.vmNicUuid = nic.uuid" + - " and l3.uuid = nic.l3NetworkUuid", String.class) - .param("sgUuid", sgUuid) - .list(); + List usedIps = Q.New(UsedIpVO.class).in(UsedIpVO_.vmNicUuid, vmNicUuids).list(); + List policies = Q.New(VmNicSecurityPolicyVO.class).in(VmNicSecurityPolicyVO_.vmNicUuid, vmNicUuids).list(); + List refs = SQL.New("select ref.vmNicUuid, ref.priority, sg.uuid, sg.state" + + " from VmNicSecurityGroupRefVO ref, SecurityGroupVO sg" + + " where ref.vmNicUuid in (:vmNicUuids)" + + " and ref.securityGroupUuid = sg.uuid" + + " and sg.state in (:sgStates)", Tuple.class) + .param("vmNicUuids", vmNicUuids) + .param("sgStates", sgStates) + .list(); + ; + + for (Tuple t : ts) { + String nicUuid = t.get(0, String.class); + String nicName = t.get(1, String.class); + String mac = t.get(2, String.class); + + VmNicSecurityPolicyVO policy = policies.stream().filter(p -> p.getVmNicUuid().equals(nicUuid)).findFirst().orElse(null); + if (policy == null) { + continue; + } + + VmNicSecurityTO nicTo = new VmNicSecurityTO(); + nicTo.setVmNicUuid(nicUuid); + nicTo.setInternalName(nicName); + nicTo.setMac(mac); + nicTo.setIngressPolicy(policy.getIngressPolicy()); + nicTo.setEgressPolicy(policy.getEgressPolicy()); - List resultL3Uuids = Stream.concat(attachedL3Uuids.stream(), nicL3Uuids.stream()).distinct().collect(Collectors.toList()); + List ips = usedIps.stream().filter(i -> i.getVmNicUuid().equals(nicUuid)).collect(Collectors.toList()); + for (UsedIpVO ip : ips) { + String ipAddr = ip.getIp(); + nicTo.getVmNicIps().add(ipAddr); + } + List sgRefs = refs.stream() + .filter(r -> r.get(0, String.class).equals(nicUuid) && + r.get(3, SecurityGroupState.class) == SecurityGroupState.Enabled) + .collect(Collectors.toList()); + if (sgRefs.isEmpty()) { + nicTo.setActionCode(VmNicSecurityTO.ACTION_CODE_DELETE_CHAIN); + } + for (Tuple sgRef : sgRefs) { + int priority = sgRef.get(1, Integer.class); + String sgUuid = sgRef.get(2, String.class); + if (securityGroupUuids != null && securityGroupUuids.contains(sgUuid)) { + nicTo.getSecurityGroupRefs().put(sgUuid, priority); + } + } + + to.getVmNics().add(nicTo); + } + } - for (String uuid: resultL3Uuids) { - L3NetworkInventory inv = L3NetworkInventory.valueOf(dbf.findByUuid(uuid, L3NetworkVO.class)); - List iprs = IpRangeHelper.getNormalIpRanges(inv, ipVersion); - if (!iprs.isEmpty()) { - ret.add(iprs.get(0).getGateway()); + // calculate security group rules + if (securityGroupUuids != null && !securityGroupUuids.isEmpty()) { + for (String uuid : securityGroupUuids) { + SecurityGroupTo group = new SecurityGroupTo(); + + SecurityGroupVO vo = dbf.findByUuid(uuid, SecurityGroupVO.class); + group.setSecurityGroupUuid(uuid); + group.setSecurityGroupName(vo.getName()); + int internalId = (int)vo.getInternalId(); + group.setInternalId(internalId); + group.setSecurityGroupVmIps(getVmIpsBySecurityGroup(uuid, IPv6Constants.IPv4)); + group.setSecurityGroupVmIp6s(getVmIpsBySecurityGroup(uuid, IPv6Constants.IPv6)); + + List rules = vo.getRules().stream() + .filter(r -> r.getState() == SecurityGroupRuleState.Enabled) + .collect(Collectors.toList()); + for (SecurityGroupRuleVO r : rules) { + RuleTO rto = new RuleTO(); + rto.setIpVersion(r.getIpVersion()); + rto.setPriority(r.getPriority()); + rto.setRuleType(r.getType().toString()); + rto.setState(r.getState().toString()); + rto.setRemoteGroupUuid(r.getRemoteSecurityGroupUuid()); + rto.setProtocol(r.getProtocol().toString()); + rto.setSrcIpRange(r.getSrcIpRange()); + rto.setDstIpRange(r.getDstIpRange()); + rto.setDstPortRange(r.getDstPortRange()); + rto.setAction(r.getAction()); + group.getRules().add(rto); + } + + to.getGroups().add(group); } } - for (SecurityGroupGetDefaultRuleExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetDefaultRuleExtensionPoint.class)) { - ret.addAll(exp.getGroupMembers(sgUuid, ipVersion)); + if (logger.isTraceEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("\n=================== begin calculateVmNicSecurityGroupTO ======================")); + sb.append(String.format("\ninput vmNic uuids: %s", vmNicUuids)); + sb.append(String.format("\nresult: %s", JSONObjectUtil.toJsonString(to))); + sb.append(String.format("\n=================== end calculateVmNicSecurityGroupTO ========================")); + logger.trace(sb.toString()); } - return ret.stream().distinct().collect(Collectors.toList()); + return to; } @Transactional(readOnly = true) @@ -369,7 +498,7 @@ private List calculateByVmNic() { Map htoMap = new HashMap(); if (vmNicUuids == null || vmNicUuids.isEmpty()) { - return htoMap.values().stream().collect(Collectors.toList()); + return new ArrayList<>(htoMap.values()); } List ts = SQL.New("select vm.hostUuid, vm.hypervisorType, nic.uuid, nic.internalName, nic.mac" + @@ -381,7 +510,7 @@ private List calculateByVmNic() { if (ts.isEmpty()) { logger.debug(String.format("security group calcuateByVmNic: no match nics[%s] ", vmNicUuids)); - return htoMap.values().stream().collect(Collectors.toList()); + return new ArrayList<>(htoMap.values()); } List usedIps = Q.New(UsedIpVO.class).in(UsedIpVO_.vmNicUuid, vmNicUuids).list(); @@ -502,6 +631,129 @@ private void handleLocalMessage(Message msg) { } } + @Override + public VmNicSecurityGroupTo getVmNicSecurityGroupRules(List sgUuids) { + RuleCalculator cal = new RuleCalculator(); + cal.sgStates = Collections.singletonList(SecurityGroupState.Enabled); + cal.securityGroupUuids = sgUuids; + cal.vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .in(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuids) + .listValues(); + cal.vmNicUuids = cal.vmNicUuids.stream().distinct().collect(Collectors.toList()); + if (cal.vmNicUuids.isEmpty()) { + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + return nicTo; + } + + return cal.calculateVmNicSecurityGroupTO(); + } + + private void sdnRefreshVmNicsDefaultRule(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, Completion completion) { + RuleCalculator cal = new RuleCalculator(); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnRefreshVmNics(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, Completion completion) { + RuleCalculator cal = new RuleCalculator(); + cal.sgStates = Collections.singletonList(SecurityGroupState.Enabled);; + cal.securityGroupUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + if (cal.securityGroupUuids.isEmpty()) { + completion.success(); + return; + } + cal.securityGroupUuids = cal.securityGroupUuids.stream().distinct().collect(Collectors.toList()); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + for (VmNicSecurityTO to : nicTo.vmNics) { + to.setSync(true); + } + + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnRemoveSecurityGroupFromVmNic(SecurityGroupSdnBackend sdnBackend, + List sgUuids, List vmNicUuids, Completion completion) { + RuleCalculator cal = new RuleCalculator(); + cal.securityGroupUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + cal.securityGroupUuids.addAll(sgUuids); + cal.securityGroupUuids = cal.securityGroupUuids.stream().distinct().collect(Collectors.toList()); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + for (VmNicSecurityTO to : nicTo.vmNics) { + to.setSync(true); + } + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnDeleteSecurityGroup(SecurityGroupSdnBackend sdnBackend, List vmNicUuids, + String sgUuid,Completion completion) { + RuleCalculator cal = new RuleCalculator(); + if (!vmNicUuids.isEmpty()) { + cal.securityGroupUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + } else { + cal.securityGroupUuids = new ArrayList<>(); + } + cal.securityGroupUuids.add(sgUuid); + cal.securityGroupUuids = cal.securityGroupUuids.stream().distinct().collect(Collectors.toList()); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + for (SecurityGroupTo group : nicTo.groups) { + if (group.getSecurityGroupUuid().equals(sgUuid)) { + group.setActionCode(SecurityGroupTo.ACTION_CODE_DELETE_CHAIN); + } + } + for (VmNicSecurityTO nic : nicTo.vmNics) { + nic.setSync(true); + } + sdnBackend.updateSecurityGroup(nicTo, completion); + } + + private void sdnRefreshSecurityGroup(SecurityGroupSdnBackend sdnBackend, String sgUuid,Completion completion) { + SecurityGroupVO groupVO = dbf.findByUuid(sgUuid, SecurityGroupVO.class); + if (groupVO.getState() == SecurityGroupState.Disabled) { + completion.success(); + return; + } + + List vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid) + .listValues(); + if (vmNicUuids.isEmpty()) { + completion.success(); + return; + } + + RuleCalculator cal = new RuleCalculator(); + cal.securityGroupUuids = Collections.singletonList(sgUuid); + cal.vmNicUuids = vmNicUuids; + + VmNicSecurityGroupTo nicTo = cal.calculateVmNicSecurityGroupTO(); + //security group is not attached to vm + if (nicTo.getVmNics().isEmpty()) { + completion.success(); + return; + } + + sdnBackend.updateSecurityGroup(nicTo, completion); + } + private void handle(CreateSecurityGroupMsg msg) { CreateSecurityGroupReply reply = new CreateSecurityGroupReply(); SecurityGroupVO vo = new SecurityGroupVO(); @@ -509,6 +761,7 @@ private void handle(CreateSecurityGroupMsg msg) { vo.setName(msg.getName()); vo.setDescription(msg.getDescription()); vo.setState(SecurityGroupState.Enabled); + vo.setvSwitchType(msg.getvSwitchType()); vo.setInternalId(dbf.generateSequenceNumber(SecurityGroupSequenceNumberVO.class)); vo.setAccountUuid(msg.getAccountUuid()); vo = dbf.persistAndRefresh(vo); @@ -516,8 +769,28 @@ private void handle(CreateSecurityGroupMsg msg) { createDefaultRule(vo.getUuid(), IPv6Constants.IPv4); createDefaultRule(vo.getUuid(), IPv6Constants.IPv6); - reply.setInventory(SecurityGroupInventory.valueOf(vo)); - bus.reply(msg, reply); + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSdnControllerUuid()); + if (sdnBackend == null) { + reply.setInventory(SecurityGroupInventory.valueOf(vo)); + bus.reply(msg, reply); + return; + } + + final SecurityGroupInventory inv = SecurityGroupInventory.valueOf(vo); + sdnBackend.createSecurityGroup(inv, new Completion(msg) { + @Override + public void success() { + reply.setInventory(SecurityGroupInventory.valueOf( + dbf.findByUuid(inv.getUuid(), SecurityGroupVO.class))); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); } private void handle(AddSecurityGroupRuleMsg msg) { @@ -581,8 +854,36 @@ public String getName() { private void handle(SecurityGroupDeletionMsg msg) { SecurityGroupDeletionReply reply = new SecurityGroupDeletionReply(); - dbf.removeByPrimaryKey(msg.getUuid(), SecurityGroupVO.class); - bus.reply(msg, reply); + + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return getSecurityGroupSyncThreadName(msg.getUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + deleteSecurityGroup(msg.getUuid(), new Completion(msg, chain) { + @Override + public void success() { + bus.reply(msg, reply); + chain.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + chain.next(); + } + }); + } + + @Override + public String getName() { + return String.format("delete-security-group-%s", msg.getUuid()); + } + }); } private void handle(RemoveVmNicFromSecurityGroupMsg msg) { @@ -617,23 +918,79 @@ public String getName() { }); } - private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { - RefreshSecurityGroupRulesOnVmReply reply = new RefreshSecurityGroupRulesOnVmReply(); - List nicUuids = msg.getNicUuids(); - if (nicUuids == null || nicUuids.isEmpty()) { - SimpleQuery q = dbf.createQuery(VmNicSecurityGroupRefVO.class); - q.select(VmNicSecurityGroupRefVO_.vmNicUuid); - q.add(VmNicSecurityGroupRefVO_.vmInstanceUuid, Op.EQ, msg.getVmInstanceUuid()); - nicUuids = q.listValue(); - } - - if (nicUuids.isEmpty()) { - checkDefaultRulesOnHost(msg.getHostUuid()); - logger.debug(String.format("no nic of vm[uuid:%s] needs to refresh security group rule", msg.getVmInstanceUuid())); - bus.reply(msg, reply); + private void refreshVmSecurityGroupRulesBySdn(Map> sdnNicUuidsMap, + RefreshSecurityGroupRulesOnVmMsg msg, Completion completion) { + if (msg.getOperation() != VmInstanceConstant.VmOperation.NewCreate + && msg.getOperation() != VmInstanceConstant.VmOperation.Destroy + && msg.getOperation() != VmInstanceConstant.VmOperation.AttachNic + && msg.getOperation() != VmInstanceConstant.VmOperation.DetachNic + && msg.getOperation() != VmInstanceConstant.VmOperation.ChangeNicNetwork) { + completion.success(); return; } + new While<>(sdnNicUuidsMap.entrySet()).each((entry, wcomp) -> { + SecurityGroupSdnBackend backend = entry.getKey(); + List vmNicUuids = entry.getValue(); + if (vmNicUuids.isEmpty()) { + wcomp.done(); + return; + } + + vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + if (vmNicUuids.isEmpty()) { + wcomp.done(); + return; + } + + if (msg.isDeleteAllRules()) { + List sgUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .listValues(); + SQL.New(VmNicSecurityGroupRefVO.class).in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids).delete(); + sdnRemoveSecurityGroupFromVmNic(backend, sgUuids,vmNicUuids, new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); + } + }); + } else { + sdnRefreshVmNics(backend, vmNicUuids, new Completion(wcomp) { + @Override + public void success() { + wcomp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + wcomp.addError(errorCode); + wcomp.allDone(); + } + }); + } + }).run(new WhileDoneCompletion(new NopeCompletion()) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + completion.fail(errorCodeList); + } else { + completion.success(); + } + } + }); + } + + private void refreshVmSecurityGroupRules(List nicUuids, RefreshSecurityGroupRulesOnVmMsg msg) { nicUuids = nicUuids.stream().distinct().collect(Collectors.toList()); Collection htos; RuleCalculator cal = new RuleCalculator(); @@ -641,18 +998,21 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { cal.vmStates = asList(VmInstanceState.values()); cal.isDelete = msg.isDeleteAllRules(); htos = cal.calculate(); - + applyRules(htos); if (msg.getSgUuids() != null && !msg.getSgUuids().isEmpty()) { Q.New(SecurityGroupVO.class) - .select(SecurityGroupVO_.uuid).in(SecurityGroupVO_.uuid, msg.getSgUuids()) - .eq(SecurityGroupVO_.state, SecurityGroupState.Enabled).listValues().forEach(sgUuid -> { - HostSecurityGroupMembersTO groupMemberTO = cal.returnHostSecurityGroupMember((String) sgUuid); - if (!groupMemberTO.getHostUuids().isEmpty()) { - updateGroupMembers(groupMemberTO); - } - }); + .select(SecurityGroupVO_.uuid) + .eq(SecurityGroupVO_.vSwitchType, L2NetworkConstant.VSWITCH_TYPE_LINUX_BRIDGE) + .in(SecurityGroupVO_.uuid, msg.getSgUuids()) + .eq(SecurityGroupVO_.state, SecurityGroupState.Enabled) + .listValues().forEach(sgUuid -> { + HostSecurityGroupMembersTO groupMemberTO = cal.returnHostSecurityGroupMember((String) sgUuid); + if (!groupMemberTO.getHostUuids().isEmpty()) { + updateGroupMembers(groupMemberTO); + } + }); } if (htos.isEmpty()) { @@ -661,7 +1021,59 @@ private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { logger.debug(String.format("refreshed security group rule for vm[uuid:%s] vNicuuids[%s]", msg.getVmInstanceUuid(), Joiner.on(",").join(nicUuids))); - bus.reply(msg, reply); + } + + private void handle(RefreshSecurityGroupRulesOnVmMsg msg) { + RefreshSecurityGroupRulesOnVmReply reply = new RefreshSecurityGroupRulesOnVmReply(); + List nicUuids = msg.getNicUuids(); + if (nicUuids == null || nicUuids.isEmpty()) { + SimpleQuery q = dbf.createQuery(VmNicSecurityGroupRefVO.class); + q.select(VmNicSecurityGroupRefVO_.vmNicUuid); + q.add(VmNicSecurityGroupRefVO_.vmInstanceUuid, Op.EQ, msg.getVmInstanceUuid()); + nicUuids = q.listValue(); + } + if (msg.getHostUuid() == null ||msg.getHostUuid().isEmpty()) { + String HostUuid = Q.New(VmInstanceVO.class) + .eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()) + .select(VmInstanceVO_.hostUuid) + .findValue(); + + msg.setHostUuid(HostUuid); + } + + if (nicUuids.isEmpty()) { + checkDefaultRulesOnHost(msg.getHostUuid()); + logger.debug(String.format("no nic of vm[uuid:%s] needs to refresh security group rule", msg.getVmInstanceUuid())); + bus.reply(msg, reply); + return; + } + + List otherNicUuids = new ArrayList<>(); + Map> sdnNicUuidsMap = new HashMap<>(); + List vmNicVOS = Q.New(VmNicVO.class).in(VmNicVO_.uuid, nicUuids).list(); + for (VmNicVO nicvo : vmNicVOS) { + SecurityGroupSdnBackend backend = getSdnBackendFroL3Uuid(nicvo.getL3NetworkUuid()); + if (backend == null) { + otherNicUuids.add(nicvo.getUuid()); + } else { + sdnNicUuidsMap.computeIfAbsent(backend, k -> new ArrayList<>()); + sdnNicUuidsMap.get(backend).add(nicvo.getUuid()); + } + } + + refreshVmSecurityGroupRulesBySdn(sdnNicUuidsMap, msg, new Completion(new NopeCompletion()) { + @Override + public void success() { + refreshVmSecurityGroupRules(otherNicUuids, msg); + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); } private void createFailureHostTask(String huuid) { @@ -671,8 +1083,9 @@ private void createFailureHostTask(String huuid) { } private void handle(RefreshSecurityGroupRulesOnHostMsg msg) { + // this message is sent after host reconnected, sdn controller will not handle it RuleCalculator cal = new RuleCalculator(); - cal.hostUuids = asList(msg.getHostUuid()); + cal.hostUuids = Collections.singletonList(msg.getHostUuid()); // refreshing may happen when host is reconnecting; at that time VMs' states are Unknown cal.vmStates = asList(VmInstanceState.Unknown, VmInstanceState.Running); List htos = cal.calculate(); @@ -732,6 +1145,8 @@ private void handle(APIValidateSecurityGroupRuleMsg msg) { private void setVmNicSecurityGroup(APISetVmNicSecurityGroupMsg msg, Completion completion) { + VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + SecurityGroupSdnBackend backend = getSdnBackendFroL3Uuid(nic.getL3NetworkUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -748,10 +1163,7 @@ public void run(FlowTrigger trigger, Map data) { List toUpdate = new ArrayList<>(); List sgUuids = new ArrayList<>(); Map refMap = new HashMap<>(); - - VmNicVO nic = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); List refs = Q.New(VmNicSecurityGroupRefVO.class).eq(VmNicSecurityGroupRefVO_.vmNicUuid, msg.getVmNicUuid()).list(); - refs.forEach(ref -> { refMap.put(ref.getSecurityGroupUuid(), ref); }); @@ -802,6 +1214,7 @@ public void run(FlowTrigger trigger, Map data) { } data.put(SecurityGroupConstant.Param.SECURITY_GROUP_UUIDS, sgUuids); + data.put(SecurityGroupConstant.Param.SECURITY_GROUP_REFS, toDelete); trigger.next(); } @@ -810,6 +1223,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -824,6 +1242,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "update-group-members"; + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { List sgUuids = (List)data.get(SecurityGroupConstant.Param.SECURITY_GROUP_UUIDS); @@ -842,6 +1265,32 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "update-sdn-controller"; + + @Override + public boolean skip(Map data) { + return backend == null; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + List toDelete = (List) data.get(SecurityGroupConstant.Param.SECURITY_GROUP_REFS); + List sgUuids = toDelete.stream().map(VmNicSecurityGroupRefVO::getSecurityGroupUuid).distinct().collect(Collectors.toList()); + sdnRemoveSecurityGroupFromVmNic(backend, sgUuids, Collections.singletonList(msg.getVmNicUuid()), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -896,6 +1345,7 @@ public String getName() { } private void doChangeSecurityGroupRuleState(APIChangeSecurityGroupRuleStateMsg msg, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSecurityGroupUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -925,6 +1375,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -936,6 +1391,31 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-hosts"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, msg.getSecurityGroupUuid(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1011,16 +1491,37 @@ private void handle(APIChangeVmNicSecurityPolicyMsg msg) { } pvo = dbf.updateAndRefresh(pvo); - RuleCalculator cal = new RuleCalculator(); - cal.vmNicUuids = asList(msg.getVmNicUuid()); - List htos = cal.calculate(); - applyRules(htos); + VmNicSecurityPolicyInventory pinv = VmNicSecurityPolicyInventory.valueOf(pvo); + VmNicVO nicVO = dbf.findByUuid(msg.getVmNicUuid(), VmNicVO.class); + SecurityGroupSdnBackend backend = getSdnBackendFroL3Uuid(nicVO.getL3NetworkUuid()); + if (backend == null) { + RuleCalculator cal = new RuleCalculator(); + cal.vmNicUuids = asList(msg.getVmNicUuid()); + List htos = cal.calculate(); + applyRules(htos); - evt.setInventory(VmNicSecurityPolicyInventory.valueOf(pvo)); - bus.publish(evt); + evt.setInventory(pinv); + bus.publish(evt); + return; + } + + sdnRefreshVmNicsDefaultRule(backend, Collections.singletonList(msg.getVmNicUuid()), new Completion(msg) { + @Override + public void success() { + evt.setInventory(pinv); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } private void doUpdateSecurityGroupRulePriority(APIUpdateSecurityGroupRulePriorityMsg msg, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSecurityGroupUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1061,6 +1562,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1073,6 +1579,31 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, msg.getSecurityGroupUuid(), + new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1165,6 +1696,7 @@ public String getName() { } private void doChangeSecurityGroupRule(APIChangeSecurityGroupRuleMsg msg, String sgUuid, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1227,6 +1759,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1238,6 +1775,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, sgUuid, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1277,22 +1838,31 @@ private void handle(APIUpdateSecurityGroupMsg msg) { @Transactional(readOnly = true) private List getCandidateVmNic(String sgId, String accountUuid) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgId); + if (sdnBackend != null) { + return sdnBackend.getCandidateVmNic(sgId, accountUuid); + } + List nicUuidsToInclude = acntMgr.getResourceUuidsCanAccessByAccount(accountUuid, VmNicVO.class); if (nicUuidsToInclude != null && nicUuidsToInclude.isEmpty()) { return new ArrayList(); } - List nicUuidsToExclued = Q.New(VmNicSecurityGroupRefVO.class).select(VmNicSecurityGroupRefVO_.vmNicUuid).eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgId).listValues(); + List nicUuidsToExclued = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgId) + .listValues(); List candidateNics = new ArrayList<>(); List allNics = SQL.New("select nic from VmNicVO nic, VmInstanceVO vm" + - " where nic.vmInstanceUuid = vm.uuid" + - " and vm.type = :vmType" + - " and vm.state in (:vmStates)", VmNicVO.class) + " where nic.vmInstanceUuid = vm.uuid" + + " and nic.type = :nicType " + + " and vm.type = :vmType" + + " and vm.state in (:vmStates)", VmNicVO.class) + .param("nicType", VmInstanceConstant.VIRTUAL_NIC_TYPE) .param("vmType", VmInstanceConstant.USER_VM_TYPE) .param("vmStates", list(VmInstanceState.Running, VmInstanceState.Stopped)) .list(); - if (allNics.isEmpty()) { return allNics; } @@ -1417,14 +1987,59 @@ public String getName() { } private void handle(APIChangeSecurityGroupStateMsg msg) { + APIChangeSecurityGroupStateEvent evt = new APIChangeSecurityGroupStateEvent(msg.getId()); SecurityGroupStateEvent sevt = SecurityGroupStateEvent.valueOf(msg.getStateEvent()); SecurityGroupVO vo = dbf.findByUuid(msg.getUuid(), SecurityGroupVO.class); + SecurityGroupState oldState = vo.getState(); SecurityGroupState sgState = SecurityGroupStateEvent.enable.equals(sevt) ? SecurityGroupState.Enabled : SecurityGroupState.Disabled; + if (oldState == sgState) { + evt.setInventory(SecurityGroupInventory.valueOf(vo)); + bus.publish(evt); + return; + } + vo.setState(sgState); vo = dbf.updateAndRefresh(vo); - List sgUuids = Q.New(SecurityGroupRuleVO.class).select(SecurityGroupRuleVO_.securityGroupUuid).eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, msg.getUuid()).listValues(); + final SecurityGroupVO finalVO = vo; + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getUuid()); + if (sdnBackend != null) { + List vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, msg.getUuid()) + .listValues(); + if (vmNicUuids.isEmpty()) { + evt.setInventory(SecurityGroupInventory.valueOf(finalVO)); + bus.publish(evt); + return; + } + + List sgStates = new ArrayList<>(); + sgStates.add(SecurityGroupState.Enabled); + if (sgState == SecurityGroupState.Disabled) { + sgStates.add(SecurityGroupState.Disabled); + } + sdnRefreshVmNics(sdnBackend, vmNicUuids, new Completion(msg) { + @Override + public void success() { + evt.setInventory(SecurityGroupInventory.valueOf(finalVO)); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + finalVO.setState(oldState); + dbf.persist(finalVO); + evt.setError(errorCode); + bus.publish(evt); + } + }); + return; + } + + List sgUuids = Q.New(SecurityGroupRuleVO.class).select(SecurityGroupRuleVO_.securityGroupUuid) + .eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, msg.getUuid()).listValues(); sgUuids.add(msg.getUuid()); sgUuids = sgUuids.stream().distinct().collect(Collectors.toList()); RuleCalculator cal = new RuleCalculator(); @@ -1441,7 +2056,6 @@ private void handle(APIChangeSecurityGroupStateMsg msg) { updateGroupMembers(groupMemberTO); } - APIChangeSecurityGroupStateEvent evt = new APIChangeSecurityGroupStateEvent(msg.getId()); evt.setInventory(SecurityGroupInventory.valueOf(vo)); bus.publish(evt); } @@ -1468,6 +2082,7 @@ public void run(SyncTaskChain chain) { ref.setSecurityGroupUuid(msg.getSecurityGroupUuid()); dbf.persist(ref); } + SecurityGroupVO sgvo = dbf.findByUuid(msg.getSecurityGroupUuid(), SecurityGroupVO.class); SecurityGroupInventory sginv = SecurityGroupInventory.valueOf(sgvo); evt.setInventory(sginv); @@ -1483,6 +2098,7 @@ public String getName() { } private void removeNicFromSecurityGroup(String sgUuid, List vmNicUuids, Completion completion) { + SecurityGroupSdnBackend backend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1521,6 +2137,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1534,6 +2156,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "update-group-numbers"; + + @Override + public boolean skip(Map data) { + return backend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -1549,6 +2177,35 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "update-sdn-controller"; + + @Override + public boolean skip(Map data) { + return backend == null; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + if (backend == null || vmNicUuids.isEmpty()) { + trigger.next(); + return; + } + + sdnRemoveSecurityGroupFromVmNic(backend, Collections.singletonList(sgUuid), vmNicUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1602,7 +2259,118 @@ public String getName() { }); } + private List updateRelatedSecurityGroupRules(String sgUuid) { + List rules = Q.New(SecurityGroupRuleVO.class) + .eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuid) + .notEq(SecurityGroupRuleVO_.securityGroupUuid, sgUuid).list(); + if (rules.isEmpty()) { + return new ArrayList<>(); + } + + Map> toDelete = new HashMap<>(); + rules.forEach(r -> { + toDelete.computeIfAbsent(r.getSecurityGroupUuid(), k -> new ArrayList<>()); + toDelete.get(r.getSecurityGroupUuid()).add(r.getUuid()); + }); + + for (Map.Entry> entry : toDelete.entrySet()) { + doDeleteSecurityGroupRule(entry.getKey(), entry.getValue()); + } + + return new ArrayList<>(toDelete.keySet()); + } + + private void deleteSecurityGroupFromSdn(SecurityGroupSdnBackend backend, String sgUuid, Completion completion) { + Map data = new HashMap(); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("sdn-backend-delete-security-group-%s", sgUuid)); + chain.setData(data); + chain.then(new NoRollbackFlow() { + String __name__ = "update-security-group-db"; + + @Override + public void run(FlowTrigger trigger, Map data) { + // step 1, update vmnic + VmNicSecurityGroupTo delNicTo = new VmNicSecurityGroupTo(); + List vmNicUuids = Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid).listValues(); + if (!vmNicUuids.isEmpty()) { + //step 1.1, delete vmnic <--> security group ref + SQL.New(VmNicSecurityGroupRefVO.class) + .eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids).delete(); + + //step 1.2, update remain security group priority + for (String uuid : vmNicUuids) { + List refs = Q.New(VmNicSecurityGroupRefVO.class) + .eq(VmNicSecurityGroupRefVO_.vmNicUuid, uuid) + .orderBy(VmNicSecurityGroupRefVO_.priority, SimpleQuery.Od.ASC).list(); + if (!refs.isEmpty()) { + refs.forEach(ref ->{ + ref.setPriority(refs.indexOf(ref) + 1); + }); + dbf.updateCollection(refs); + } + } + } + + // step 2, update related security group + List relatedSgUuids = updateRelatedSecurityGroupRules(sgUuid); + if (!relatedSgUuids.isEmpty()) { + vmNicUuids.addAll(Q.New(VmNicSecurityGroupRefVO.class) + .select(VmNicSecurityGroupRefVO_.vmNicUuid) + .in(VmNicSecurityGroupRefVO_.securityGroupUuid, relatedSgUuids) + .listValues()); + } + vmNicUuids = vmNicUuids.stream().distinct().collect(Collectors.toList()); + + data.put(VM_NIC_UUIDS, vmNicUuids); + + trigger.next(); + } + }).then(new NoRollbackFlow() { + String __name__ = "delete-from-sdn"; + + @Override + public void run(FlowTrigger trigger, Map data) { + List vmNicUuids = (List) data.get(VM_NIC_UUIDS); + sdnDeleteSecurityGroup(backend, vmNicUuids, sgUuid, new Completion(trigger) { + @Override + public void success() { + // step 3, remove security group + SQL.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, sgUuid).delete(); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + // step 3, remove security group + SQL.New(SecurityGroupVO.class).eq(SecurityGroupVO_.uuid, sgUuid).delete(); + trigger.fail(errorCode); + } + }); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }).start(); + } + private void deleteSecurityGroup(String sgUuid, Completion completion) { + SecurityGroupSdnBackend backend = getSdnBackend(sgUuid); + if (backend != null) { + deleteSecurityGroupFromSdn(backend, sgUuid, completion); + return; + } + Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1612,6 +2380,7 @@ public void setup() { flow(new NoRollbackFlow() { String __name__ = "dettach-nic-from-security-group-in-db"; + // this flow will refresh vmnic attached by current sg: sgUuid @Override public void run(FlowTrigger trigger, Map data) { List attachedNicUuids = Q.New(VmNicSecurityGroupRefVO.class).select(VmNicSecurityGroupRefVO_.vmNicUuid).eq(VmNicSecurityGroupRefVO_.securityGroupUuid, sgUuid).listValues(); @@ -1636,9 +2405,16 @@ public void run(MessageReply reply) { flow(new NoRollbackFlow() { String __name__ = "delete-all-associated-security-group-rules-in-db"; + // this flow will find other sgs related to current sg by SecurityGroupRuleVO_.remoteSecurityGroupUuid + // action: 1. delete related rules + // 2. re-calculate the remain rules priority + // 3. find the vmnics related to the other sgs + @Override public void run(FlowTrigger trigger, Map data) { - List rules = Q.New(SecurityGroupRuleVO.class).eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuid).notEq(SecurityGroupRuleVO_.securityGroupUuid, sgUuid).list(); + List rules = Q.New(SecurityGroupRuleVO.class) + .eq(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuid) + .notEq(SecurityGroupRuleVO_.securityGroupUuid, sgUuid).list(); if (rules.isEmpty()) { dbf.removeByPrimaryKey(sgUuid, SecurityGroupVO.class); trigger.next(); @@ -1646,7 +2422,7 @@ public void run(FlowTrigger trigger, Map data) { } Map> toDelete = new HashMap<>(); - rules.stream().forEach(r -> { + rules.forEach(r -> { if (!toDelete.containsKey(r.getSecurityGroupUuid())) { toDelete.put(r.getSecurityGroupUuid(), new ArrayList()); } @@ -1660,10 +2436,9 @@ public void run(FlowTrigger trigger, Map data) { otherNicUuids.addAll(nicUuids); doDeleteSecurityGroupRule(entry.getKey(), entry.getValue()); } - dbf.removeByPrimaryKey(sgUuid, SecurityGroupVO.class); - data.put(SecurityGroupConstant.Param.VM_NIC_UUIDS, otherNicUuids); + data.put(VM_NIC_UUIDS, otherNicUuids); trigger.next(); } @@ -1671,9 +2446,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + // this flow will refresh the other nic found by previous flow + @Override public void run(FlowTrigger trigger, Map data) { - List vmNicUuids = (List)data.getOrDefault(SecurityGroupConstant.Param.VM_NIC_UUIDS, new ArrayList<>()); + List vmNicUuids = (List)data.getOrDefault(VM_NIC_UUIDS, new ArrayList<>()); if (!vmNicUuids.isEmpty()) { RuleCalculator cal = new RuleCalculator(); cal.vmNicUuids = vmNicUuids; @@ -1706,36 +2484,74 @@ public void handle(ErrorCode errCode, Map data) { private void handle(APIDeleteSecurityGroupMsg msg) { APIDeleteSecurityGroupEvent evt = new APIDeleteSecurityGroupEvent(msg.getId()); - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return getSecurityGroupSyncThreadName(msg.getUuid()); - } + final String issuer = SecurityGroupVO.class.getSimpleName(); + SecurityGroupInventory inv = SecurityGroupInventory.valueOf(dbf.findByUuid(msg.getSecurityGroupUuid(), SecurityGroupVO.class)); + final List ctx = Collections.singletonList(inv); + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("delete-security-group-%s", msg.getUuid())); + if (msg.getDeletionMode() == APIDeleteMessage.DeletionMode.Permissive) { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_CHECK_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } - @Override - public void run(SyncTaskChain chain) { - deleteSecurityGroup(msg.getUuid(), new Completion(msg, chain) { - @Override - public void success() { - logger.debug(String.format("successfully deleted security group[uuid:%s]", msg.getUuid())); - bus.publish(evt); - chain.next(); - } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }).then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } - @Override - public void fail(ErrorCode errorCode) { - evt.setError(errorCode); - bus.publish(evt); - chain.next(); - } - }); - } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } else { + chain.then(new NoRollbackFlow() { + @Override + public void run(final FlowTrigger trigger, Map data) { + casf.asyncCascade(CascadeConstant.DELETION_FORCE_DELETE_CODE, issuer, ctx, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + } + chain.done(new FlowDoneHandler(msg) { @Override - public String getName() { - return String.format("delete-security-group-%s", msg.getUuid()); + public void handle(Map data) { + casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); + bus.publish(evt); } - }); + }).error(new FlowErrorHandler(msg) { + @Override + public void handle(ErrorCode errCode, Map data) { + evt.setError(errCode); + bus.publish(evt); + } + }).start(); } private void handle(APIDeleteSecurityGroupRuleMsg msg) { @@ -1824,6 +2640,7 @@ private void doDeleteSecurityGroupRule(String sgUuid, List ruleUuids) { } private void deleteSecurityGroupRule(APIDeleteSecurityGroupRuleMsg msg, String sgUuid, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1842,6 +2659,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { SecurityGroupVO sgvo = dbf.findByUuid(sgUuid, SecurityGroupVO.class); @@ -1857,6 +2680,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, sgUuid, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -1880,7 +2727,7 @@ private void validate(AddVmNicToSecurityGroupMsg msg) { .select(VmNicVO_.uuid) .in(VmNicVO_.uuid, msg.getVmNicUuids()) .listValues(); - if (!uuids.containsAll(msg.getVmNicUuids())) { + if (!new HashSet<>(uuids).containsAll(msg.getVmNicUuids())) { msg.getVmNicUuids().removeAll(uuids); throw new OperationFailureException(err(SysErrors.RESOURCE_NOT_FOUND, "cannot find vm nics[uuids:%s]", msg.getVmNicUuids() @@ -1968,6 +2815,7 @@ private void doAddVmNicToSecurityGroup(String sgUuid, List vmNicUuids) { } private void addVmNicToSecurityGroup(String sgUuid, List vmNicUuids, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(sgUuid); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -1987,6 +2835,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -2000,6 +2854,12 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "update-group-numbers"; + + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -2015,6 +2875,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshVmNics(sdnBackend, vmNicUuids, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -2201,6 +3085,7 @@ public String getName() { } private void doAddSecurityGroupRule(AddSecurityGroupRuleMessage msg, Completion completion) { + SecurityGroupSdnBackend sdnBackend = getSdnBackend(msg.getSecurityGroupUuid()); Map data = new HashMap(); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setData(data); @@ -2278,6 +3163,11 @@ public void run(FlowTrigger trigger, Map data) { flow(new NoRollbackFlow() { String __name__ = "apply-rules-on-hosts"; + @Override + public boolean skip(Map data) { + return sdnBackend != null; + } + @Override public void run(FlowTrigger trigger, Map data) { RuleCalculator cal = new RuleCalculator(); @@ -2289,6 +3179,30 @@ public void run(FlowTrigger trigger, Map data) { } }); + flow(new NoRollbackFlow() { + String __name__ = "apply-rules-on-sdn-controller"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (sdnBackend == null) { + trigger.next(); + return; + } + + sdnRefreshSecurityGroup(sdnBackend, msg.getSecurityGroupUuid(), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { @@ -2308,6 +3222,8 @@ public void handle(ErrorCode errCode, Map data) { } private void handle(APICreateSecurityGroupMsg msg) { + APICreateSecurityGroupEvent evt = new APICreateSecurityGroupEvent(msg.getId()); + SecurityGroupVO vo = new SecurityGroupVO(); if (msg.getResourceUuid() != null) { vo.setUuid(msg.getResourceUuid()); @@ -2317,6 +3233,7 @@ private void handle(APICreateSecurityGroupMsg msg) { vo.setName(msg.getName()); vo.setDescription(msg.getDescription()); vo.setState(SecurityGroupState.Enabled); + vo.setvSwitchType(msg.getvSwitchType()); vo.setInternalId(dbf.generateSequenceNumber(SecurityGroupSequenceNumberVO.class)); vo.setAccountUuid(msg.getSession().getAccountUuid()); @@ -2336,10 +3253,28 @@ protected SecurityGroupVO scripts() { vo = dbf.reload(vo); SecurityGroupInventory inv = SecurityGroupInventory.valueOf(vo); - APICreateSecurityGroupEvent evt = new APICreateSecurityGroupEvent(msg.getId()); - evt.setInventory(inv); - logger.debug(String.format("successfully created security group[uuid:%s, name:%s]", vo.getUuid(), vo.getName())); - bus.publish(evt); + SecurityGroupSdnBackend sdnBackend = getSdnBackend(vo.getUuid()); + if (sdnBackend == null) { + evt.setInventory(inv); + logger.debug(String.format("successfully created security group[uuid:%s, name:%s]", vo.getUuid(), vo.getName())); + bus.publish(evt); + return; + } + + sdnBackend.createSecurityGroup(inv, new Completion(msg) { + @Override + public void success() { + evt.setInventory(inv); + logger.debug(String.format("successfully created security group[uuid:%s, name:%s]", inv.getUuid(), inv.getName())); + bus.publish(evt); + } + + @Override + public void fail(ErrorCode errorCode) { + evt.setError(errorCode); + bus.publish(evt); + } + }); } public String getId() { @@ -2458,9 +3393,20 @@ public void afterMigrateVm(final VmInstanceInventory inv, final String srcHostUu cal.vmNicUuids = CollectionUtils.transformToList(inv.getVmNics(), new Function() { @Override public String call(VmNicInventory arg) { - return arg.getUuid(); + // security group for ovn network does not care vm migration + String vswitchType = L3NetworkHelper.getL3networkVSwitchType(arg.getL3NetworkUuid()); + if (VSwitchType.valueOf(vswitchType).isAttachToCluster()) { + return arg.getUuid(); + } else { + return null; + } } }); + + if (cal.vmNicUuids.isEmpty()) { + return; + } + // if migrate vm with Storage,the vm stat is migrating cal.vmStates = asList(VmInstanceState.Running, VmInstanceState.Migrating); List htos = cal.calculate(); @@ -2498,9 +3444,19 @@ public void failedToMigrateVm(final VmInstanceInventory inv, final String destHo cal.vmNicUuids = CollectionUtils.transformToList(inv.getVmNics(), new Function() { @Override public String call(VmNicInventory arg) { - return arg.getUuid(); + // security group for ovn network does not care vm migration + String vswitchType = L3NetworkHelper.getL3networkVSwitchType(arg.getL3NetworkUuid()); + if (VSwitchType.valueOf(vswitchType).isAttachToCluster()) { + return arg.getUuid(); + } else { + return null; + } } }); + if (cal.vmNicUuids.isEmpty()) { + return; + } + cal.vmStates = asList(VmInstanceState.Unknown); List htos = cal.calculate(); @@ -2623,4 +3579,79 @@ public String getName() { return FailureHostWorker.class.getName(); } } + + private SecurityGroupSdnBackend getSdnBackend(String sgUuid) { + String sdnControllerUuid = SecurityGroupHelper.getSdnControllerUuid(sgUuid); + if (sdnControllerUuid == null) { + return null; + } + + for (SecurityGroupGetSdnBackendExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetSdnBackendExtensionPoint.class)) { + SecurityGroupSdnBackend backend = exp.getSecurityGroupSdnBackend(sdnControllerUuid); + if (backend != null) { + return backend; + } + } + + throw new CloudRuntimeException(String.format("can not find security backend for sdn controller[uuid:%s]", sdnControllerUuid)); + } + + private SecurityGroupSdnBackend getSdnBackendFroL3Uuid(String l3Uuid) { + String sdnControllerUuid = L3NetworkHelper.getSdnControllerUuidFromL3Uuid(l3Uuid); + if (sdnControllerUuid == null) { + return null; + } + + for (SecurityGroupGetSdnBackendExtensionPoint exp : pluginRgty.getExtensionList(SecurityGroupGetSdnBackendExtensionPoint.class)) { + SecurityGroupSdnBackend backend = exp.getSecurityGroupSdnBackend(sdnControllerUuid); + if (backend != null) { + return backend; + } + } + + return null; + } + + @Override + public void deleteNetworkServiceOfSdnController(String sdnControllerUuid, Completion completion) { + List sgUuids = Q.New(SecurityGroupVO.class) + .select(SecurityGroupVO_.uuid).listValues(); + if (sgUuids.isEmpty()) { + completion.success(); + return; + } + + List sdnSgUuids = new ArrayList<>(); + for (String uuid : sgUuids) { + String controllerUuid = SecurityGroupHelper.getSdnControllerUuid(uuid); + if (sdnControllerUuid.equals(controllerUuid)) { + sdnSgUuids.add(uuid); + } + } + if (sdnControllerUuid.isEmpty()) { + completion.success(); + return; + } + + new While<>(sdnSgUuids).step((uuid, wcomp) -> { + SecurityGroupDeletionMsg msg = new SecurityGroupDeletionMsg(); + msg.setUuid(uuid); + bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, uuid); + bus.send(msg, new CloudBusCallBack(wcomp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("failed to security group [uuid:%s], %s", msg.getUuid(), reply.getError())); + } + + wcomp.done(); + } + }); + }, 10).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + completion.success(); + } + }); + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java index f0bea6d0b72..e8ab05e84c3 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupNetworkServiceExtension.java @@ -9,7 +9,13 @@ import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.Q; import org.zstack.core.db.SQL; +import org.zstack.core.asyncbatch.While; +import org.zstack.header.core.WhileDoneCompletion; import org.zstack.header.core.Completion; +import org.zstack.core.workflow.FlowChainBuilder; +import org.zstack.header.core.workflow.*; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l3.L3NetworkInventory; @@ -24,6 +30,7 @@ import java.util.*; import java.util.stream.Collectors; import javax.persistence.Query; +import static org.zstack.core.Platform.operr; /** */ @@ -116,30 +123,161 @@ private List syncSystemTagToVmNicSecurityGroup(String vmUuid) { @Override public void applyNetworkService(VmInstanceSpec servedVm, Map data, final Completion completion) { - List sgUuids = syncSystemTagToVmNicSecurityGroup(servedVm.getVmInventory().getUuid()); + syncSystemTagToVmNicSecurityGroup(servedVm.getVmInventory().getUuid()); - Map> map = getNetworkServiceProviderMap(SecurityGroupProviderFactory.networkServiceType, - VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks())); + Map> map = getNetworkServiceProviderMap( + SecurityGroupProviderFactory.networkServiceType, + VmNicSpec.getL3NetworkInventoryOfSpec(servedVm.getL3Networks()) + ); if (map.isEmpty()) { completion.success(); return; } - RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg(); - msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid()); - msg.setHostUuid(servedVm.getDestHost().getUuid()); - msg.setSgUuids(sgUuids); - bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID); - bus.send(msg, new CloudBusCallBack(completion) { + List destNics = servedVm.getDestNics(); + + List vmNicUuids = destNics.stream() + .map(VmNicInventory::getUuid) + .collect(Collectors.toList()); + + List sgUuids = Q.New(VmNicSecurityGroupRefVO.class) + .in(VmNicSecurityGroupRefVO_.vmNicUuid, vmNicUuids) + .select(VmNicSecurityGroupRefVO_.securityGroupUuid) + .listValues(); + + if (sgUuids == null || sgUuids.isEmpty()) { + logger.warn(String.format("No security groups found for vmNics: " + vmNicUuids)); + completion.success(); + return; + } + + Set allRelatedSgUuids = new HashSet<>(sgUuids); + + List remoteSGUuids = Q.New(SecurityGroupRuleVO.class) + .in(SecurityGroupRuleVO_.remoteSecurityGroupUuid, sgUuids) + .select(SecurityGroupRuleVO_.securityGroupUuid) + .listValues(); + + allRelatedSgUuids.addAll(remoteSGUuids); + + Set vmUuidsToRefresh = new HashSet<>(); + + vmUuidsToRefresh.add(servedVm.getVmInventory().getUuid()); + + List vmUuids = Q.New(VmNicSecurityGroupRefVO.class) + .in(VmNicSecurityGroupRefVO_.securityGroupUuid, new ArrayList<>(allRelatedSgUuids)) + .select(VmNicSecurityGroupRefVO_.vmInstanceUuid) + .listValues(); + + vmUuidsToRefresh.addAll(vmUuids); + + FlowChain schain = FlowChainBuilder.newSimpleFlowChain().setName(String.format("apply-security-group-to-vm-%s", servedVm.getVmInventory().getUuid())); + schain.allowEmptyFlow(); + + Flow applyToCurrentVmFlow = new Flow() { + String __name__ = "apply-security-group-rules-to-current-vm"; + @Override - public void run(MessageReply reply) { - if (reply.isSuccess()) { - completion.success(); - } else { - completion.fail(reply.getError()); + public void run(FlowTrigger trigger, Map data) { + logger.debug(String.format("Applying security group rules to current VM[uuid:%s]", servedVm.getVmInventory().getUuid())); + + RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg(); + msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid()); + msg.setHostUuid(servedVm.getDestHost().getUuid()); + msg.setSgUuids(sgUuids); + msg.setOperation(servedVm.getCurrentVmOperation()); + bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID); + + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + trigger.next(); + } else { + trigger.fail(operr("Failed to apply security group rules to current VM[uuid:%s]", + servedVm.getVmInventory().getUuid()) + .causedBy(reply.getError())); + } + } + }); + } + + @Override + public void rollback(FlowRollback rollback, Map data) { + logger.debug(String.format("No rollback needed for applying security group rules to current VM[uuid:%s]", servedVm.getVmInventory().getUuid())); + rollback.rollback(); + } + }; + + schain.then(applyToCurrentVmFlow); + + Flow applyToOtherVmsFlow = new Flow() { + String __name__ = "apply-security-group-rules-to-other-vms"; + + @Override + public void run(FlowTrigger trigger, Map data) { + Set otherVmUuids = new HashSet<>(vmUuidsToRefresh); + otherVmUuids.remove(servedVm.getVmInventory().getUuid()); + + if (otherVmUuids.isEmpty()) { + trigger.next(); + return; } + + List errs = Collections.synchronizedList(new ArrayList<>()); + + logger.debug(String.format("Applying security group rules to %d other VMs: %s", otherVmUuids.size(), otherVmUuids)); + + new While<>(otherVmUuids) + .each((vmUuid, wcompl) -> { + RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg(); + msg.setVmInstanceUuid(vmUuid); + bus.makeTargetServiceIdByResourceUuid(msg, SecurityGroupConstant.SERVICE_ID, vmUuid); + + bus.send(msg, new CloudBusCallBack(wcompl) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("Failed to refresh security group rules for VM[uuid:%s]: %s", + vmUuid, reply.getError())); + errs.add(reply.getError()); + } + wcompl.done(); + } + }); + }) + .run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errs.isEmpty()) { + trigger.next(); + } else { + trigger.fail(operr("Failed to apply security group rules to some VMs")); + } + } + }); } - }); + + @Override + public void rollback(FlowRollback rollback, Map data) { + logger.debug("Rolling back security group application to other VMs... (no-op)"); + rollback.rollback(); + } + }; + + schain.then(applyToOtherVmsFlow); + + schain.error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode err, Map data) { + completion.fail(err); + } + }).done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }).start(); } @Override @@ -157,6 +295,7 @@ public void releaseNetworkService(final VmInstanceSpec servedVm, Map q = dbf.createQuery(NetworkServiceProviderVO.class); q.add(NetworkServiceProviderVO_.type, Op.EQ, SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE); diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java new file mode 100644 index 00000000000..c134674f9a9 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSdnBackend.java @@ -0,0 +1,14 @@ +package org.zstack.network.securitygroup; + +import org.zstack.header.core.Completion; +import org.zstack.header.vm.VmNicVO; + +import java.util.List; + +public interface SecurityGroupSdnBackend { + void createSecurityGroup(SecurityGroupInventory sg, Completion completion); + + void updateSecurityGroup(VmNicSecurityGroupTo to, Completion completion); + + List getCandidateVmNic(String sgId, String accountUuid); +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java new file mode 100644 index 00000000000..a15583881c2 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupSystemTags.java @@ -0,0 +1,11 @@ +package org.zstack.network.securitygroup; + +import org.zstack.header.tag.TagDefinition; +import org.zstack.tag.PatternedSystemTag; + +@TagDefinition +public class SecurityGroupSystemTags { + public static String SDN_CONTROLLER_UUID_TOKEN = "SdnControllerUuid"; + public static PatternedSystemTag SDN_CONTROLLER_UUID = new PatternedSystemTag( + String.format("SdnControllerUuid::{%s}", SDN_CONTROLLER_UUID_TOKEN), SecurityGroupVO.class); +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java new file mode 100644 index 00000000000..141e53798c8 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupTo.java @@ -0,0 +1,72 @@ +package org.zstack.network.securitygroup; + +import java.util.ArrayList; +import java.util.List; + +public class SecurityGroupTo { + public static final String ACTION_CODE_APPLY_CHAIN = "applyChain"; + public static final String ACTION_CODE_DELETE_CHAIN = "deleteChain"; + private String securityGroupUuid; + private String securityGroupName; + private Integer internalId; + private List securityGroupVmIps = new ArrayList<>(); + private List securityGroupVmIp6s = new ArrayList<>(); + private String actionCode; + private List rules = new ArrayList<>(); + + public String getSecurityGroupUuid() { + return securityGroupUuid; + } + + public void setSecurityGroupUuid(String securityGroupUuid) { + this.securityGroupUuid = securityGroupUuid; + } + + public String getSecurityGroupName() { + return securityGroupName; + } + + public void setSecurityGroupName(String securityGroupName) { + this.securityGroupName = securityGroupName; + } + + public Integer getInternalId() { + return internalId; + } + + public void setInternalId(Integer internalId) { + this.internalId = internalId; + } + + public List getSecurityGroupVmIps() { + return securityGroupVmIps; + } + + public void setSecurityGroupVmIps(List securityGroupVmIps) { + this.securityGroupVmIps = securityGroupVmIps; + } + + public List getSecurityGroupVmIp6s() { + return securityGroupVmIp6s; + } + + public void setSecurityGroupVmIp6s(List securityGroupVmIp6s) { + this.securityGroupVmIp6s = securityGroupVmIp6s; + } + + public String getActionCode() { + return actionCode; + } + + public void setActionCode(String actionCode) { + this.actionCode = actionCode; + } + + public List getRules() { + return rules; + } + + public void setRules(List rules) { + this.rules = rules; + } +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java index ba7ebc473ab..cb5fa5fcbc1 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO.java @@ -2,7 +2,6 @@ import org.zstack.header.identity.OwnedByAccount; import org.zstack.header.vo.BaseResource; -import org.zstack.header.vo.EntityGraph; import org.zstack.header.vo.Index; import org.zstack.header.vo.ResourceVO; @@ -33,6 +32,9 @@ public class SecurityGroupVO extends ResourceVO implements OwnedByAccount { @Deprecated private Integer ipVersion; + @Column + private String vSwitchType; + @Column private Timestamp createDate; @@ -138,4 +140,12 @@ public Integer getIpVersion() { public void setIpVersion(Integer ipVersion) { this.ipVersion = ipVersion; } + + public String getvSwitchType() { + return vSwitchType; + } + + public void setvSwitchType(String vSwitchType) { + this.vSwitchType = vSwitchType; + } } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java index 98cf7f31abe..18072ff7279 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupVO_.java @@ -13,6 +13,7 @@ public class SecurityGroupVO_ extends ResourceVO_ { public static volatile SingularAttribute state; public static volatile SingularAttribute internalId; public static volatile SingularAttribute ipVersion; + public static volatile SingularAttribute vSwitchType; public static volatile SingularAttribute createDate; public static volatile SingularAttribute lastOpDate; } diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java new file mode 100644 index 00000000000..18e716a20c4 --- /dev/null +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityGroupTo.java @@ -0,0 +1,25 @@ +package org.zstack.network.securitygroup; + +import java.util.ArrayList; +import java.util.List; + +public class VmNicSecurityGroupTo { + List vmNics = new ArrayList<>(); + List groups = new ArrayList<>(); + + public List getVmNics() { + return vmNics; + } + + public void setVmNics(List vmNics) { + this.vmNics = vmNics; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } +} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java index c5b2c4514cd..16cd5279e82 100644 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/VmNicSecurityTO.java @@ -16,6 +16,7 @@ public class VmNicSecurityTO { private String egressPolicy; private String actionCode = ACTION_CODE_APPLY_CHAIN; private Map securityGroupRefs; + private boolean sync = false; public VmNicSecurityTO() { securityGroupRefs = new HashMap(); @@ -85,4 +86,12 @@ public Map getSecurityGroupRefs() { public void setSecurityGroupRefs(Map securityGroupRefs) { this.securityGroupRefs = securityGroupRefs; } + + public boolean isSync() { + return sync; + } + + public void setSync(boolean sync) { + this.sync = sync; + } } diff --git a/plugin/sftpBackupStorage/pom.xml b/plugin/sftpBackupStorage/pom.xml index f65632f2ffa..94f4a9a2b3a 100755 --- a/plugin/sftpBackupStorage/pom.xml +++ b/plugin/sftpBackupStorage/pom.xml @@ -4,7 +4,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 .. sftpBackupStorage diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java index 9f9f3f16005..ec01923a4fd 100755 --- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java +++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/SftpBackupStorageGlobalProperty.java @@ -10,7 +10,7 @@ @GlobalPropertyDefinition public class SftpBackupStorageGlobalProperty { - @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.2.0.tar.gz") + @GlobalProperty(name="SftpBackupStorage.agentPackageName", defaultValue = "sftpbackupstorage-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="SftpBackupStorage.agentPort", defaultValue = "7171") public static int AGENT_PORT; diff --git a/plugin/sharedMountPointPrimaryStorage/pom.xml b/plugin/sharedMountPointPrimaryStorage/pom.xml index caeff34f1b8..20695c58859 100755 --- a/plugin/sharedMountPointPrimaryStorage/pom.xml +++ b/plugin/sharedMountPointPrimaryStorage/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java index b914d291026..c78d3b89172 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/HypervisorBackend.java @@ -97,7 +97,9 @@ public HypervisorBackend(PrimaryStorageVO self) { abstract void handle(ResizeVolumeOnPrimaryStorageMsg msg, ReturnValueCompletion returnValueCompletion); - abstract void handle(UndoSnapshotCreationOnPrimaryStorageMsg msg, ReturnValueCompletion completion); + abstract void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, ReturnValueCompletion completion); + + abstract void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, ReturnValueCompletion completion); abstract void createEmptyVolumeWithBackingFile(final VolumeInventory volume, String hostUuid, String backingFile, final ReturnValueCompletion completion); } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java index c640a0040c7..1a0351c76af 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/KvmBackend.java @@ -43,7 +43,10 @@ import org.zstack.header.vm.VmInstanceState; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmInstanceVO_; -import org.zstack.header.volume.*; +import org.zstack.header.volume.VolumeConstant; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.header.volume.VolumeType; +import org.zstack.header.volume.VolumeVO; import org.zstack.kvm.*; import org.zstack.storage.primary.*; import org.zstack.storage.volume.VolumeErrors; @@ -58,7 +61,6 @@ import javax.persistence.Tuple; import java.io.File; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; @@ -333,6 +335,41 @@ public static class OfflineMergeSnapshotCmd extends AgentCmd implements HasThrea public boolean fullRebase; } + public static class OfflineMergeSnapshotRsp extends AgentRsp { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + + public static class OfflineCommitSnapshotCmd extends AgentCmd implements HasThreadContext { + @GrayVersion(value = "5.4.0") + public String top; + @GrayVersion(value = "5.4.0") + public String base; + @GrayVersion(value = "5.4.0") + public List topChildrenInstallPathInDb = new ArrayList<>(); + } + + public static class OfflineCommitSnapshotRsp extends AgentRsp { + @GrayVersion(value = "5.4.0") + private long actualSize; + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + } + public static class CreateEmptyVolumeCmd extends AgentCmd { @GrayVersion(value = "5.0.0") public String installPath; @@ -470,6 +507,7 @@ public static class GetBackingChainRsp extends AgentRsp { public static final String REINIT_IMAGE_PATH = "/sharedmountpointprimarystorage/volume/reinitimage"; public static final String MERGE_SNAPSHOT_PATH = "/sharedmountpointprimarystorage/snapshot/merge"; public static final String OFFLINE_MERGE_SNAPSHOT_PATH = "/sharedmountpointprimarystorage/snapshot/offlinemerge"; + public static final String OFFLINE_COMMIT_SNAPSHOT_PATH = "/sharedmountpointprimarystorage/snapshot/offlinecommit"; public static final String CREATE_EMPTY_VOLUME_PATH = "/sharedmountpointprimarystorage/volume/createempty"; public static final String CREATE_FOLDER_PATH = "/sharedmountpointprimarystorage/volume/createfolder"; public static final String CHECK_BITS_PATH = "/sharedmountpointprimarystorage/bits/check"; @@ -1863,58 +1901,6 @@ public void fail(ErrorCode errorCode) { }); } - @Override - void handle(UndoSnapshotCreationOnPrimaryStorageMsg msg, ReturnValueCompletion completion) { - VolumeInventory vol = msg.getVolume(); - String hostUuid; - String connectedHostUuid = primaryStorageFactory.getConnectedHostForOperation(getSelfInventory()).get(0).getUuid(); - if (vol.getVmInstanceUuid() != null){ - Tuple t = Q.New(VmInstanceVO.class) - .select(VmInstanceVO_.state, VmInstanceVO_.hostUuid) - .eq(VmInstanceVO_.uuid, vol.getVmInstanceUuid()) - .findTuple(); - VmInstanceState state = t.get(0, VmInstanceState.class); - String vmHostUuid = t.get(1, String.class); - - if (state == VmInstanceState.Running || state == VmInstanceState.Paused){ - DebugUtils.Assert(vmHostUuid != null, - String.format("vm[uuid:%s] is Running or Paused, but has no hostUuid", vol.getVmInstanceUuid())); - hostUuid = vmHostUuid; - } else if (state == VmInstanceState.Stopped){ - hostUuid = connectedHostUuid; - } else { - completion.fail(operr("vm[uuid:%s] is not Running, Paused or Stopped, current state[%s]", - vol.getVmInstanceUuid(), state)); - return; - } - } else { - hostUuid = connectedHostUuid; - } - - CommitVolumeOnHypervisorMsg hmsg = new CommitVolumeOnHypervisorMsg(); - hmsg.setHostUuid(hostUuid); - hmsg.setVmUuid(msg.getVmUuid()); - hmsg.setVolume(msg.getVolume()); - hmsg.setSrcPath(msg.getSrcPath()); - hmsg.setDstPath(msg.getDstPath()); - bus.makeTargetServiceIdByResourceUuid(hmsg, HostConstant.SERVICE_ID, hostUuid); - bus.send(hmsg, new CloudBusCallBack(msg) { - @Override - public void run(MessageReply reply) { - UndoSnapshotCreationOnPrimaryStorageReply ret = new UndoSnapshotCreationOnPrimaryStorageReply(); - if (!reply.isSuccess()) { - completion.fail(reply.getError()); - return; - } - - CommitVolumeOnHypervisorReply treply = (CommitVolumeOnHypervisorReply) reply; - ret.setSize(treply.getSize()); - ret.setNewVolumeInstallPath(treply.getNewVolumeInstallPath()); - completion.success(ret); - } - }); - } - @Override void deleteBits(String path, final Completion completion) { deleteBits(path, false, completion); @@ -2555,4 +2541,49 @@ public void fail(ErrorCode errorCode) { } }); } + + @Override + void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, final ReturnValueCompletion completion) { + OfflineCommitSnapshotCmd cmd = new OfflineCommitSnapshotCmd(); + cmd.top = msg.getSrcSnapshot().getPrimaryStorageInstallPath(); + cmd.base = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.topChildrenInstallPathInDb = msg.getSrcChildrenInstallPathInDb(); + new Do().go(OFFLINE_COMMIT_SNAPSHOT_PATH, cmd, OfflineCommitSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(AgentRsp returnValue) { + OfflineCommitSnapshotRsp rsp = (OfflineCommitSnapshotRsp) returnValue; + + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + @Override + void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, final ReturnValueCompletion completion) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + OfflineMergeSnapshotCmd cmd = new OfflineMergeSnapshotCmd(); + cmd.srcPath = msg.getSrcSnapshotParentPath(); + cmd.destPath = msg.getDstSnapshot().getPrimaryStorageInstallPath(); + cmd.fullRebase = cmd.srcPath == null; + new Do().go(OFFLINE_MERGE_SNAPSHOT_PATH, cmd, OfflineMergeSnapshotRsp.class, new ReturnValueCompletion(completion) { + @Override + public void success(AgentRsp returnValue) { + OfflineMergeSnapshotRsp rsp = (OfflineMergeSnapshotRsp) returnValue; + reply.setSize(rsp.getActualSize()); + completion.success(reply); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } } diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java index 8fe390a7dfa..38aeef95cc1 100755 --- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java +++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/SMPPrimaryStorageBase.java @@ -38,10 +38,7 @@ import org.zstack.kvm.KVMConstant; import org.zstack.kvm.KVMHostInventory; import org.zstack.kvm.KVMTakeSnapshotExtensionPoint; -import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg; -import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply; -import org.zstack.storage.primary.PrimaryStorageBase; -import org.zstack.storage.primary.PrimaryStorageCapacityUpdater; +import org.zstack.storage.primary.*; import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.storage.volume.VolumeErrors; import org.zstack.storage.volume.VolumeSystemTags; @@ -399,6 +396,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { String volumeType = msg.getVolume().getType(); if (VolumeType.Data.toString().equals(volumeType) || VolumeType.Root.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); } else if (VolumeType.Memory.toString().equals(volumeType)) { capability.setArrangementType(VolumeSnapshotArrangementType.INDIVIDUAL); } else { @@ -663,8 +661,10 @@ public void handleLocalMessage(Message msg) { handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); } else if (msg instanceof ResizeVolumeOnPrimaryStorageMsg) { handle((ResizeVolumeOnPrimaryStorageMsg) msg); - } else if (msg instanceof UndoSnapshotCreationOnPrimaryStorageMsg) { - handle((UndoSnapshotCreationOnPrimaryStorageMsg) msg); + } else if (msg instanceof CommitVolumeSnapshotOnPrimaryStorageMsg) { + handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg); + } else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) { + handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -725,8 +725,14 @@ public void fail(ErrorCode errorCode) { } private void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { - HypervisorFactory f = getHypervisorFactoryByHostUuid(msg.getHostUuid()); - HypervisorBackend bkd = f.getHypervisorBackend(self); + HypervisorBackend bkd; + if (msg.getHostUuid() == null) { + bkd = getHypervisorBackendByVolumeUuid(msg.getVolumeUuid()); + } else { + HypervisorFactory f = getHypervisorFactoryByHostUuid(msg.getHostUuid()); + bkd = f.getHypervisorBackend(self); + } + bkd.handle(msg, new ReturnValueCompletion(msg) { public void success(GetVolumeBackingChainFromPrimaryStorageReply returnValue) { bus.reply(msg, returnValue); @@ -809,7 +815,7 @@ public void handle(ErrorCode errCode, Map data) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } @@ -1052,23 +1058,6 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(final UndoSnapshotCreationOnPrimaryStorageMsg msg) { - HypervisorBackend bkd = getHypervisorBackendByVolumeUuid(msg.getVolume().getUuid()); - bkd.handle(msg, new ReturnValueCompletion(msg) { - @Override - public void success(UndoSnapshotCreationOnPrimaryStorageReply returnValue) { - bus.reply(msg, returnValue); - } - - @Override - public void fail(ErrorCode errorCode) { - UndoSnapshotCreationOnPrimaryStorageReply reply = new UndoSnapshotCreationOnPrimaryStorageReply(); - reply.setError(errorCode); - bus.reply(msg, reply); - } - }); - } - @Transactional(readOnly = true) protected String getAvailableHostUuidForOperation() { String sql = "select host.uuid from PrimaryStorageClusterRefVO ref, HostVO host where" + @@ -1226,6 +1215,39 @@ public void fail(ErrorCode errorCode) { }); } + private void handle(final CommitVolumeSnapshotOnPrimaryStorageMsg msg) { + HypervisorBackend bkd = getHypervisorBackendByVolumeUuid(msg.getVolume().getUuid()); + bkd.handle(msg, new ReturnValueCompletion(msg) { + @Override + public void success(CommitVolumeSnapshotOnPrimaryStorageReply reply) { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + CommitVolumeSnapshotOnPrimaryStorageReply reply = new CommitVolumeSnapshotOnPrimaryStorageReply(); + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + + private void handle(final PullVolumeSnapshotOnPrimaryStorageMsg msg) { + HypervisorBackend bkd = getHypervisorBackendByVolumeUuid(msg.getVolume().getUuid()); + bkd.handle(msg, new ReturnValueCompletion(msg) { + @Override + public void success(PullVolumeSnapshotOnPrimaryStorageReply reply) { + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + PullVolumeSnapshotOnPrimaryStorageReply reply = new PullVolumeSnapshotOnPrimaryStorageReply(); + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } private boolean isSharedMountPointPrimaryStorage(String psUuid) { return psUuid != null && Q.New(PrimaryStorageVO.class) diff --git a/plugin/sshKeyPair/pom.xml b/plugin/sshKeyPair/pom.xml index b296da499a0..51e8e74c9a0 100644 --- a/plugin/sshKeyPair/pom.xml +++ b/plugin/sshKeyPair/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 sshKeyPair diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java index d2d4881b576..a5c9c4607bb 100644 --- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java +++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIUpdateSshKeyPairMsg.java @@ -53,6 +53,7 @@ public static APIUpdateSshKeyPairMsg __example__() { APIUpdateSshKeyPairMsg ret = new APIUpdateSshKeyPairMsg(); ret.name = "ssh-key-pair"; ret.description = "description"; + ret.uuid = uuid(); return ret; } diff --git a/plugin/sugonSdnController/pom.xml b/plugin/sugonSdnController/pom.xml index d7aef709bca..a45fbb7638f 100644 --- a/plugin/sugonSdnController/pom.xml +++ b/plugin/sugonSdnController/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java index d48af64991a..1ffaf20178e 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/account/AccountSync.java @@ -1,6 +1,7 @@ package org.zstack.sugonSdnController.account; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.sdnController.SdnController; import org.zstack.sugonSdnController.controller.SugonSdnController; import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant; import org.zstack.core.db.Q; @@ -8,10 +9,9 @@ import org.zstack.header.identity.BeforeCreateAccountExtensionPoint; import org.zstack.header.identity.BeforeDeleteAccountExtensionPoint; import org.zstack.header.identity.BeforeUpdateAccountExtensionPoint; -import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; /** * @description: diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java index f8c66d4cd41..45a68537e38 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java @@ -3,18 +3,25 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.net.util.SubnetUtils; import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.header.core.Completion; import org.zstack.header.identity.AccountInventory; import org.zstack.header.identity.AccountVO; import org.zstack.header.identity.AccountVO_; +import org.zstack.header.message.Message; import org.zstack.header.network.l2.APICreateL2NetworkMsg; +import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l2.L2NetworkVO; import org.zstack.header.network.l3.*; +import org.zstack.header.network.sdncontroller.*; import org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory; import org.zstack.network.l3.L3NetworkSystemTags; import org.zstack.sdnController.SdnController; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.header.*; import org.zstack.sugonSdnController.controller.api.*; import org.zstack.sugonSdnController.controller.api.types.*; @@ -30,18 +37,28 @@ import static org.zstack.utils.network.NetworkUtils.getSubnetInfo; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class SugonSdnController implements TfSdnController, SdnController { +public class SugonSdnController implements TfSdnController, SdnController, SdnControllerL2 { private static final CLogger logger = Utils.getLogger(SugonSdnController.class); - private SdnControllerVO sdnControllerVO; + @Autowired + CloudBus bus; + @Autowired + DatabaseFacade dbf; + private SdnControllerVO sdnControllerVO; private TfHttpClient client; + public SugonSdnController(SdnControllerVO vo) { sdnControllerVO = vo; client = new TfHttpClient(vo.getIp()); } + @Override + public void handleMessage(SdnControllerMessage msg) { + bus.dealWithUnknownMessage((Message) msg); + } + @Override public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completion) { try { @@ -87,13 +104,24 @@ public void preInitSdnController(APIAddSdnControllerMsg msg, Completion completi } } + @Override + public void createSdnControllerDb(APIAddSdnControllerMsg msg, SdnControllerVO vo, Completion completion) { + dbf.persist(vo); + completion.success(); + } + + @Override + public void deleteSdnControllerDb(SdnControllerVO vo) { + dbf.removeByPrimaryKey(vo.getUuid(), SdnControllerVO.class); + } + @Override public void initSdnController(APIAddSdnControllerMsg msg, Completion completion) { completion.success(); } @Override - public void postInitSdnController(APIAddSdnControllerMsg msg, Completion completion){ + public void postInitSdnController(SdnControllerVO vo, Completion completion){ completion.success(); } @@ -103,7 +131,7 @@ public void preCreateVxlanNetwork(L2VxlanNetworkInventory vxlan, List sy } @Override - public void createVxlanNetwork(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void createL2Network(L2NetworkInventory inv, APICreateL2NetworkMsg msg, Completion completion) { completion.success(); } @@ -117,8 +145,9 @@ public void preAttachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List systemTags, Completion completion) { + public void attachL2NetworkToCluster(L2VxlanNetworkInventory vxlan, List clusterUuids, List systemTags, Completion completion) { completion.success(); } @@ -211,12 +240,12 @@ public void deleteSdnController(SdnControllerDeletionMsg msg, SdnControllerInven } @Override - public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, String clusterUuid, Completion completion) { + public void detachL2NetworkFromCluster(L2VxlanNetworkInventory vxlan, List clusterUuid, Completion completion) { completion.success(); } @Override - public void deleteVxlanNetwork(L2VxlanNetworkInventory vxlan, Completion completion) { + public void deleteL2Network(L2NetworkInventory vxlan, Completion completion) { completion.success(); } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java index caa7c614a68..b277a336c3d 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnControllerFactory.java @@ -1,20 +1,44 @@ package org.zstack.sugonSdnController.controller; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.network.securitygroup.SecurityGroupSdnBackend; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerFactory; +import org.zstack.sdnController.SdnControllerL2; import org.zstack.sdnController.SdnControllerType; -import org.zstack.sdnController.header.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO; public class SugonSdnControllerFactory implements SdnControllerFactory { SdnControllerType sdnControllerType = new SdnControllerType(SugonSdnControllerConstant.TF_CONTROLLER); + + @Autowired + private DatabaseFacade dbf; + @Override public SdnControllerType getVendorType() { return sdnControllerType; } + @Override + public SdnControllerVO persistSdnController(SdnControllerVO vo) { + vo = dbf.persistAndRefresh(vo); + return vo; + } + @Override public SdnController getSdnController(SdnControllerVO vo) { return new SugonSdnController(vo); } + + @Override + public SdnControllerL2 getSdnControllerL2(SdnControllerVO vo) { + return new SugonSdnController(vo); + } + + @Override + public SecurityGroupSdnBackend getSdnControllerSecurityGroup(SdnControllerVO vo) { + return null; + } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java index 0251d480d62..1054f708696 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java @@ -5,10 +5,9 @@ import org.zstack.core.db.Q; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; -import org.zstack.sdnController.header.SdnControllerConstant; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; -import org.zstack.sugonSdnController.controller.SugonSdnControllerGlobalProperty; +import org.zstack.header.network.sdncontroller.SdnControllerConstant; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.sugonSdnController.controller.api.*; import org.zstack.sugonSdnController.controller.api.types.*; import org.zstack.utils.StringDSL; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java index 06520d030a7..1855c797a32 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL2Network.java @@ -1,8 +1,7 @@ package org.zstack.sugonSdnController.network; import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.header.network.l3.L3NetworkVO; -import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.sdnController.SdnController; import org.zstack.sugonSdnController.controller.SugonSdnController; import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant; import org.zstack.core.db.Q; @@ -14,10 +13,9 @@ import org.zstack.header.message.Message; import org.zstack.header.network.l2.*; import org.zstack.network.l2.L2NoVlanNetwork; -import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import static org.zstack.core.Platform.err; import static org.zstack.core.Platform.operr; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java index 2c3327db5a6..8d9531ede52 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfL3Network.java @@ -14,8 +14,8 @@ import org.zstack.network.l3.L3BasicNetwork; import org.zstack.sdnController.SdnController; import org.zstack.sdnController.SdnControllerManager; -import org.zstack.sdnController.header.SdnControllerVO; -import org.zstack.sdnController.header.SdnControllerVO_; +import org.zstack.header.network.sdncontroller.SdnControllerVO; +import org.zstack.header.network.sdncontroller.SdnControllerVO_; import org.zstack.sugonSdnController.controller.SugonSdnController; import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant; import org.zstack.sugonSdnController.controller.neutronClient.TfPortClient; diff --git a/plugin/vhost/pom.xml b/plugin/vhost/pom.xml index 60294c33795..a132e6b2567 100644 --- a/plugin/vhost/pom.xml +++ b/plugin/vhost/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/vip/pom.xml b/plugin/vip/pom.xml index 863dbf37725..ec953869f29 100755 --- a/plugin/vip/pom.xml +++ b/plugin/vip/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/virtualRouterProvider/pom.xml b/plugin/virtualRouterProvider/pom.xml index 41653474ff6..a8eb705f54f 100755 --- a/plugin/virtualRouterProvider/pom.xml +++ b/plugin/virtualRouterProvider/pom.xml @@ -4,7 +4,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 virtualRouterProvider diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java index 13ee9d98ed2..85287633e0c 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouter.java @@ -404,7 +404,7 @@ private void handle(final PingVirtualRouterVmMsg msg) { thdf.chainSubmit(new ChainTask(msg) { @Override public String getSyncSignature() { - return String.format("ping-virtualrouter-%s", self.getUuid()); + return syncThreadName; } @Override @@ -412,6 +412,10 @@ public void run(final SyncTaskChain chain) { final PingVirtualRouterVmReply reply = new PingVirtualRouterVmReply(self.getUuid()); if ((VmInstanceState.Running != self.getState() && VmInstanceState.Unknown != self.getState()) || ApplianceVmStatus.Connecting == getSelf().getStatus()) { + if (VmInstanceState.Stopped == self.getState() + && ApplianceVmStatus.Disconnected != getSelf().getStatus()) { + changeApplianceVmStatus(ApplianceVmStatus.Disconnected); + } reply.setDoReconnect(false); bus.reply(msg, reply); chain.next(); @@ -466,7 +470,7 @@ public void done(ErrorCodeList errorCodeList) { if (replies.size() == steps.size()) { changeApplianceVmStatus(ApplianceVmStatus.Disconnected); } - + bus.reply(msg, replies.get(0)); chain.next(); } @@ -922,10 +926,6 @@ public void handle(Map data) { }).error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - if (oldStatus == ApplianceVmStatus.Connected) { - fireDisconnectedCanonicalEvent(errCode); - } - completion.fail(errCode); } }).start(); @@ -1116,7 +1116,27 @@ protected void afterAttachNic(VmNicInventory nicInventory, boolean applyToBacken usedIpVO.setMetaData(GUEST_NIC_MASK.toString()); dbf.updateAndRefresh(usedIpVO); } else { - vo.setMetaData(ADDITIONAL_PUBLIC_NIC_MASK.toString()); + VirtualRouterVmVO vrVO = Q.New(VirtualRouterVmVO.class) + .eq(VirtualRouterVmVO_.uuid, self.getUuid()) + .find(); + boolean isOfferingPubNic = vrVO.getPublicNetworkUuid() != null && + vrVO.getPublicNetworkUuid().equals(l3NetworkVO.getUuid()); + if (isOfferingPubNic) { + VirtualRouterOfferingVO offering = Q.New(VirtualRouterOfferingVO.class) + .eq(VirtualRouterOfferingVO_.uuid, vrVO.getInstanceOfferingUuid()) + .find(); + if (offering == null) { + vo.setMetaData(VirtualRouterNicMetaData.PUBLIC_NIC_MASK.toString()); + } else { + boolean hasSeparatePublic = offering.getPublicNetworkUuid() != null && + !offering.getManagementNetworkUuid().equals(offering.getPublicNetworkUuid()); + vo.setMetaData(hasSeparatePublic + ? VirtualRouterNicMetaData.PUBLIC_NIC_MASK.toString() + : VirtualRouterNicMetaData.PUBLIC_AND_MANAGEMENT_NIC_MASK.toString()); + } + } else { + vo.setMetaData(ADDITIONAL_PUBLIC_NIC_MASK.toString()); + } } vo = dbf.updateAndRefresh(vo); logger.debug(String.format("updated metadata of vmnic[uuid: %s]", vo.getUuid())); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java index 372ccf9a888..3d9f9636058 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterCommands.java @@ -1050,6 +1050,8 @@ public static class CreateVipCmd extends AgentCommand { /* sync all vips to virtual router together with nic ips*/ @GrayVersion(value = "5.0.0") private List nicIps; + @GrayVersion(value = "5.3.0") + private Boolean resetQosRules; public Boolean getSyncVip() { return syncVip; @@ -1074,6 +1076,14 @@ public List getNicIps() { public void setNicIps(List nicIps) { this.nicIps = nicIps; } + + public Boolean getResetQosRules() { + return resetQosRules; + } + + public void setResetQosRules(Boolean resetQosRules) { + this.resetQosRules = resetQosRules; + } } public static class RemoveVipCmd extends AgentCommand { @@ -1254,4 +1264,28 @@ public void setTimeServers(List timeServers) { public static class ConfigureNtpRsp extends AgentResponse { } + + public static class ConfigPromtailCmd extends AgentCommand { + @GrayVersion(value = "5.3.28") + private boolean enable; + + @GrayVersion(value = "5.3.28") + private String logTarget; + + public boolean isEnable() { + return enable; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + + public String getLogTarget() { + return logTarget; + } + + public void setLogTarget(String logTarget) { + this.logTarget = logTarget; + } + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java index 904ad7cb5d4..01a7899fecc 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterConstant.java @@ -49,6 +49,8 @@ public interface VirtualRouterConstant { public static final String VR_CREATE_VIP = "/createvip"; public static final String VR_REMOVE_VIP = "/removevip"; + public static final String VR_CONFIG_PROMTAIL = "/promtail/config"; + public static final String VR_KVM_CREATE_BOOTSTRAP_ISO_PATH = "/virtualrouter/createbootstrapiso"; public static final String VR_KVM_DELETE_BOOTSTRAP_ISO_PATH = "/virtualrouter/deletebootstrapiso"; @@ -60,6 +62,7 @@ public interface VirtualRouterConstant { public static final String SNAT_NETWORK_SERVICE_TYPE = "SNAT"; public static final String IPSEC_NETWORK_SERVICE_TYPE = "IPsec"; public static final String IPSEC_NETWORK_SERVICE_LATEST_VERSION = "5.9.4"; + public static final String IPSEC_NETWORK_SERVICE_EULER_2203 = "5.9.7"; public static final String IPSEC_NETWORK_SERVICE_OLD_VERSION = "4.5.2"; public static final String VR_CHANGE_DEFAULT_ROUTE_JOB = "changeDefaultNic"; @@ -72,6 +75,8 @@ public interface VirtualRouterConstant { public static final String VR_KERNEL_VERSION = "5.4.80"; public static final String VR_OLD_KERNEL_VERSION = "3.13.11"; + public static final String VR_HA_MASTER_DEMOTE = "/keepalived/demote"; + public static enum Param { VR, VR_UUID, @@ -86,4 +91,11 @@ public static enum Param { IS_HA_ROUTER, APPLY_TO_VIRTUALROUTER, } + + public static final String X86_VPC_EULER_GUEST_OS_TYPE = "openEuler 22.03"; + public static final String X86_VPC_EULER_GUEST_OS_USER = "zstack"; + public static final String X86_VPC_VYOS_GUEST_OS_TYPE = "VyOS 1.1.7"; + public static final String X86_VPC_VYOS_GUEST_OS_USER = "vyos"; + public static final String ARM_VPC_VYOS_GUEST_OS_TYPE = "VyOS 1.2.0"; + public static final String ARM_VPC_VYOS_GUEST_OS_USER = "vyos"; } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java index bc4dc9662c0..7dad8ffaf39 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterGlobalProperty.java @@ -9,7 +9,7 @@ */ @GlobalPropertyDefinition public class VirtualRouterGlobalProperty { - @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.2.0.tar.gz") + @GlobalProperty(name="VirtualRouter.agentPackageName", defaultValue = "virtualrouter-5.4.0.tar.gz") public static String AGENT_PACKAGE_NAME; @GlobalProperty(name="VirtualRouter.agentPort", defaultValue = "7272") public static int AGENT_PORT; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java index d7f3e0bd169..ca14cc78996 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterManagerImpl.java @@ -29,9 +29,7 @@ import org.zstack.header.configuration.InstanceOfferingState; import org.zstack.header.configuration.InstanceOfferingVO; import org.zstack.header.core.*; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowChain; -import org.zstack.header.core.workflow.FlowException; +import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; @@ -45,10 +43,7 @@ import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; import org.zstack.header.network.NetworkException; -import org.zstack.header.network.l2.APICreateL2NetworkMsg; -import org.zstack.header.network.l2.L2NetworkConstant; -import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint; -import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.*; import org.zstack.header.network.l3.*; import org.zstack.header.network.service.*; import org.zstack.header.query.AddExpandedQueryExtensionPoint; @@ -77,6 +72,7 @@ import org.zstack.network.service.virtualrouter.vyos.VyosConstants; import org.zstack.network.service.virtualrouter.vyos.VyosVersionCheckResult; import org.zstack.network.service.virtualrouter.vyos.VyosVersionManager; +import org.zstack.network.service.virtualrouter.VirtualRouterCommands.*; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.*; @@ -110,7 +106,8 @@ public class VirtualRouterManagerImpl extends AbstractService implements Virtual PrepareDbInitialValueExtensionPoint, L2NetworkCreateExtensionPoint, GlobalApiMessageInterceptor, AddExpandedQueryExtensionPoint, GetCandidateVmNicsForLoadBalancerExtensionPoint, GetPeerL3NetworksForLoadBalancerExtensionPoint, FilterVmNicsForEipInVirtualRouterExtensionPoint, ApvmCascadeFilterExtensionPoint, ManagementNodeReadyExtensionPoint, - VipCleanupExtensionPoint, GetL3NetworkForEipInVirtualRouterExtensionPoint, VirtualRouterHaGetCallbackExtensionPoint, AfterAddIpRangeExtensionPoint, QueryBelongFilter { + VipCleanupExtensionPoint, GetL3NetworkForEipInVirtualRouterExtensionPoint, VirtualRouterHaGetCallbackExtensionPoint, AfterAddIpRangeExtensionPoint, QueryBelongFilter, + VmInstanceMigrateExtensionPoint, VmPreMigrationExtensionPoint { private final static CLogger logger = Utils.getLogger(VirtualRouterManagerImpl.class); private final static List supportedL2NetworkTypes = new ArrayList(); @@ -903,6 +900,11 @@ public void afterCreateL2Network(L2NetworkInventory l2Network) { if (!supportedL2NetworkTypes.contains(l2Network.getType())) { return; } + + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() != null) { + return; + } NetworkServiceProviderVO vo = getRouterVO(); NetworkServiceProvider router = providerFactory.getNetworkServiceProvider(vo); @@ -2031,7 +2033,7 @@ protected List scripts() { }.execute(); } - private List applianceVmsToBeDeleted(List applianceVmVOS, List deletedUuids) { + public List applianceVmsToBeDeleted(List applianceVmVOS, List deletedUuids) { List vos = new ArrayList<>(); for (ApplianceVmVO vo : applianceVmVOS) { VirtualRouterVmVO vo_dbf = dbf.findByUuid(vo.getUuid(), VirtualRouterVmVO.class); @@ -2055,7 +2057,7 @@ private List applianceVmsToBeDeleted(List applianc return vos; } - List applianceVmsAdditionalPublicNic(List applianceVmVOS, List parentIssuerUuids) { + public List applianceVmsAdditionalPublicNic(List applianceVmVOS, List parentIssuerUuids) { List toDeleteNics = new ArrayList<>(); for (ApplianceVmVO vo : applianceVmVOS) { VirtualRouterVmVO vr_dbf = dbf.findByUuid(vo.getUuid(), VirtualRouterVmVO.class); @@ -2130,7 +2132,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - List applianceVmsToDeleteNicByIpRanges(List applianceVmVOS, List iprUuids) { + public List applianceVmsToDeleteNicByIpRanges(List applianceVmVOS, List iprUuids) { List toDeleteNics = new ArrayList<>(); for (ApplianceVmVO vo : applianceVmVOS) { for (VmNicVO nic : vo.getVmNics()) { @@ -2157,7 +2159,7 @@ List applianceVmsToDeleteNicByIpRanges(List applianceVmV return toDeleteNics; } - private List applianceVmsToBeDeletedByIpRanges(List applianceVmVOS, List iprUuids) { + public List applianceVmsToBeDeletedByIpRanges(List applianceVmVOS, List iprUuids) { List toDeleted = new ArrayList<>(); List l3Uuids = Q.New(IpRangeVO.class).in(IpRangeVO_.uuid, iprUuids).select(IpRangeVO_.l3NetworkUuid).listValues(); for (ApplianceVmVO vos : applianceVmVOS) { @@ -2213,6 +2215,11 @@ public List filterApplianceVmCascade(List applianc } } + @Override + public ApplianceVmType getApplianceVmType() { + return ApplianceVmType.valueOf(VirtualRouterConstant.VIRTUAL_ROUTER_VM_TYPE); + } + private void reconenctVirtualRouter(String vrUUid, boolean statusChange) { ReconnectVirtualRouterVmMsg msg = new ReconnectVirtualRouterVmMsg(); msg.setVirtualRouterVmUuid(vrUUid); @@ -2498,7 +2505,7 @@ public void callBack(String vrUuid, VirtualRouterHaTask task, Completion complet @Override public void afterAddIpRange(IpRangeInventory ipr, List systemTags) { - if (ipr.getIpRangeType() != IpRangeType.Normal) { + if (!Q.New(NormalIpRangeVO.class).eq(NormalIpRangeVO_.uuid, ipr.getUuid()).isExists()) { return; } @@ -2630,4 +2637,188 @@ public List getPublicL3UuidsOfPrivateL3(L3NetworkVO privateL3) { .in(VmNicVO_.metaData, VirtualRouterNicMetaData.ALL_PUBLIC_NIC_MASK_STRING_LIST).listValues(); return l3Uuids; } + + @Override + public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + + @Override + public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid, NoErrorCompletion completion) { + if (inv == null || srcHostUuid == null) { + completion.done(); + return; + } + if (VmInstanceConstant.USER_VM_TYPE.equals(inv.getType())) { + completion.done(); + return; + } + List vfNics = inv.getVmNics().stream() + .filter(nic -> !Objects.equals(nic.getType(), VmInstanceConstant.VIRTUAL_NIC_TYPE)) + .collect(Collectors.toList()); + logger.debug(String.format("virtual router[uuid:%s] has %s vf nics need to sync vip after hot migrate", + inv.getUuid(), vfNics.size())); + if (vfNics.isEmpty()) { + completion.done(); + return; + } + List vips = findVipsOnVirtualRouter(vfNics, inv.getUuid()); + if (vips.isEmpty()) { + completion.done(); + return; + } + List nicIps = new ArrayList<>(); + for (VmNicInventory nic : inv.getVmNics()) { + nicIps.add(NicIpTO.valueOf(nic)); + } + + + CreateVipCmd cmd = new CreateVipCmd(); + cmd.setSyncVip(true); + cmd.setVips(vips); + cmd.setNicIps(nicIps); + cmd.setResetQosRules(true); + + VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); + msg.setVmInstanceUuid(inv.getUuid()); + msg.setCommand(cmd); + msg.setPath(VirtualRouterConstant.VR_CREATE_VIP); + bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, inv.getUuid()); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("failed to sync vips on virtual router[uuid:%s] due to %s", + inv.getUuid(), reply.getError())); + completion.done(); + return; + } + + VirtualRouterAsyncHttpCallReply re = reply.castReply(); + CreateVipRsp ret = re.toResponse(CreateVipRsp.class); + if (!ret.isSuccess()) { + ErrorCode err = operr("failed to sync vips[ips: %s] on virtual router[uuid:%s]" + + " for vr hot mirage, because %s", + vips.stream().map(VipTO::getIp).collect(Collectors.toList()), + inv.getUuid(), ret.getError()); + logger.warn(err.toString()); + completion.done(); + } else { + List vipUuids = vips.stream().map(VipTO::getVipUuid).distinct().collect(Collectors.toList()); + vipProxy.attachNetworkService(inv.getUuid(), VipVO.class.getSimpleName(), vipUuids); + List vips = Q.New(VipVO.class).in(VipVO_.uuid, vipUuids).list(); + CollectionUtils.safeForEach(pluginRgty.getExtensionList(AfterAcquireVipExtensionPoint.class), ext -> { + logger.debug(String.format("execute after acquire vip extension point %s", ext)); + ext.afterAcquireVip(VipInventory.valueOf(vips)); + }); + completion.done(); + } + } + }); + } + + private List findVipsOnVirtualRouter(List vfNics, String vrUuid) { + List vipUuids = SQL.New("select vip.uuid from VipVO vip, VipPeerL3NetworkRefVO ref " + + "where ref.vipUuid = vip.uuid " + + "and (ref.l3NetworkUuid in (:l3NetworkUuids) " + + "or vip.l3NetworkUuid in (:l3NetworkUuids))") + .param("l3NetworkUuids", vfNics.stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())) + .list(); + + vipUuids = getVirtualRouterVips(vrUuid, vipUuids); + if (vipUuids == null || vipUuids.isEmpty()) { + return new ArrayList<>(); + } + + List vips = Q.New(VipVO.class).in(VipVO_.uuid, vipUuids).list(); + VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf((VirtualRouterVmVO) + Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid).find()); + + List systemVip = vips.stream().filter(VipVO::isSystem).collect(Collectors.toList()); + List notSystemVip = vips.stream().filter(v -> !v.isSystem()).collect(Collectors.toList()); + List vipss = new ArrayList<>(); + vipss.addAll(systemVip); + vipss.addAll(notSystemVip); + + List vipTOS = new ArrayList<>(); + for (VipVO vip : vipss) { + if (vipTOS.stream().anyMatch(v -> v.getIp().equals(vip.getIp()))) { + logger.warn(String.format( + "found duplicate vip ip[uuid; %s, uuids: %s] for vr[uuid: %s]", + vip.getIp(), + vips.stream(). + filter(v -> v.getIp().equals(vip.getIp())) + .map(VipVO::getUuid) + .collect(Collectors.toSet()), + vrUuid)); + continue; + } + + VipTO to = new VipTO(); + to.setIp(vip.getIp()); + to.setGateway(vip.getGateway()); + to.setNetmask(vip.getNetmask()); + Optional pubNic = vr.getVmNics().stream() + .filter(n -> n.getL3NetworkUuid().equals(vip.getL3NetworkUuid())) + .findFirst(); + if (!pubNic.isPresent()) { + continue; + } + to.setOwnerEthernetMac(pubNic.get().getMac()); + to.setVipUuid(vip.getUuid()); + to.setSystem(vip.isSystem()); + vipTOS.add(to); + } + + return vipTOS; + } + + @Override + public void preVmMigration(VmInstanceInventory vm, VmMigrationType type, String dstHostUuid, Completion completion) { + if (ApplianceVmConstant.APPLIANCE_VM_TYPE.equals(vm.getType())) { + VirtualRouterVmVO vrVo = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vm.getUuid()).find(); + if (vrVo == null) { + completion.success(); + return; + } + VirtualRouterVmInventory inv = VirtualRouterVmInventory.valueOf(vrVo); + List vfNics = inv.getVmNics().stream() + .filter(nic -> !Objects.equals(nic.getType(), VmInstanceConstant.VIRTUAL_NIC_TYPE)) + .collect(Collectors.toList()); + if (vrVo.isHaEnabled() && !vfNics.isEmpty()) { + List exps = pluginRgty.getExtensionList(VirtualRouterHaGroupExtensionPoint.class); + if (exps.isEmpty()) { + completion.success(); + return; + } + String peerUuid = exps.get(0).getPeerUuid(vrVo.getUuid()); + if (peerUuid == null) { + completion.success(); + return; + } + if (ApplianceVmHaStatus.Master.equals(vrVo.getHaStatus()) && + ApplianceVmStatus.Connected.equals(vrVo.getStatus()) && + Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.status, ApplianceVmStatus.Connected) + .eq(VirtualRouterVmVO_.uuid, peerUuid).isExists()) { + logger.debug(String.format("demote ha master before migrate, virtual router[uuid:%s]", vrVo.getUuid())); + VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); + msg.setVmInstanceUuid(vrVo.getUuid()); + msg.setCommand(new VirtualRouterCommands.AgentCommand()); + msg.setCheckStatus(true); + msg.setPath(VirtualRouterConstant.VR_HA_MASTER_DEMOTE); + bus.makeTargetServiceIdByResourceUuid(msg, VmInstanceConstant.SERVICE_ID, vrVo.getUuid()); + bus.send(msg, new CloudBusCallBack(null) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(reply.getError().toString()); + } + completion.success(); + } + }); + } + } + } + completion.success(); + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java index 03a1586d81e..860217ab831 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/VirtualRouterPingTracker.java @@ -10,7 +10,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SimpleQuery; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.core.thread.AsyncThread; import org.zstack.header.managementnode.ManagementNodeChangeListener; import org.zstack.header.managementnode.ManagementNodeInventory; @@ -18,11 +18,13 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceState; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; +import java.util.ArrayList; import java.util.List; /** @@ -81,6 +83,15 @@ public void handleReply(final String resourceUuid, MessageReply reply) { return; } + // virtual router is not running/unknow state, skip the reconnection + VmInstanceState state = Q.New(VirtualRouterVmVO.class) + .eq(VirtualRouterVmVO_.uuid, resourceUuid) + .select(VirtualRouterVmVO_.state).findValue(); + if (VmInstanceState.Running != state && VmInstanceState.Unknown != state) { + logger.debug(String.format("virtual router[uuid:%s] is in state: %s, skip the reconnection", resourceUuid, state)); + return; + } + logger.debug(String.format("[Virtual Router VM Tracker]: the virtual router vm[uuid:%s] is detected a reconnect is needed, issuing it...", resourceUuid)); ReconnectVirtualRouterVmMsg msg = new ReconnectVirtualRouterVmMsg(); msg.setVirtualRouterVmUuid(resourceUuid); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java index 47f8b19b1ea..18294f8f401 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/EipTO.java @@ -11,6 +11,7 @@ public class EipTO implements Serializable { private String guestIp; private boolean snatInboundTraffic; private boolean needCleanGuestIp; + private String ipVersion; public boolean isNeedCleanGuestIp() { return needCleanGuestIp; @@ -59,4 +60,13 @@ public String getPublicMac() { public void setPublicMac(String publicMac) { this.publicMac = publicMac; } + + public String getIpVersion() { + return ipVersion; + } + + public void setIpVersion(String ipVersion) { + this.ipVersion = ipVersion; + } + } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java index 13afecdb820..9c789ca1501 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterEipBackend.java @@ -19,10 +19,10 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.UsedIpInventory; +import org.zstack.header.network.l3.UsedIpVO; import org.zstack.header.network.service.*; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceState; -import org.zstack.header.vm.VmNicInventory; +import org.zstack.header.vm.*; import org.zstack.network.service.NetworkServiceManager; import org.zstack.network.service.eip.*; import org.zstack.network.service.virtualrouter.*; @@ -35,6 +35,7 @@ import org.zstack.utils.function.Function; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6NetworkUtils; import javax.persistence.Tuple; import java.util.*; @@ -140,8 +141,10 @@ public String call(VmNicInventory arg) { .map(VmNicInventory::getMac) .orElse(null)); to.setVipIp(struct.getVip().getIp()); - to.setGuestIp(struct.getNic().getIp()); to.setSnatInboundTraffic(struct.isSnatInboundTraffic()); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); + to.setGuestIp(IPv6NetworkUtils.getIpByIpVersion(to.getIpVersion(), + struct.getNic().getUsedIps().stream().map(UsedIpInventory::getIp).collect(Collectors.toList()))); VirtualRouterCommands.CreateEipCmd cmd = new VirtualRouterCommands.CreateEipCmd(); cmd.setEip(to); @@ -292,12 +295,14 @@ public String call(VmNicInventory arg) { to.setPrivateMac(priMac); to.setSnatInboundTraffic(struct.isSnatInboundTraffic()); to.setVipIp(struct.getVip().getIp()); - to.setGuestIp(struct.getNic().getIp()); to.setNeedCleanGuestIp(!Q.New(EipVO.class) .eq(EipVO_.guestIp, struct.getEip().getGuestIp()) .eq(EipVO_.vmNicUuid, struct.getEip().getVmNicUuid()) .notEq(EipVO_.vipIp, struct.getEip().getVipIp()) .isExists()); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); + to.setGuestIp(IPv6NetworkUtils.getIpByIpVersion(to.getIpVersion(), + struct.getNic().getUsedIps().stream().map(UsedIpInventory::getIp).collect(Collectors.toList()))); cmd.setEip(to); VirtualRouterAsyncHttpCallMsg msg = new VirtualRouterAsyncHttpCallMsg(); @@ -559,6 +564,7 @@ private List findEipsOnVirtualRouter(VmNicInventory nic, boolean attach) continue; } to.setPublicMac(pubNic.get().getMac()); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); ret.add(to); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java index 2700139a648..6fdb051df5b 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/eip/VirtualRouterSyncEipOnStartFlow.java @@ -7,6 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.header.core.workflow.Flow; @@ -15,9 +16,8 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.message.MessageReply; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceState; -import org.zstack.header.vm.VmNicInventory; +import org.zstack.header.network.l3.UsedIpVO; +import org.zstack.header.vm.*; import org.zstack.network.service.eip.EipConstant; import org.zstack.network.service.eip.EipGlobalConfig; import org.zstack.network.service.eip.EipVO; @@ -30,13 +30,11 @@ import org.zstack.utils.Utils; import org.zstack.utils.function.Function; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.network.IPv6NetworkUtils; import javax.persistence.Tuple; import javax.persistence.TypedQuery; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.Callable; import java.util.stream.Collectors; @@ -46,7 +44,7 @@ */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncEipOnStartFlow implements Flow { - private static CLogger logger = Utils.getLogger(VirtualRouterSyncEipOnStartFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterSyncEipOnStartFlow.class); @Autowired private DatabaseFacade dbf; @@ -63,7 +61,7 @@ public class VirtualRouterSyncEipOnStartFlow implements Flow { @Transactional(readOnly = true) private List findEipOnThisRouter(VirtualRouterVmInventory vr, List eipUuids) { - String sql = "select vip.ip, nic.l3NetworkUuid, nic.ip, vip.l3NetworkUuid from EipVO eip, VipVO vip, VmNicVO nic " + + String sql = "select vip.ip, nic.l3NetworkUuid, nic.uuid, vip.l3NetworkUuid from EipVO eip, VipVO vip, VmNicVO nic " + " where eip.vipUuid = vip.uuid and vip.serviceProvider in (:providers) "+ " and eip.vmNicUuid = nic.uuid and eip.uuid in (:euuids)"; TypedQuery q = dbf.getEntityManager().createQuery(sql, Tuple.class); @@ -75,7 +73,7 @@ private List findEipOnThisRouter(VirtualRouterVmInventory vr, List() { @Override @@ -96,15 +94,17 @@ public String call(VmNicInventory arg) { return null; } }); - + VmNicVO guestNicVo = Q.New(VmNicVO.class).eq(VmNicVO_.uuid, guestNicUuid).find(); + Set usedIps = guestNicVo.getUsedIps(); DebugUtils.Assert(privMac!=null, String.format("cannot find private nic[l3NetworkUuid:%s] on virtual router[uuid:%s]", l3Uuid, vr.getUuid())); EipTO to = new EipTO(); to.setVipIp(vipIp); to.setPublicMac(publicMac); - to.setGuestIp(guestIp); to.setPrivateMac(privMac); to.setSnatInboundTraffic(EipGlobalConfig.SNAT_INBOUND_TRAFFIC.value(Boolean.class)); + to.setIpVersion(IPv6NetworkUtils.getIpVersion(to.getVipIp())); + to.setGuestIp(IPv6NetworkUtils.getIpByIpVersion(to.getIpVersion(), usedIps.stream().map(UsedIpVO::getIp).collect(Collectors.toList()))); ret.add(to); } @@ -116,13 +116,15 @@ private List findEipOnThisRouter(final VirtualRouterVmInventory vr, Map guestNics = vr.getGuestNics(); List pubL3Uuids = new ArrayList<>(); - pubL3Uuids.add(vr.getPublicNic().getL3NetworkUuid()); + VmNicInventory publicNic = vr.getPublicNic(); pubL3Uuids.addAll(vr.getAdditionalPublicNics().stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())); - if (!vr.getPublicNic().getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { - /* in old code, eip can be configured on management nic */ - pubL3Uuids.add(vr.getManagementNetworkUuid()); + if (publicNic != null) { + pubL3Uuids.add(publicNic.getL3NetworkUuid()); + if (!publicNic.getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { + /* in old code, eip can be configured on management nic */ + pubL3Uuids.add(vr.getManagementNetworkUuid()); + } } - if (guestNics == null || guestNics.isEmpty()) { return new ArrayList<>(); } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java index e67b6b1dc4c..c2bdfb28eb5 100644 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/ha/VirtualRouterCleanupHaOnDestroyFlow.java @@ -31,7 +31,7 @@ public class VirtualRouterCleanupHaOnDestroyFlow extends NoRollbackFlow { @Autowired protected VirtualRouterHaBackend haBackend; - private static CLogger logger = Utils.getLogger(VirtualRouterCleanupHaOnDestroyFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterCleanupHaOnDestroyFlow.class); @Override public void run(final FlowTrigger trigger, Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java index 9f65907275d..1ef8e3143b6 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterCleanupLoadBalancerOnDestroyFlow.java @@ -20,7 +20,7 @@ public class VirtualRouterCleanupLoadBalancerOnDestroyFlow extends NoRollbackFlow { @Autowired private DatabaseFacade dbf; - private static CLogger logger = Utils.getLogger(VirtualRouterCleanupLoadBalancerOnDestroyFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterCleanupLoadBalancerOnDestroyFlow.class); @Override public void run(FlowTrigger trigger, Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java index 527dfdd8a16..c08db611610 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lb/VirtualRouterLoadBalancerBackend.java @@ -53,6 +53,7 @@ import org.zstack.network.service.virtualrouter.ha.VirtualRouterHaBackend; import org.zstack.network.service.virtualrouter.vip.VipConfigProxy; import org.zstack.network.service.virtualrouter.vip.VirtualRouterVipBackend; +import org.zstack.resourceconfig.ResourceConfig; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.resourceconfig.ResourceConfigVO; import org.zstack.resourceconfig.ResourceConfigVO_; @@ -274,6 +275,8 @@ public static class LbTO { boolean enableFullLog; + boolean enableStatsLog; + public static class ServerGroup { private String name; private String serverGroupUuid; @@ -498,6 +501,14 @@ public void setEnableFullLog(boolean enableFullLog) { this.enableFullLog = enableFullLog; } + public boolean isEnableStatsLog() { + return enableStatsLog; + } + + public void setEnableStatsLog(boolean enableStatsLog) { + this.enableStatsLog = enableStatsLog; + } + public String getVipL3Uuid() { return vipL3Uuid; } @@ -610,7 +621,6 @@ private String getListenerLogFlagValue(String resourceUuid) { .eq(ResourceConfigVO_.resourceUuid, resourceUuid) .findValue(); return value; - } public boolean enableFullLog(LbTO to, VirtualRouterVmInventory vr) { @@ -632,6 +642,15 @@ public boolean enableFullLog(LbTO to, VirtualRouterVmInventory vr) { } } + public boolean enableStatsLog(LbTO to) { + ResourceConfig rc = rcf.getResourceConfig(VyosGlobalConfig.ENABLE_LOADBALANCER_STATS_LOG.getIdentity()); + if (rc != null) { + return rc.getResourceConfigValue(to.getLbUuid(), boolean.class); + } else { + return false; + } + } + public List makeCommonLbTOs(final LoadBalancerStruct struct) { return makeLbTOs(struct, null); } @@ -982,6 +1001,7 @@ public String call(String arg) { to.setParameters(params); if (vr != null) { to.setEnableFullLog(enableFullLog(to, vr)); + to.setEnableStatsLog(enableStatsLog(to)); } return to; } @@ -1294,6 +1314,7 @@ public void run(FlowTrigger trigger, Map data) { msg.setCheckStatus(statusCheck); for (VirtualRouterLoadBalancerBackend.LbTO to: listeners) { to.setEnableFullLog(enableFullLog(to, vr)); + to.setEnableStatsLog(enableStatsLog(to)); } cmd.setLbs(listeners); cmd.enableHaproxyLog = rcf.getResourceConfigValue(VyosGlobalConfig.ENABLE_HAPROXY_LOG, vr.getUuid(), Boolean.class); @@ -1316,6 +1337,34 @@ public void run(MessageReply reply) { } }); } + }).then(new NoRollbackFlow() { + String __name__ = "after-refresh-lb-listeners"; + + @Override + public void run(FlowTrigger trigger, Map data) { + new While<>(pluginRgty.getExtensionList(VirtualRouterLoadBalancerExtensionPoint.class)).each((ext, whileCompletion) -> { + ext.afterRefreshLoadBalancerListener(vr.getUuid(), new Completion(whileCompletion) { + @Override + public void success() { + whileCompletion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + whileCompletion.addError(errorCode); + whileCompletion.allDone(); + } + }); + }).run(new WhileDoneCompletion(trigger) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + logger.warn(String.format("after refresh load balancer listener failed, because:%s", errorCodeList.getCauses().get(0))); + } + trigger.next(); + } + }); + } }).done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java index d33c22b7c83..8d9f6b176ee 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/lifecycle/VirtualRouterDeployAgentFlow.java @@ -54,7 +54,7 @@ public class VirtualRouterDeployAgentFlow extends NoRollbackFlow { @Autowired private UpgradeChecker upgradeChecker; - private String agentPackageName = VirtualRouterGlobalProperty.AGENT_PACKAGE_NAME; + private final String agentPackageName = VirtualRouterGlobalProperty.AGENT_PACKAGE_NAME; private void continueConnect(final VmNicInventory mgmtNic, final Map data, final FlowTrigger completion) { final VirtualRouterVmInventory vr = (VirtualRouterVmInventory) data.get(VirtualRouterConstant.Param.VR.toString()); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java index 5f45a975f8c..73439479aa4 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSnatBackend.java @@ -46,7 +46,8 @@ * To change this template use File | Settings | File Templates. */ public class VirtualRouterSnatBackend extends AbstractVirtualRouterBackend implements - NetworkServiceSnatBackend, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint { + NetworkServiceSnatBackend, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint, + VirtualRouterAfterDetachNicExtensionPoint { private static final CLogger logger = Utils.getLogger(VirtualRouterSnatBackend.class); @Autowired @@ -153,7 +154,10 @@ private void releasePrivateNicSnat(String vrUuid, VmNicInventory privateNic, Com final List snatInfo = new ArrayList(); List pubNics = new ArrayList<>(); - pubNics.add(vr.getPublicNic()); + VmNicInventory publicNic = vr.getPublicNic(); + if (publicNic != null) { + pubNics.add(publicNic); + } pubNics.addAll(vr.getAdditionalPublicNics()); for (VmNicInventory pubNic : pubNics) { @@ -243,7 +247,9 @@ private void releasePublicNicSnat(String vrUuid, VmNicInventory publicNic, Compl ApplianceVmSubTypeFactory subTypeFactory = apvmFactory.getApplianceVmSubTypeFactory(vrVO.getApplianceVmType()); ApplianceVm app = subTypeFactory.getSubApplianceVm(vrVO); List snatL3Uuids = app.getSnatL3NetworkOnRouter(vrUuid); - if (!snatL3Uuids.contains(publicNic.getL3NetworkUuid())) { + if (!snatL3Uuids.contains(publicNic.getL3NetworkUuid()) && !vr.isHaEnabled()) { + // for ha router, first router will detach snat service, it will cause second router can not remove snat + // so remove snat for ha router no matter snat is enabled completion.success(); return; } @@ -301,7 +307,8 @@ public void run(MessageReply reply) { String msg = String.format( "virtual router[uuid:%s, ip:%s] successfully released snat for public l3[uuid:%s]", vr.getUuid(), vr.getManagementNic().getIp(), finalNic.getL3NetworkUuid()); - app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), finalNic.getL3NetworkUuid()); + //has moved to afterDetachNic to avoid delete data too early + //app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), finalNic.getL3NetworkUuid()); logger.warn(msg); } } @@ -360,7 +367,10 @@ public void afterAttachNic(VmNicInventory nic, Completion completion) { final List snatInfo = new ArrayList(); List pubNics = new ArrayList<>(); - pubNics.add(vr.getPublicNic()); + VmNicInventory publicNic = vr.getPublicNic(); + if (publicNic != null) { + pubNics.add(publicNic); + } pubNics.addAll(vr.getAdditionalPublicNics()); for (VmNicInventory pubnic : pubNics) { @@ -473,4 +483,52 @@ private Vip getVipWithSnatService(VirtualRouterVmInventory vr, VmNicInventory ni public void afterAttachNicRollback(VmNicInventory nic, NoErrorCompletion completion) { completion.done(); } + + @Override + public void afterDetachVirtualRouterNic(VmNicInventory nic, Completion completion) { + VirtualRouterVmVO vrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, nic.getVmInstanceUuid()).find(); + if (vrVO == null) { + completion.success(); + return; + } + final VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf(vrVO); + ApplianceVmSubTypeFactory subTypeFactory = apvmFactory.getApplianceVmSubTypeFactory(vrVO.getApplianceVmType()); + ApplianceVm app = subTypeFactory.getSubApplianceVm(vrVO); + + if ( ! (VirtualRouterNicMetaData.isPublicNic(nic) || VirtualRouterNicMetaData.isAddinitionalPublicNic(nic))) { + completion.success(); + return; + } + + String peerVrUuid = haBackend.getVirtualRouterPeerUuid(vr.getUuid()); + if (peerVrUuid == null) { + logger.info(String.format("No peer VR found for VR[uuid:%s], detaching SNAT service for L3[uuid:%s]", + vr.getUuid(), nic.getL3NetworkUuid())); + app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), nic.getL3NetworkUuid()); + completion.success(); + return; + } + + VirtualRouterVmVO peerVrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, peerVrUuid).find(); + if (peerVrVO == null) { + logger.warn(String.format("Peer VR[uuid:%s] not found, proceeding with detach", peerVrUuid)); + app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), nic.getL3NetworkUuid()); + completion.success(); + return; + } + + VirtualRouterVmInventory peerVr = VirtualRouterVmInventory.valueOf(peerVrVO); + List allL3Uuids = peerVr.getAllL3Networks(); + if (allL3Uuids != null && allL3Uuids.contains(nic.getL3NetworkUuid())) { + logger.info(String.format("Peer VR[uuid:%s] still has L3[uuid:%s], skipping detach", + peerVrUuid, nic.getL3NetworkUuid())); + completion.success(); + return; + } + + logger.info(String.format("Detaching SNAT service for VR[uuid:%s] L3[uuid:%s]", + vr.getUuid(), nic.getL3NetworkUuid())); + app.detachNetworkService(vr.getUuid(), NetworkServiceType.SNAT.toString(), nic.getL3NetworkUuid()); + completion.success(); + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java index a1d76c25411..037c12098f3 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/nat/VirtualRouterSyncSNATOnStartFlow.java @@ -90,7 +90,10 @@ public void run(final FlowTrigger chain, Map data) { final List snatInfo = new ArrayList(); List pubNics = new ArrayList<>(); - pubNics.add(vr.getPublicNic()); + VmNicInventory publicNic = vr.getPublicNic(); + if (publicNic != null) { + pubNics.add(publicNic); + } pubNics.addAll(vr.getAdditionalPublicNics()); for (VmNicInventory pubNic : pubNics) { if (pubNic.isIpv6OnlyNic()) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java index 052d13706e9..6451b4b781d 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterPortForwardingBackend.java @@ -46,7 +46,7 @@ public class VirtualRouterPortForwardingBackend extends AbstractVirtualRouterBackend implements PortForwardingBackend, Component, VirtualRouterAfterAttachNicExtensionPoint, VirtualRouterBeforeDetachNicExtensionPoint, - VirtualRouterHaGetCallbackExtensionPoint { + VirtualRouterHaGetCallbackExtensionPoint, VirtualRouterAfterDetachNicExtensionPoint { private static final CLogger logger = Utils.getLogger(VirtualRouterPortForwardingBackend.class); @Autowired @@ -484,6 +484,7 @@ public void run(MessageReply reply) { vrVO.getUuid(), ret.getError()); completion.fail(err); } else { + /* move clean up db to afterDetachNic List pfs = findPortForwardingTuplesOnVmNic(nic); List ruleUuids = pfs.stream().map(p -> p.get(0, PortForwardingRuleVO.class).getUuid()).collect(Collectors.toList()); proxy.detachNetworkService(vr.getUuid(), PortForwardingRuleVO.class.getSimpleName(), ruleUuids); @@ -497,6 +498,7 @@ protected void scripts() { } }.execute(); } + */ String info = String.format("sync port forwardings on virtual router[uuid:%s] successfully", vrVO.getUuid()); @@ -573,4 +575,73 @@ public void callBack(String vrUuid, VirtualRouterHaTask task, Completion complet return structs; } + + @Override + public void afterDetachVirtualRouterNic(VmNicInventory nic, Completion completion) { + if (!VirtualRouterNicMetaData.GUEST_NIC_MASK_STRING_LIST.contains(nic.getMetaData())) { + completion.success(); + return; + } + + if (VirtualRouterSystemTags.DEDICATED_ROLE_VR.hasTag(nic.getVmInstanceUuid())) { + completion.success(); + return; + } + + try { + nwServiceMgr.getTypeOfNetworkServiceProviderForService(nic.getL3NetworkUuid(), PortForwardingConstant.PORTFORWARDING_TYPE); + } catch (OperationFailureException e) { + completion.success(); + return; + } + + VirtualRouterVmVO vrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, nic.getVmInstanceUuid()).find(); + if (vrVO == null) { + completion.success(); + return; + } + final VirtualRouterVmInventory vr = VirtualRouterVmInventory.valueOf(vrVO); + + class DbCleaner { + void run() { + List pfs = findPortForwardingTuplesOnVmNic(nic); + List ruleUuids = pfs.stream().map(p -> p.get(0, PortForwardingRuleVO.class).getUuid()).collect(Collectors.toList()); + proxy.detachNetworkService(vr.getUuid(), PortForwardingRuleVO.class.getSimpleName(), ruleUuids); + for (Tuple t : pfs) { + PortForwardingRuleVO rule = t.get(0, PortForwardingRuleVO.class); + new SQLBatch() { + @Override + protected void scripts() { + sql(PortForwardingRuleVO.class).eq(PortForwardingRuleVO_.uuid, rule.getUuid()) + .set(PortForwardingRuleVO_.guestIp, null).set(PortForwardingRuleVO_.vmNicUuid, null).update(); + } + }.execute(); + } + } + } + DbCleaner cleaner = new DbCleaner(); + + String peerVrUuid = haBackend.getVirtualRouterPeerUuid(vr.getUuid()); + if (peerVrUuid == null || peerVrUuid.isEmpty()) { + cleaner.run(); + completion.success(); + return; + } + + VirtualRouterVmVO peerVrVO = Q.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, peerVrUuid).find(); + if (peerVrVO == null) { + cleaner.run(); + completion.success(); + return; + } + VirtualRouterVmInventory peerVr = VirtualRouterVmInventory.valueOf(peerVrVO); + List allL3Uuids = peerVr.getAllL3Networks(); + if (allL3Uuids != null && allL3Uuids.contains(nic.getL3NetworkUuid())) { + completion.success(); + return; + } + + cleaner.run(); + completion.success(); + } } diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java index ed913350047..c0bac709904 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/portforwarding/VirtualRouterSyncPortForwardingRulesOnStartFlow.java @@ -34,7 +34,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VirtualRouterSyncPortForwardingRulesOnStartFlow implements Flow { - private static CLogger logger = Utils.getLogger(VirtualRouterSyncPortForwardingRulesOnStartFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterSyncPortForwardingRulesOnStartFlow.class); @Autowired private DatabaseFacade dbf; @@ -65,11 +65,14 @@ private List findRulesForThisRouter(VirtualRouterVmInvento } List pubL3Uuids = new ArrayList<>(); - pubL3Uuids.add(vr.getPublicNic().getL3NetworkUuid()); + VmNicInventory publicNic = vr.getPublicNic(); pubL3Uuids.addAll(vr.getAdditionalPublicNics().stream().map(VmNicInventory::getL3NetworkUuid).collect(Collectors.toList())); - if (!vr.getPublicNic().getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { - /* in old code, pf can be configured on management nic */ - pubL3Uuids.add(vr.getManagementNetworkUuid()); + if (publicNic != null) { + pubL3Uuids.add(publicNic.getL3NetworkUuid()); + if (!publicNic.getL3NetworkUuid().equals(vr.getManagementNetworkUuid())) { + /* in old code, pf can be configured on management nic */ + pubL3Uuids.add(vr.getManagementNetworkUuid()); + } } String sql = "select rule from PortForwardingRuleVO rule, VipVO vip, VmNicVO nic where " + diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java index f96d36ff948..cf54d466037 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterCleanupVipOnDestroyFlow.java @@ -33,7 +33,7 @@ public class VirtualRouterCleanupVipOnDestroyFlow extends NoRollbackFlow { @Autowired protected VipConfigProxy vipConfigProxy; - private static CLogger logger = Utils.getLogger(VirtualRouterCleanupVipOnDestroyFlow.class); + private static final CLogger logger = Utils.getLogger(VirtualRouterCleanupVipOnDestroyFlow.class); @Override public void run(final FlowTrigger trigger, Map data) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java index 1eb3772a672..713f33ff4d1 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterSyncVipForNewCreateFlow.java @@ -46,7 +46,7 @@ public void run(final FlowTrigger chain, Map data) { final VmNicInventory publicNic = vr.getPublicNic(); List l3Uuids = guestNics.stream().map(n -> n.getL3NetworkUuid()).collect(Collectors.toList()); List vipUuids = new ArrayList(); - if (vrMgr.isL3NetworksNeedingNetworkServiceByVirtualRouter(l3Uuids, EipConstant.EIP_NETWORK_SERVICE_TYPE) && + if (publicNic != null && vrMgr.isL3NetworksNeedingNetworkServiceByVirtualRouter(l3Uuids, EipConstant.EIP_NETWORK_SERVICE_TYPE) && !(VirtualRouterSystemTags.DEDICATED_ROLE_VR.hasTag(vr.getUuid()) && !VirtualRouterSystemTags.VR_EIP_ROLE.hasTag(vr.getUuid()))) { vipUuids.addAll(new Callable>() { @Override diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java index a8c62810ab6..c97ade5bd28 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vip/VirtualRouterVipVO.java @@ -30,6 +30,8 @@ public class VirtualRouterVipVO { @ForeignKey(parentEntityClass = VipVO.class, onDeleteAction = ReferenceOption.RESTRICT) private String uuid; + + @Column @ForeignKey(parentEntityClass = VmInstanceEO.class, onDeleteAction = ReferenceOption.CASCADE) private String virtualRouterVmUuid; diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java index c845f6d5b77..d890e10ed33 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConnectFlow.java @@ -10,6 +10,7 @@ import org.zstack.core.asyncbatch.While; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; @@ -29,6 +30,7 @@ import org.zstack.network.service.virtualrouter.lb.VirtualRouterLoadBalancerRefVO; import org.zstack.network.service.virtualrouter.lb.VirtualRouterLoadBalancerRefVO_; import org.zstack.resourceconfig.ResourceConfigFacade; +import org.zstack.tag.SystemTagCreator; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -43,6 +45,8 @@ import java.util.concurrent.TimeUnit; import static org.zstack.core.Platform.operr; +import static org.zstack.utils.CollectionDSL.e; +import static org.zstack.utils.CollectionDSL.map; /** * Created by xing5 on 2016/10/31. @@ -161,10 +165,10 @@ public void run(final FlowTrigger trigger, Map data) { String url = vrMgr.buildUrl(mgmtNic.getIp(), VirtualRouterConstant.VR_INIT); int timeoutInSeconds = ApplianceVmGlobalConfig.CONNECT_TIMEOUT.value(Integer.class); - int interval = 30 ; /* seonds*/ + int interval = 120 ; /* seonds*/ List steps = new ArrayList<>(timeoutInSeconds/interval); - for (int i = 0; i < timeoutInSeconds/interval; i++) { + for (int i = 0; i <= timeoutInSeconds/interval; i++) { steps.add(i); } List errs = new ArrayList<>(); @@ -206,6 +210,32 @@ public void success(InitRsp ret) { versionStruct.setSoftwareName("IPsec"); versionStruct.setCurrentVersion(ret.getIpsecCurrentVersion()); versionStruct.setLatestVersion(ret.getIpsecLatestVersion()); + if (ret.getVyosVersion() != null) { + String userName = null; + if (ret.getVyosVersion().equalsIgnoreCase(VirtualRouterConstant.X86_VPC_EULER_GUEST_OS_TYPE)) { + SQL.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid) + .set(VirtualRouterVmVO_.guestOsType, VirtualRouterConstant.X86_VPC_EULER_GUEST_OS_TYPE).update(); + userName = VirtualRouterConstant.X86_VPC_EULER_GUEST_OS_USER; + } else if (ret.getVyosVersion().equalsIgnoreCase(VirtualRouterConstant.X86_VPC_VYOS_GUEST_OS_TYPE)) { + SQL.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid) + .set(VirtualRouterVmVO_.guestOsType, VirtualRouterConstant.X86_VPC_VYOS_GUEST_OS_TYPE).update(); + userName = VirtualRouterConstant.X86_VPC_VYOS_GUEST_OS_USER; + } + if (ret.getVyosVersion().equalsIgnoreCase(VirtualRouterConstant.ARM_VPC_VYOS_GUEST_OS_TYPE)) { + SQL.New(VirtualRouterVmVO.class).eq(VirtualRouterVmVO_.uuid, vrUuid) + .set(VirtualRouterVmVO_.guestOsType, VirtualRouterConstant.ARM_VPC_VYOS_GUEST_OS_TYPE).update(); + userName = VirtualRouterConstant.ARM_VPC_VYOS_GUEST_OS_USER; + } + if(userName != null) { + SystemTagCreator creator = VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER.newSystemTagCreator(vrUuid); + creator.setTagByTokens(map( + e(VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER_TOKEN, userName) + )); + creator.inherent = true; + creator.recreate = true; + creator.create(); + } + } new VirtualRouterMetadataOperator().updateVirtualRouterMetadata(metadataStruct); new VirtualRouterSoftwareVersionOperator().updateVirtualRouterSoftwareVersion(versionStruct); errs.clear(); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java index d3192f7e9be..93941c5dacc 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosConstants.java @@ -27,6 +27,8 @@ enum BootstrapInfoKey { String REPLACE_FIREWALL_WITH_IPTBALES = "SkipVyosIptables"; String HA_STATUS = "haStatus"; String CONFIG_ENABLE_VYOS = "EnableVyosCmd"; + String HA_GROUP_UUID = "haGroupUuid"; + String ALLOW_PASSWORD_AUTH = "allowPasswordAuth"; /* in old version, vpc snat is disabled in mn node, but it's not delete in vyos node, which is fix in http://jira.zstack.io/browse/ZSTAC-27851 * so when upgrade before 3.9.0.0, mn will reconnect virtual router, during reconnection, the snat rules should be deleted*/ diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java index 967d1086312..7437e6728ab 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosDeployAgentFlow.java @@ -52,13 +52,36 @@ public class VyosDeployAgentFlow extends NoRollbackFlow { private UpgradeChecker upgradeChecker; - private String REMOTE_USER; - private String REMOTE_PASS = VirtualRouterGlobalConfig.VYOS_PASSWORD.value(); - private int REMOTE_PORT = VirtualRouterGlobalConfig.SSH_PORT.value(Integer.class); + private final String REMOTE_USER = "REMOTE_USER"; + private final String REMOTE_PASS = VirtualRouterGlobalConfig.VYOS_PASSWORD.value(); + private final int REMOTE_PORT = VirtualRouterGlobalConfig.SSH_PORT.value(Integer.class); + + private final String REMOTE_ZVR_DIR = "REMOTE_ZVR_DIR"; + private final String REMOTE_ZVR_BIN_PATH = "REMOTE_ZVR_BIN_PATH"; + private final String REMOTE_ZVRBOOT_BIN_PATH = "REMOTE_ZVRBOOT_BIN_PATH"; + + private String storeDataToMap(Map map, String key, String value) { + map.put(key, value); + return value; + } + + private String getRemoteUser(Map data) { + return (String) data.get(REMOTE_USER); + } + + private String getRemoteZvrDir(Map data) { + return (String) data.get(REMOTE_ZVR_DIR); + } + + private String getRemoteZvrBinPath(Map data) { + return (String) data.get(REMOTE_ZVR_BIN_PATH); + } + + private String getRemoteZvrbootBinPath(Map data) { + return (String) data.get(REMOTE_ZVRBOOT_BIN_PATH); + } + - private String REMOTE_ZVR_DIR; - private String REMOTE_ZVR_BIN_PATH; - private String REMOTE_ZVRBOOT_BIN_PATH; @Override public void run(FlowTrigger trigger, Map data) { @@ -79,13 +102,15 @@ public void run(FlowTrigger trigger, Map data) { String vrUserTag = VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER.getTokenByResourceUuid( vrUuid, VirtualRouterVmVO.class, VirtualRouterSystemTags.VIRTUAL_ROUTER_LOGIN_USER_TOKEN); - REMOTE_USER = vrUserTag != null ? vrUserTag : "vyos"; //old vpc vrouter has no tag, that's vyos. - REMOTE_ZVR_DIR = String.format("/home/%s/zvr", REMOTE_USER); - REMOTE_ZVR_BIN_PATH = String.format("/home/%s/zvr.bin", REMOTE_USER); - REMOTE_ZVRBOOT_BIN_PATH = String.format("/home/%s/zvrboot.bin", REMOTE_USER); + String remoteUser = storeDataToMap(data, REMOTE_USER, vrUserTag != null ? vrUserTag : "vyos"); //old vpc vrouter has no tag, that's vyos. + String remoteZvrDir = storeDataToMap(data, REMOTE_ZVR_DIR, String.format("/home/%s/zvr", remoteUser)); + String remoteZvrBinPath = storeDataToMap(data, REMOTE_ZVR_BIN_PATH, String.format("/home/%s/zvr.bin", remoteUser)); + String remoteZvrBootBinPath = storeDataToMap(data, REMOTE_ZVRBOOT_BIN_PATH, String.format("/home/%s/zvrboot.bin", remoteUser)); - if (!isReconnect && !ApplianceVmGlobalConfig.DEPLOY_AGENT_ON_START.value(Boolean.class)) { + if (!isReconnect && + !ApplianceVmGlobalConfig.DEPLOY_AGENT_ON_START.value(Boolean.class) && + !ApplianceVmSystemTags.APPLIANCEVM_DEPLOY_AGENT_ON_START.hasTag(vrUuid)) { // no need to deploy agent trigger.next(); return; @@ -130,12 +155,15 @@ public boolean run() { } if (NetworkUtils.isRemotePortOpen(mgmtNicIp, REMOTE_PORT, 2000)) { - if(isZvrMd5Changed(mgmtNicIp, REMOTE_PORT)){ - logger.debug(String.format("will deploy virtual router agent by remote user[%s] from management", REMOTE_USER)); + if(isZvrMd5Changed(mgmtNicIp, REMOTE_PORT, data)){ + logger.debug(String.format("will deploy virtual router agent by remote user[%s] from management", remoteUser)); deployAgent(REMOTE_PORT); forceReboot = true; } rebootAgent(REMOTE_PORT, forceReboot); + if (ApplianceVmSystemTags.APPLIANCEVM_DEPLOY_AGENT_ON_START.hasTag(vrUuid)) { + ApplianceVmSystemTags.APPLIANCEVM_DEPLOY_AGENT_ON_START.deleteInherentTag(vrUuid); + } trigger.next(); return true; } else { @@ -153,14 +181,14 @@ private void deployAgent(int port) { try { new Ssh().setTimeout(300).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvr.bin", true).getAbsolutePath(), - REMOTE_ZVR_BIN_PATH + remoteZvrBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvrboot.bin", true).getAbsolutePath(), - REMOTE_ZVRBOOT_BIN_PATH + remoteZvrBootBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/version", true).getAbsolutePath(), - String.format("%s/mn_zvr_version", REMOTE_ZVR_DIR) - ).setPrivateKey(asf.getPrivateKey()).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + String.format("%s/mn_zvr_version", remoteZvrDir) + ).setPrivateKey(asf.getPrivateKey()).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } catch (SshException e ) { /* @@ -168,14 +196,14 @@ private void deployAgent(int port) { */ new Ssh().setTimeout(300).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvr.bin", true).getAbsolutePath(), - REMOTE_ZVR_BIN_PATH + remoteZvrBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/zvrboot.bin", true).getAbsolutePath(), - REMOTE_ZVRBOOT_BIN_PATH + remoteZvrBootBinPath ).scpUpload( PathUtil.findFileOnClassPath("ansible/zvr/version", true).getAbsolutePath(), - String.format("%s/mn_zvr_version", REMOTE_ZVR_DIR) - ).setPassword(REMOTE_PASS).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + String.format("%s/mn_zvr_version", remoteZvrDir) + ).setPassword(REMOTE_PASS).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } // update vyos agent version when open grayScaleUpgrade @@ -186,17 +214,17 @@ private void rebootAgent(int port, boolean forceReboot) { String script = String.format("sudo bash %s\n" + "sudo bash %s\n" + "sudo bash %s/ssh/zvr-reboot.sh %s\n", - REMOTE_ZVRBOOT_BIN_PATH, REMOTE_ZVR_BIN_PATH, REMOTE_ZVR_DIR, forceReboot); + remoteZvrBootBinPath, remoteZvrBinPath, remoteZvrDir, forceReboot); try { new Ssh().shell(script - ).setTimeout(300).setPrivateKey(asf.getPrivateKey()).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + ).setTimeout(300).setPrivateKey(asf.getPrivateKey()).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } catch (SshException e ) { /* ZSTAC-18352, try again with password when key fail */ new Ssh().shell(script - ).setTimeout(300).setPassword(REMOTE_PASS).setUsername(REMOTE_USER).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); + ).setTimeout(300).setPassword(REMOTE_PASS).setUsername(remoteUser).setHostname(mgmtNicIp).setPort(port).runErrorByExceptionAndClose(); } } @@ -218,10 +246,10 @@ public String getName() { }); } - private boolean isZvrMd5Changed(String ip, int port){ + private boolean isZvrMd5Changed(String ip, int port, Map data){ int interval = 30 ; Ssh ssh = new Ssh(); - ssh.setUsername(REMOTE_USER) + ssh.setUsername(getRemoteUser(data)) .setPrivateKey(asf.getPrivateKey()) .setPort(port) .setHostname(ip) @@ -235,7 +263,7 @@ private boolean isZvrMd5Changed(String ip, int port){ try { - ssh.command(String.format("sudo -S md5sum %s 2>/dev/null", REMOTE_ZVR_BIN_PATH)); + ssh.command(String.format("sudo -S md5sum %s 2>/dev/null", getRemoteZvrBinPath(data))); SshResult ret = ssh.run(); if (ret.getReturnCode() == 0) { remoteZvrMd5 = ret.getStdout().split(" ")[0]; @@ -248,11 +276,11 @@ private boolean isZvrMd5Changed(String ip, int port){ if (!remoteZvrMd5.equals(localZvrMd5)) { logger.debug(String.format("file MD5 changed, local[%s, md5:%s] remote[%s, md5: %s]", localZvrPath, - localZvrMd5, REMOTE_ZVR_BIN_PATH, remoteZvrMd5)); + localZvrMd5, getRemoteZvrBinPath(data), remoteZvrMd5)); return true; } - ssh.command(String.format("sudo -S md5sum %s", REMOTE_ZVRBOOT_BIN_PATH)); + ssh.command(String.format("sudo -S md5sum %s", getRemoteZvrbootBinPath(data))); ret = ssh.run(); if (ret.getReturnCode() == 0) { remoteZvrbootMd5 = ret.getStdout().split(" ")[0]; @@ -265,7 +293,7 @@ private boolean isZvrMd5Changed(String ip, int port){ if (!remoteZvrbootMd5.equals(localZvrbootMd5)) { logger.debug(String.format("file MD5 changed, local[%s, md5:%s] remote[%s, md5: %s]", localZvrBootPath, - localZvrbootMd5, REMOTE_ZVRBOOT_BIN_PATH, remoteZvrbootMd5)); + localZvrbootMd5, getRemoteZvrbootBinPath(data), remoteZvrbootMd5)); return true; } @@ -304,20 +332,20 @@ public VmNicInventory call(VmNicInventory arg) { mgmtNicIp = (String) data.get(Params.managementNicIp.toString()); } - debug(mgmtNicIp, 30); + debug(mgmtNicIp, 30, data); trigger.rollback(); } - private void debug (String vrMgtIp, int timeout) { + private void debug (String vrMgtIp, int timeout, Map data) { if (!NetworkUtils.isRemotePortOpen(vrMgtIp, REMOTE_PORT, timeout)) { logger.debug(String.format("virtual router agent port %s is not opened on managment nic %s", REMOTE_PORT, vrMgtIp)); return; } Ssh ssh1 = new Ssh(); - ssh1.setUsername(REMOTE_USER).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) + ssh1.setUsername(getRemoteUser(data)).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) .setHostname(vrMgtIp).setTimeout(timeout); - SshResult ret1 = ssh1.command(String.format("sudo tail -n 300 %s/zvrReboot.log", REMOTE_ZVR_DIR)).runAndClose(); + SshResult ret1 = ssh1.command(String.format("sudo tail -n 300 %s/zvrReboot.log", getRemoteZvrDir(data))).runAndClose(); if (ret1.getReturnCode() == 0) { logger.debug(String.format("virtual router reboot log %s", ret1.getStdout())); } else { @@ -325,7 +353,7 @@ private void debug (String vrMgtIp, int timeout) { } Ssh ssh2 = new Ssh(); - ssh2.setUsername(REMOTE_USER).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) + ssh2.setUsername(getRemoteUser(data)).setPrivateKey(asf.getPrivateKey()).setPort(REMOTE_PORT) .setHostname(vrMgtIp).setTimeout(timeout); SshResult ret2 = ssh2.command("sudo tail -n 300 /tmp/agentRestart.log").runAndClose(); if (ret2.getReturnCode() == 0) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java index 5d99f357396..8d91aab7231 100644 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosGlobalConfig.java @@ -36,6 +36,10 @@ public class VyosGlobalConfig { @BindResourceConfig({VmInstanceVO.class, LoadBalancerVO.class, LoadBalancerListenerVO.class}) public static GlobalConfig ENABLE_LOADBALANCER_FULL_LOG = new GlobalConfig(CATEGORY, "enable.loadbalancer.full.log"); + @GlobalConfigValidation + @BindResourceConfig({LoadBalancerVO.class}) + public static GlobalConfig ENABLE_LOADBALANCER_STATS_LOG = new GlobalConfig(CATEGORY, "enable.loadbalancer.stats.log"); + @GlobalConfigValidation @BindResourceConfig({VmInstanceVO.class}) public static GlobalConfig ENABLE_VYOS_CMD = new GlobalConfig(CATEGORY, "enable.vyos.cmd"); diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java index 002dec3936d..63db32086b4 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/vyos/VyosVmBaseFactory.java @@ -8,6 +8,7 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.config.GlobalConfigException; import org.zstack.core.config.GlobalConfigValidatorExtensionPoint; +import org.zstack.header.network.l2.*; import org.zstack.network.service.virtualrouter.VirtualRouterConstant; import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.core.db.DatabaseFacade; @@ -19,10 +20,6 @@ import org.zstack.header.core.workflow.FlowChain; import org.zstack.header.managementnode.PrepareDbInitialValueExtensionPoint; import org.zstack.header.network.NetworkException; -import org.zstack.header.network.l2.APICreateL2NetworkMsg; -import org.zstack.header.network.l2.L2NetworkConstant; -import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint; -import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.service.NetworkServiceProviderL2NetworkRefVO; import org.zstack.header.network.service.NetworkServiceProviderVO; import org.zstack.header.network.service.NetworkServiceProviderVO_; @@ -256,6 +253,11 @@ public void afterCreateL2Network(L2NetworkInventory l2Network) { return; } + VSwitchType vSwitchType = VSwitchType.valueOf(l2Network.getvSwitchType()); + if (vSwitchType.getSdnControllerType() != null) { + return; + } + NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO(); ref.setNetworkServiceProviderUuid(providerVO.getUuid()); ref.setL2NetworkUuid(l2Network.getUuid()); @@ -292,7 +294,9 @@ public void applianceVmPrepareBootstrapInfo(VmInstanceSpec spec, Map filterApplianceVmCascade(List applianceVmVOS, CascadeAction action, + String parentIssuer, + List parentIssuerUuids, + List toDeleteNics, + List toDeleteIps) { + logger.debug(String.format("filter appliance vm type %s with parentIssuer [type: %s, uuids: %s]", + VyosConstants.VYOS_VM_TYPE, parentIssuer, parentIssuerUuids)); + + if (parentIssuer.equals(L3NetworkVO.class.getSimpleName())) { + List vos = vrMgr.applianceVmsToBeDeleted(applianceVmVOS, parentIssuerUuids); + + applianceVmVOS.removeAll(vos); + toDeleteNics.addAll(vrMgr.applianceVmsAdditionalPublicNic(applianceVmVOS, parentIssuerUuids)); + + return vos; + } else if (parentIssuer.equals(IpRangeVO.class.getSimpleName())) { + List vos = vrMgr.applianceVmsToBeDeletedByIpRanges(applianceVmVOS, parentIssuerUuids); + applianceVmVOS.removeAll(vos); + toDeleteNics.addAll(VmNicInventory.valueOf(vrMgr.applianceVmsToDeleteNicByIpRanges(applianceVmVOS, parentIssuerUuids))); + + return vos; + } else { + return applianceVmVOS; + } + } } diff --git a/plugin/vxlan/pom.xml b/plugin/vxlan/pom.xml index 03331a5a734..8d601d112a6 100755 --- a/plugin/vxlan/pom.xml +++ b/plugin/vxlan/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy index 543c38170ba..76251ae7493 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/RemoteVtepInventoryDoc_zh_cn.groovy @@ -13,6 +13,12 @@ doc { type "String" since "4.7.11" } + field { + name "clusterUuid" + desc "集群UUID" + type "String" + since "5.3.0" + } field { name "vtepIp" desc "隧道端点IP地址" diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy index f315f9f4aec..d0ef4ef0863 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/VtepInventoryDoc_zh_cn.groovy @@ -2,7 +2,6 @@ package org.zstack.network.l2.vxlan.vtep import java.lang.Integer import java.sql.Timestamp -import java.sql.Timestamp doc { @@ -38,6 +37,12 @@ doc { type "String" since "0.6" } + field { + name "physicalInterface" + desc "" + type "String" + since "5.3.28" + } field { name "createDate" desc "创建时间" diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy index 0937786427c..4ba1679e22a 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/L2VxlanNetworkInventoryDoc_zh_cn.groovy @@ -1,7 +1,7 @@ package org.zstack.network.l2.vxlan.vxlanNetwork import java.lang.Integer -import java.sql.Timestamp +import java.lang.Boolean import java.sql.Timestamp doc { @@ -56,6 +56,30 @@ doc { type "String" since "0.6" } + field { + name "vSwitchType" + desc "" + type "String" + since "5.3.0" + } + field { + name "virtualNetworkId" + desc "" + type "Integer" + since "5.3.0" + } + field { + name "isolated" + desc "" + type "Boolean" + since "5.3.0" + } + field { + name "pvlan" + desc "" + type "String" + since "5.3.0" + } field { name "createDate" desc "创建时间" diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java index c4a2eab1020..0be8bb9aefa 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetwork.java @@ -34,6 +34,7 @@ import javax.transaction.Transactional; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -73,7 +74,8 @@ private VxlanNetworkVO getSelf() { @Override public void deleteHook(Completion completion) { - if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class)) { + if (L2NetworkGlobalConfig.DeleteL2BridgePhysically.value(Boolean.class) + && getVSwitchType().isAttachToCluster()) { deleteL2Bridge(completion); } else { completion.success(); @@ -81,7 +83,7 @@ public void deleteHook(Completion completion) { } @Override - protected L2NetworkInventory getSelfInventory() { + protected L2VxlanNetworkInventory getSelfInventory() { return L2VxlanNetworkInventory.valueOf(getSelf()); } @@ -165,7 +167,7 @@ private void changeL2NetworkVni(final APIChangeL2NetworkVlanIdMsg msg, final Com chain.then(new ShareFlow() { @Override public void setup() { - final List updatedHosts = new ArrayList<>(); + final Map updatedHosts = new ConcurrentHashMap<>(); L2NetworkInventory oldInv = self.toInventory(); L2NetworkInventory newInv = self.toInventory(); if (msg.getVlan() != null) { @@ -181,18 +183,20 @@ public void run(final FlowTrigger trigger, Map data) { updateVxlanNetwork(oldInv, newInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { - updatedHosts.add(host); + logger.debug(String.format("Successfully updated VXLAN network on host[uuid:%s]", host.getUuid())); + updatedHosts.put(host, true); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { - logger.error(String.format("update VXLAN network in host:[%s] failed", host.getUuid())); + logger.error(String.format("Failed to update VXLAN network on host[uuid:%s], error: %s", host.getUuid(), errorCode)); + updatedHosts.put(host, false); whileCompletion.addError(errorCode); - whileCompletion.allDone(); + whileCompletion.done(); } }); - }, 10).run(new WhileDoneCompletion(trigger) { + }, 5).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { if (!errorCodeList.getCauses().isEmpty()) { @@ -206,22 +210,38 @@ public void done(ErrorCodeList errorCodeList) { @Override public void rollback(FlowRollback trigger, Map data) { - new While<>(updatedHosts).step((host, whileCompletion) -> { + List successfulHosts = updatedHosts.entrySet().stream() + .filter(Map.Entry::getValue) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + if (successfulHosts.isEmpty()) { + logger.debug("No successful hosts to rollback, skipping rollback step."); + trigger.rollback(); + return; + } + + logger.debug(String.format("Rolling back VXLAN network changes on %d hosts", successfulHosts.size())); + new While<>(successfulHosts).step((host, whileCompletion) -> { + logger.debug(String.format("Rolling back VXLAN network on host[uuid:%s]", host.getUuid())); updateVxlanNetwork(newInv, oldInv, host.getUuid(), host.getHypervisorType(), new Completion(whileCompletion) { @Override public void success() { + logger.debug(String.format("Successfully rolled back VXLAN network on host[uuid:%s]", host.getUuid())); whileCompletion.done(); } @Override public void fail(ErrorCode errorCode) { - logger.error(String.format("rollback VXLAN network in host:[%s] failed", host.getUuid())); + logger.error(String.format("failed to rollback VXLAN network on host[uuid:%s], because %s", + host.getUuid(), errorCode.toString())); whileCompletion.done(); } }); }, updatedHosts.size()).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { + logger.debug("finished rolling back l2 network vni changes"); trigger.rollback(); } }); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java index 87e1f48880d..4ab04c033cb 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkConstant.java @@ -9,4 +9,12 @@ public class VxlanNetworkConstant { @PythonClass public static final String VXLAN_NETWORK_TYPE = "VxlanNetwork"; + + //vlxan id range + public static final int MIN_VNI = 1; + public static final int MAX_VNI = 16777215; + + //vlan id range + public static final int MIN_VLAN = 1; + public static final int MAX_VLAN = 4095; } diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java index 34f0ee2f30c..101ac6cbdd4 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkFactory.java @@ -99,7 +99,7 @@ protected VxlanNetworkVO scripts() { String uuid = msg.getResourceUuid() == null ? Platform.getUuid() : msg.getResourceUuid(); vo.setUuid(uuid); vo.setVni(r.getVni()); - vo.setVirtualNetworkId(vo.getVni()); + vo.setVirtualNetworkId(r.getVni()); vo.setAccountUuid(msg.getSession().getAccountUuid()); vo.setPoolUuid((amsg.getPoolUuid())); if (vo.getPhysicalInterface() == null) { @@ -247,7 +247,7 @@ public Integer getDefaultMtu(L2NetworkInventory inv) { @Override public Integer getL2NetworkVni(String l2NetworkUuid, String hostUuid) { VxlanNetworkVO vxlanNetworkVO = Q.New(VxlanNetworkVO.class).eq(VxlanNetworkVO_.uuid, l2NetworkUuid).find(); - return vxlanNetworkVO.getVni(); + return vxlanNetworkVO.getVirtualNetworkId(); } @Override diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java new file mode 100644 index 00000000000..f40f557c1e1 --- /dev/null +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/VxlanNetworkHelper.java @@ -0,0 +1,35 @@ +package org.zstack.network.l2.vxlan.vxlanNetwork; + +public class VxlanNetworkHelper { + public static boolean isValidVniRange(int startVni, int endVni) { + if (startVni < VxlanNetworkConstant.MIN_VNI || endVni < VxlanNetworkConstant.MIN_VNI) { + return false; + } + + if (startVni > VxlanNetworkConstant.MAX_VNI || endVni > VxlanNetworkConstant.MAX_VNI) { + return false; + } + + if (startVni > endVni) { + return false; + } + + return true; + } + + public static boolean isValidVlanRange(int startVlan, int endVlan) { + if (startVlan < VxlanNetworkConstant.MIN_VLAN || endVlan < VxlanNetworkConstant.MIN_VLAN) { + return false; + } + + if (startVlan > VxlanNetworkConstant.MAX_VLAN || endVlan > VxlanNetworkConstant.MAX_VLAN) { + return false; + } + + if (startVlan > endVlan) { + return false; + } + + return true; + } +} diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java index e7e5ab78351..0fba2988fcf 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkBackend.java @@ -1,5 +1,6 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool; +import org.zstack.network.l2.L2NetworkGlobalConfig; import org.zstack.network.l2.vxlan.vtep.RemoteVtepVO; import org.zstack.network.l2.vxlan.vtep.RemoteVtepVO_; import org.springframework.beans.factory.annotation.Autowired; @@ -106,7 +107,7 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b String info = String.format( "get vtep peers [%s] and vtep ip [%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s]", peers, - vtepIp, l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid); + vtepIp, l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid); logger.debug(info); List dstports = Q.New(VtepVO.class).select(VtepVO_.port) @@ -119,11 +120,13 @@ public void realize(final L2NetworkInventory l2Network, final String hostUuid, b final VxlanKvmAgentCommands.CreateVxlanBridgeCmd cmd = new VxlanKvmAgentCommands.CreateVxlanBridgeCmd(); cmd.setVtepIp(vtepIp); cmd.setBridgeName(getBridgeName(l2vxlan)); - cmd.setVni(l2vxlan.getVni()); + cmd.setVni(l2vxlan.getVirtualNetworkId()); cmd.setL2NetworkUuid(l2Network.getUuid()); cmd.setPeers(peers); cmd.setDstport(dstport); cmd.setMtu(new MtuGetter().getL2Mtu(l2Network)); + cmd.setIgmpVersion(L2NetworkGlobalConfig.IGMPVersion.value(Integer.class)); + cmd.setMldVersion(L2NetworkGlobalConfig.MLDVersion.value(Integer.class)); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(hostUuid); @@ -143,14 +146,14 @@ public void run(MessageReply reply) { VxlanKvmAgentCommands.CreateVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.CreateVxlanBridgeResponse.class); if (!rsp.isSuccess()) { ErrorCode err = operr("failed to create bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", - cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid, rsp.getError()); + cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid, rsp.getError()); completion.fail(err); return; } String info = String.format( "successfully realize bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s]", cmd - .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid); + .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid); logger.debug(info); SystemTagCreator creator = KVMSystemTags.L2_BRIDGE_NAME.newSystemTagCreator(l2Network.getUuid()); @@ -361,7 +364,7 @@ public void run(FlowTrigger trigger, Map data) { VxlanKvmAgentCommands.PopulateVxlanFdbCmd cmd = new VxlanKvmAgentCommands.PopulateVxlanFdbCmd(); cmd.setPeers(peers); - cmd.setVni(l2vxlan.getVni()); + cmd.setVni(l2vxlan.getVirtualNetworkId()); KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); msg.setHostUuid(vtep.getHostUuid()); @@ -420,7 +423,7 @@ public L2NetworkType getL2NetworkTypeVmNicOn() { @Override public KVMAgentCommands.NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInventory l3Network, VmNicInventory nic) { - final Integer vni = getVni(l2Network.getUuid()); + final Integer vni = getVirtualNetworkId(l2Network.getUuid()); KVMAgentCommands.NicTO to = KVMAgentCommands.NicTO.fromVmNicInventory(nic); to.setBridgeName(getBridgeName(l2Network)); to.setMetaData(String.valueOf(vni)); @@ -433,7 +436,7 @@ public String getBridgeName(L2NetworkInventory l2Network) { if (KVMSystemTags.L2_BRIDGE_NAME.hasTag(l2Network.getUuid(), L2NetworkVO.class)) { return KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Network.getUuid(), KVMSystemTags.L2_BRIDGE_NAME_TOKEN); } - final Integer vni = getVni(l2Network.getUuid()); + final Integer vni = getVirtualNetworkId(l2Network.getUuid()); return makeBridgeName(vni); } @@ -448,10 +451,10 @@ public Map getAttachedCidrs(String l2NetworkUuid) { return attachedClusters; } - private Integer getVni(String l2NetworkUuid) { + private Integer getVirtualNetworkId(String l2NetworkUuid) { return Q.New(VxlanNetworkVO.class) .eq(VxlanNetworkVO_.uuid, l2NetworkUuid) - .select(VxlanNetworkVO_.vni) + .select(VxlanNetworkVO_.virtualNetworkId) .findValue(); } @@ -521,7 +524,7 @@ public void delete(L2NetworkInventory l2Network, String hostUuid, Completion com final VxlanKvmAgentCommands.DeleteVxlanBridgeCmd cmd = new VxlanKvmAgentCommands.DeleteVxlanBridgeCmd(); cmd.setBridgeName(getBridgeName(l2vxlan)); - cmd.setVni(l2vxlan.getVni()); + cmd.setVni(l2vxlan.getVirtualNetworkId()); cmd.setL2NetworkUuid(l2Network.getUuid()); final List vtepIps = Q.New(VtepVO.class).select(VtepVO_.vtepIp).eq(VtepVO_.hostUuid, hostUuid).eq(VtepVO_.poolUuid, l2vxlan.getPoolUuid()).listValues(); @@ -545,14 +548,14 @@ public void run(MessageReply reply) { VxlanKvmAgentCommands.DeleteVxlanBridgeResponse rsp = hreply.toResponse(VxlanKvmAgentCommands.DeleteVxlanBridgeResponse.class); if (!rsp.isSuccess()) { ErrorCode err = operr("failed to delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s], because %s", - cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid, rsp.getError()); + cmd.getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid, rsp.getError()); completion.fail(err); return; } String message = String.format( "successfully delete bridge[%s] for l2Network[uuid:%s, type:%s, vni:%s] on kvm host[uuid:%s]", cmd - .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVni(), hostUuid); + .getBridgeName(), l2Network.getUuid(), l2Network.getType(), l2vxlan.getVirtualNetworkId(), hostUuid); logger.debug(message); completion.success(); diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java index 9ba3f41fac9..728e49bff18 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/KVMRealizeL2VxlanNetworkPoolBackend.java @@ -20,6 +20,7 @@ import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.vm.VmNicInventory; import org.zstack.kvm.*; +import org.zstack.network.l2.L2NetworkGlobalConfig; import org.zstack.network.l2.vxlan.vtep.CreateVtepMsg; import org.zstack.network.l2.vxlan.vtep.VtepVO; import org.zstack.network.l2.vxlan.vtep.VtepVO_; @@ -235,10 +236,12 @@ public void run(FlowTrigger trigger, Map data) { VxlanKvmAgentCommands.CreateVxlanBridgeCmd bridgeCmd = new VxlanKvmAgentCommands.CreateVxlanBridgeCmd(); bridgeCmd.setVtepIp((String) data.get(VTEP_IP)); bridgeCmd.setBridgeName(getBridgeName(vo.toInventory())); - bridgeCmd.setVni(vo.getVni()); + bridgeCmd.setVni(vo.getVirtualNetworkId()); bridgeCmd.setDstport(dstport); bridgeCmd.setL2NetworkUuid(vo.getUuid()); bridgeCmd.setMtu(new MtuGetter().getL2Mtu(L2VxlanNetworkInventory.valueOf(vo))); + bridgeCmd.setIgmpVersion(L2NetworkGlobalConfig.IGMPVersion.value(Integer.class)); + bridgeCmd.setMldVersion(L2NetworkGlobalConfig.MLDVersion.value(Integer.class)); cmd.getBridgeCmds().add(bridgeCmd); } @@ -328,7 +331,7 @@ public String getBridgeName(L2NetworkInventory l2Network) { if (KVMSystemTags.L2_BRIDGE_NAME.hasTag(l2Network.getUuid(), L2NetworkVO.class)) { return KVMSystemTags.L2_BRIDGE_NAME.getTokenByResourceUuid(l2Network.getUuid(), KVMSystemTags.L2_BRIDGE_NAME_TOKEN); } - return KVMRealizeL2VxlanNetworkBackend.makeBridgeName(vo.getVni()); + return KVMRealizeL2VxlanNetworkBackend.makeBridgeName(vo.getVirtualNetworkId()); } public Map getAttachedCidrs(String l2NetworkUuid) { diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy index 7362248055d..a7fcb7220d5 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VniRangeInventoryDoc_zh_cn.groovy @@ -1,8 +1,6 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool import java.lang.Integer -import java.lang.Integer -import java.sql.Timestamp import java.sql.Timestamp doc { diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java index fdd6910f9d0..00d623a0e2d 100644 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanKvmAgentCommands.java @@ -1,5 +1,6 @@ package org.zstack.network.l2.vxlan.vxlanNetworkPool; +import org.zstack.core.upgrade.GrayVersion; import org.zstack.core.validation.ConditionalValidation; import org.zstack.kvm.KVMAgentCommands; @@ -103,13 +104,24 @@ public static class DeleteVxlanBridgesResponse extends AgentResponse { public static class CreateVxlanBridgeCmd extends AgentCommand { + @GrayVersion(value = "5.3.0") private String bridgeName; + @GrayVersion(value = "5.3.0") private String vtepIp; + @GrayVersion(value = "5.3.0") private Integer vni; + @GrayVersion(value = "5.3.0") private Integer dstport; + @GrayVersion(value = "5.3.0") private String l2NetworkUuid; + @GrayVersion(value = "5.3.0") private List peers; + @GrayVersion(value = "5.3.0") private Integer mtu; + @GrayVersion(value = "5.3.0") + private Integer igmpVersion; + @GrayVersion(value = "5.3.0") + private Integer mldVersion; public Integer getDstport() { return dstport; @@ -166,6 +178,22 @@ public Integer getMtu() { public void setMtu(Integer mtu) { this.mtu = mtu; } + + public Integer getIgmpVersion() { + return igmpVersion; + } + + public void setIgmpVersion(Integer igmpVersion) { + this.igmpVersion = igmpVersion; + } + + public Integer getMldVersion() { + return mldVersion; + } + + public void setMldVersion(Integer mldVersion) { + this.mldVersion = mldVersion; + } } public static class CreateVxlanBridgeResponse extends CreateBridgeResponse { diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java index c4a608c940f..68d20f08df8 100755 --- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java +++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/VxlanNetworkPool.java @@ -281,9 +281,9 @@ public void done(ErrorCodeList errorCodeList) { }); } - private void handle(final PrepareL2NetworkOnHostMsg msg) { + protected void handle(final PrepareL2NetworkOnHostMsg msg) { final PrepareL2NetworkOnHostReply reply = new PrepareL2NetworkOnHostReply(); - prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), Arrays.asList(msg.getHost()), new Completion(msg) { + prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), Arrays.asList(msg.getHost()), false, new Completion(msg) { @Override public void success() { bus.reply(msg, reply); @@ -777,6 +777,8 @@ public void run(MessageReply reply) { }); } }).then(new NoRollbackFlow() { + String __name__ = "after-detach-l2-vxlan-pool"; + @Override public void run(FlowTrigger trigger, Map data) { afterDetachVxlanPoolFromCluster(msg); @@ -822,11 +824,34 @@ private void handle(final APICreateVniRangeMsg msg) { } protected void afterAttachVxlanPoolFromClusterFailed(APIAttachL2NetworkToClusterMsg msg) { + if (msg.getSystemTags() == null) { + return; + } + for (String tag : msg.getSystemTags()) { VxlanSystemTags.VXLAN_POOL_CLUSTER_VTEP_CIDR.delete(msg.getL2NetworkUuid(), tag); } } + private void addVxlanNetworkClusterRefs(String clusterUuid, String l2Uuid) { + List refs = new ArrayList<>(); + L2NetworkClusterRefVO rvo = new L2NetworkClusterRefVO(); + rvo.setClusterUuid(clusterUuid); + rvo.setL2NetworkUuid(l2Uuid); + refs.add(rvo); + + List uuids = Q.New(VxlanNetworkVO.class) + .select(VxlanNetworkVO_.uuid).eq(VxlanNetworkVO_.poolUuid, l2Uuid).listValues(); + for (String uuid : uuids) { + rvo = new L2NetworkClusterRefVO(); + rvo.setClusterUuid(clusterUuid); + rvo.setL2NetworkUuid(uuid); + refs.add(rvo); + } + + dbf.persistCollection(refs); + } + private void handle(final APIAttachL2NetworkToClusterMsg msg) { final APIAttachL2NetworkToClusterEvent evt = new APIAttachL2NetworkToClusterEvent(msg.getId()); SimpleQuery rq = dbf.createQuery(L2NetworkClusterRefVO.class); @@ -850,25 +875,20 @@ private void handle(final APIAttachL2NetworkToClusterMsg msg) { query.add(HostVO_.state, SimpleQuery.Op.NOT_IN, HostState.PreMaintenance, HostState.Maintenance); query.add(HostVO_.status, SimpleQuery.Op.EQ, HostStatus.Connected); final List hosts = query.list(); + if (hosts.isEmpty()) { + addVxlanNetworkClusterRefs(msg.getClusterUuid(), msg.getL2NetworkUuid()); + self = dbf.reload(self); + evt.setInventory(self.toInventory()); + bus.publish(evt); + return; + } + List hvinvs = HostInventory.valueOf(hosts); - prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), hvinvs, new Completion(msg) { + prepareL2NetworkOnHosts(msg.getL2NetworkUuid(), hvinvs, true, new Completion(msg) { @Override public void success() { - L2NetworkClusterRefVO rvo = new L2NetworkClusterRefVO(); - rvo.setClusterUuid(msg.getClusterUuid()); - rvo.setL2NetworkUuid(self.getUuid()); - dbf.persist(rvo); - - List uuids = Q.New(VxlanNetworkVO.class) - .select(VxlanNetworkVO_.uuid).eq(VxlanNetworkVO_.poolUuid, msg.getL2NetworkUuid()).listValues(); - for (String uuid : uuids) { - rvo = new L2NetworkClusterRefVO(); - rvo.setClusterUuid(msg.getClusterUuid()); - rvo.setL2NetworkUuid(uuid); - dbf.persist(rvo); - } - + addVxlanNetworkClusterRefs(msg.getClusterUuid(), msg.getL2NetworkUuid()); logger.debug(String.format("successfully attached L2VxlanNetworkPool[uuid:%s] to cluster [uuid:%s]", self.getUuid(), msg.getClusterUuid())); self = dbf.findByUuid(self.getUuid(), L2NetworkVO.class); @@ -987,11 +1007,13 @@ private void handle(final APIUpdateVniRangeMsg msg) { logger.info(String.format("update l2 vxlan vni range[%s] name[%s]", msg.getUuid(), msg.getName())); } - private void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List hosts, final Completion completion) { + public void prepareL2NetworkOnHosts(final String l2NetworkUuid, final List hosts, boolean applyToSdn, final Completion completion) { FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); List vtepIpChanged = new ArrayList<>(); chain.setName(String.format("prepare-l2-%s-on-hosts", self.getUuid())); chain.then(new NoRollbackFlow() { + String __name__ = "check-vtep-ip"; + @Override public void run(final FlowTrigger trigger, Map data) { ErrorCodeList errList = new ErrorCodeList(); @@ -1052,6 +1074,8 @@ public void run(MessageReply reply) { }); } }).then(new NoRollbackFlow() { + String __name__ = "realize-l2-network"; + private void realize(final Iterator it, final FlowTrigger trigger) { if (!it.hasNext()) { trigger.next(); diff --git a/plugin/xinfini/pom.xml b/plugin/xinfini/pom.xml index ea5905c91e1..ae8dd2713b4 100644 --- a/plugin/xinfini/pom.xml +++ b/plugin/xinfini/pom.xml @@ -5,7 +5,7 @@ plugin org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java index db99097d32a..3a90db3b043 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniApiHelper.java @@ -9,6 +9,7 @@ import org.zstack.core.retry.RetryCondition; import org.zstack.header.core.Completion; import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.volume.VolumeConfigs; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.VolumeVO_; import org.zstack.header.xinfini.XInfiniConstants; @@ -32,6 +33,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -61,6 +63,22 @@ public T callErrorOut(XInfiniRequest req, Class c return rsp; } + public T callErrorOutWithRetry(XInfiniRequest req, Class clz, int retryTimes) { + while (retryTimes-- > 0) { + T rsp = client.call(req, clz); + if (!rsp.isSuccess()) { + try { + TimeUnit.SECONDS.sleep(3); + } catch (InterruptedException ignore) {} + } else { + return rsp; + } + } + + throw new OperationFailureException(operr("xinfini request failed, message: %s.", + req.getClass().getSimpleName())); + } + public T call(XInfiniRequest req, Class clz) { return client.call(req, clz); } @@ -208,6 +226,28 @@ public VolumeModule queryVolumeByName(String name) { return rsp.getItems().get(0); } + public VolumeModule queryVolumeByNameAndSnapId(String name, int snapId) { + QueryVolumeRequest req = new QueryVolumeRequest(); + req.q = String.format("((spec.name:%s) AND (spec.bs_snap_id:%s))", name, snapId); + QueryVolumeResponse rsp = queryErrorOut(req, QueryVolumeResponse.class); + if (rsp.getMetadata().getPagination().getCount() == 0) { + return null; + } + + return rsp.getItems().get(0); + } + + public VolumeModule queryVolumeById(int id) { + QueryVolumeRequest req = new QueryVolumeRequest(); + req.q = String.format("spec.id:%s", id); + QueryVolumeResponse rsp = queryErrorOut(req, QueryVolumeResponse.class); + if (rsp.getMetadata().getPagination().getCount() == 0) { + return null; + } + + return rsp.getItems().get(0); + } + public VolumeModule getVolume(int id) { GetVolumeRequest req = new GetVolumeRequest(); req.setId(id); @@ -243,12 +283,16 @@ public VolumeSnapshotModule createVolumeSnapshot(int volumeId, String name) { (GetVolumeSnapshotResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } - public VolumeModule cloneVolume(int snapId, String name, String desc, boolean flatten) { + public VolumeModule cloneVolume(int snapId, String name, String desc, boolean flatten, XinfiniVolumeQos qos) { CloneVolumeRequest req = new CloneVolumeRequest(); req.setName(name); req.setDescription(desc); req.setBsSnapId(snapId); req.setFlatten(flatten); + if (qos != null) { + req.setQos(qos); + } + CloneVolumeResponse rsp = callErrorOut(req, CloneVolumeResponse.class); GetVolumeRequest gReq = new GetVolumeRequest(); gReq.setId(rsp.getSpec().getId()); @@ -256,22 +300,74 @@ public VolumeModule cloneVolume(int snapId, String name, String desc, boolean fl (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } + public VolumeModule flattenVolume(int volId) { + FlattenVolumeRequest req = new FlattenVolumeRequest(); + req.setId(volId); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); + callErrorOut(req, FlattenVolumeResponse.class); + GetVolumeRequest gReq = new GetVolumeRequest(); + gReq.setId(volId); + return retryUtilStateActive(gReq, GetVolumeResponse.class, + (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); + } + public VolumeModule expandVolume(int volId, long size) { - ExpandVolumeRequest req = new ExpandVolumeRequest(); + UpdateVolumeRequest req = new UpdateVolumeRequest(); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); req.setId(volId); req.setSizeMb(size); - callErrorOut(req, ExpandVolumeResponse.class); + callErrorOut(req, UpdateVolumeResponse.class); GetVolumeRequest gReq = new GetVolumeRequest(); gReq.setId(volId); return retryUtilStateActive(gReq, GetVolumeResponse.class, (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } + public VolumeModule setVolumeQos(int volId, XinfiniVolumeQos qos) { + UpdateVolumeRequest req = new UpdateVolumeRequest(); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); + req.setId(volId); + req.setQos(qos); + callErrorOut(req, UpdateVolumeResponse.class); + return getVolume(volId); + } + + public VolumeModule deleteVolumeQos(int volId) { + UpdateVolumeRequest req = new UpdateVolumeRequest(); + req.setCreator(XInfiniConstants.DEFAULT_CREATOR); + req.setId(volId); + req.setQos(new XinfiniVolumeQos()); + callErrorOut(req, UpdateVolumeResponse.class); + return getVolume(volId); + } + + private void retryUtilResourceDeletedIn10Secs(XInfiniRequest req, + Class rsp) { + new Retry() { + @Override + @RetryCondition(times = 5, interval = 2) + protected Void call() { + T r = XInfiniApiHelper.this.call(req, rsp); + if (!r.resourceIsDeleted()) { + throw new RetryException("resource not deleted yet"); + } + + return null; + } + + @Override + // not error out if delete failed + protected boolean onFailure(Throwable t) { + return false; + } + }.run(); + } + private void retryUtilResourceDeleted(XInfiniRequest req, Class rsp) { new Retry() { @Override - @RetryCondition(times = XInfiniConstants.DEFAULT_POLLING_TIMES) + @RetryCondition(times = 150, interval = 2) protected Void call() { T r = XInfiniApiHelper.this.call(req, rsp); if (!r.resourceIsDeleted()) { @@ -306,12 +402,13 @@ protected T call() { }.run(); } - public BdcBdevModule createBdcBdev(int bdcId, int volumeId, String name) { + public BdcBdevModule createBdcBdev(int bdcId, int volumeId, String name, VolumeConfigs vcfs) { CreateBdcBdevRequest req = new CreateBdcBdevRequest(); req.setName(name); req.setBdcId(bdcId); req.setBsVolumeId(volumeId); - CreateBdcBdevResponse rsp = callErrorOut(req, CreateBdcBdevResponse.class); + req.setQueueNum(vcfs.getQueueNum()); + CreateBdcBdevResponse rsp = callErrorOutWithRetry(req, CreateBdcBdevResponse.class, 3); GetBdcBdevRequest gReq = new GetBdcBdevRequest(); gReq.setId(rsp.getSpec().getId()); return retryUtilStateActive(gReq, GetBdcBdevResponse.class, @@ -329,12 +426,12 @@ public BdcBdevModule queryBdcBdevByVolumeIdAndBdcId(int volId, int bdcId) { return rsp.getItems().get(0); } - public BdcBdevModule getOrCreateBdcBdevByVolumeIdAndBdcId(int volId, int bdcId, String bdevName) { + public BdcBdevModule getOrCreateBdcBdevByVolumeIdAndBdcId(int volId, int bdcId, String bdevName, VolumeConfigs vcfs) { QueryBdcBdevRequest req = new QueryBdcBdevRequest(); req.q = String.format("((spec.bdc_id:%s) AND (spec.bs_volume_id:%s))", bdcId, volId); QueryBdcBdevResponse rsp = queryErrorOut(req, QueryBdcBdevResponse.class); if (rsp.getMetadata().getPagination().getCount() == 0) { - return createBdcBdev(bdcId, volId, bdevName); + return createBdcBdev(bdcId, volId, bdevName, vcfs); } return rsp.getItems().get(0); @@ -352,7 +449,7 @@ public BdcBdevModule getBdcBdev(int id) { return callErrorOut(req, GetBdcBdevResponse.class).toModule(); } - public void deleteBdcBdev(int bdevId) { + public void deleteBdcBdev(int bdevId, int bdcId) { DeleteBdcBdevRequest req = new DeleteBdcBdevRequest(); req.setId(bdevId); DeleteBdcBdevResponse rsp = call(req, DeleteBdcBdevResponse.class); @@ -367,7 +464,25 @@ public void deleteBdcBdev(int bdevId) { GetBdcBdevRequest gReq = new GetBdcBdevRequest(); gReq.setId(bdevId); - retryUtilResourceDeleted(gReq, GetBdcBdevResponse.class); + BdcModule bdc = getBdc(bdcId); + if (!BdcRunState.Active.toString().equals(bdc.getStatus().getRunState())) { + logger.info(String.format("bdc %s is not active, current %s, check bdev deleted in 30s", + bdcId, bdc.getStatus().getRunState())); + retryUtilResourceDeletedIn10Secs(gReq, GetBdcBdevResponse.class); + } else { + retryUtilResourceDeleted(gReq, GetBdcBdevResponse.class); + } + } + + public VolumeModule rollbackSnapshot(int volId, int snapId) { + RollbackSnapshotRequest req = new RollbackSnapshotRequest(); + req.setId(volId); + req.setBsSnapId(snapId); + callErrorOut(req, RollbackSnapshotResponse.class); + GetVolumeRequest gReq = new GetVolumeRequest(); + gReq.setId(volId); + return retryUtilStateActive(gReq, GetVolumeResponse.class, + (GetVolumeResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } public void deleteVolume(int volId, boolean force) { @@ -421,7 +536,8 @@ public void deleteVolumeSnapshot(int snapShotId) { .isExists(); if (exist) { - throw new OperationFailureException(operr("snapshot %s has %d cloned volumes, volumes names: %s", snapShotId, vRsp.getMetadata().getPagination().getCount(), volNames)); + VolumeSnapshotModule snap = getVolumeSnapshot(snapShotId); + throw new OperationFailureException(operr("snapshot [id:%s, name:%s] has %d cloned volumes, volumes names: %s", snapShotId, snap.getSpec().getName(), vRsp.getMetadata().getPagination().getCount(), volNames)); } logger.info("all cloned volumes not exist in database, try to delete them"); // try to delete cloned volumes if not exist in db @@ -612,9 +728,10 @@ public IscsiClientGroupModule createIscsiClientGroup(String name, List req.setIscsiGatewayIds(iscsiGatewayIds); req.setIscsiClientCodes(iscsiClientCodes); CreateIscsiClientGroupResponse rsp = callErrorOut(req, CreateIscsiClientGroupResponse.class); - // TODO xinfini not support yet - // return retryUtilStateActive(req, CreateIscsiClientGroupResponse.class,(CreateIscsiClientGroupResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); - return rsp.toModule(); + + GetIscsiClientGroupRequest gReq = new GetIscsiClientGroupRequest(); + gReq.setId(rsp.getSpec().getId()); + return retryUtilStateActive(gReq, GetIscsiClientGroupResponse.class,(GetIscsiClientGroupResponse gvp) -> gvp.toModule().getMetadata().getState().getState()).toModule(); } public IscsiClientGroupModule getIscsiClientGroup(int id) { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java index cc7701de2ba..0d057986f71 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniPathHelper.java @@ -26,6 +26,10 @@ public static String buildXInfiniSnapshotPath(String volPath, Integer snapId) { return volPath + "@" + snapId; } + public static String buildXInfiniSnapshotPath(Integer poolId, Integer volId, Integer snapId) { + return String.format("xinfini://%s/%s@%s", poolId, volId, snapId); + } + public static int getPoolIdFromPath(String url) { return Integer.parseInt(url.replace("xinfini://", "").split("/")[0]); } @@ -37,4 +41,8 @@ public static int getVolIdFromPath(String url) { public static int getSnapIdFromPath(String url) { return Integer.parseInt(url.replace("xinfini://", "").split("/")[1].split("@")[1]); } + + public static String buildSnapshotExportVolumeName(int snapId) { + return String.format("for-snapshot-%s-iscsi-export", snapId); + } } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java index cb4eabe942a..267d55f4039 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageController.java @@ -1,6 +1,7 @@ package org.zstack.xinfini; import org.apache.commons.lang.StringUtils; +import org.apache.lucene.util.packed.DirectMonotonicReader; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; @@ -19,15 +20,15 @@ import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.primary.VolumeSnapshotCapability; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; -import org.zstack.header.volume.VolumeConstant; -import org.zstack.header.volume.VolumeInventory; -import org.zstack.header.volume.VolumeProtocol; -import org.zstack.header.volume.VolumeStats; +import org.zstack.header.volume.*; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.iscsi.IscsiUtils; import org.zstack.iscsi.kvm.IscsiHeartbeatVolumeTO; import org.zstack.iscsi.kvm.IscsiVolumeTO; +import org.zstack.kvm.KVMConstant; +import org.zstack.resourceconfig.ResourceConfigFacade; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; +import org.zstack.storage.volume.VolumeConfigsGetter; import org.zstack.utils.CollectionUtils; import org.zstack.utils.DebugUtils; import org.zstack.utils.Utils; @@ -46,8 +47,10 @@ import org.zstack.xinfini.sdk.pool.PoolModule; import org.zstack.xinfini.sdk.vhost.BdcBdevModule; import org.zstack.xinfini.sdk.vhost.BdcModule; +import org.zstack.xinfini.sdk.vhost.BdcRunState; import org.zstack.xinfini.sdk.volume.VolumeModule; import org.zstack.xinfini.sdk.volume.VolumeSnapshotModule; +import org.zstack.xinfini.sdk.volume.XinfiniVolumeQos; import java.util.*; import java.util.concurrent.TimeUnit; @@ -74,9 +77,17 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr private XInfiniAddonInfo addonInfo; private final XInfiniApiHelper apiHelper; @Autowired - private ExternalPrimaryStorageFactory extPsFactory; + private ResourceConfigFacade rcf; - private final String vhostSocketDir; + private String vhostSocketDir; + + private String getVhostSocketDir() { + if (vhostSocketDir == null) { + vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); + } + + return vhostSocketDir; + } private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -86,7 +97,10 @@ public class XInfiniStorageController implements PrimaryStorageControllerSvc, Pr VolumeSnapshotCapability scap = new VolumeSnapshotCapability(); scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); + scap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); scap.setSupportCreateOnHypervisor(false); + scap.setSupportLazyDelete(false); + scap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); @@ -117,7 +131,6 @@ public XInfiniStorageController(String configStr) { client.configure(clientConfig); apiHelper = new XInfiniApiHelper(client); - vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); } private String protocolToString(VolumeProtocol protocol) { @@ -158,13 +171,14 @@ private ActiveVolumeTO activeVhostVolume(HostInventory h, BaseVolumeInfo vol) { VhostVolumeTO to = new VhostVolumeTO(); BdcBdevModule bdev = apiHelper.queryBdcBdevByVolumeIdAndBdcId(volModule.getSpec().getId(), bdc.getSpec().getId()); - if (bdev != null) { + if (bdev != null && MetadataState.active.toString().equals(bdev.getMetadata().getState().getState())) { logger.info("dest bdc bdev has been created, skip active"); to.setInstallPath(bdev.getSpec().getSocketPath()); return to; } - bdev = apiHelper.createBdcBdev(bdc.getSpec().getId(), volModule.getSpec().getId(), vhostName); + VolumeConfigs vcfs = new VolumeConfigsGetter().getConfigs(vol.getUuid()); + bdev = apiHelper.createBdcBdev(bdc.getSpec().getId(), volModule.getSpec().getId(), vhostName, vcfs); to.setInstallPath(bdev.getSpec().getSocketPath()); return to; } @@ -241,7 +255,7 @@ private void deactivateVhost(String installPath, HostInventory h) { return; } - retry(() -> apiHelper.deleteBdcBdev(bdev.getSpec().getId())); + retry(() -> apiHelper.deleteBdcBdev(bdev.getSpec().getId(), bdc.getSpec().getId())); } @Override @@ -268,17 +282,26 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable String bdevName = buildBdevName(v.getUuid()); BdcModule bdc = apiHelper.queryBdcByIp(h.getManagementIp()); VolumeModule volModule = getVolumeModule(v); - BdcBdevModule bdev = apiHelper.getOrCreateBdcBdevByVolumeIdAndBdcId(volModule.getSpec().getId(), bdc.getSpec().getId(), bdevName); + VolumeConfigs vcfs = new VolumeConfigsGetter().getConfigs(v.getUuid()); + BdcBdevModule bdev = apiHelper.getOrCreateBdcBdevByVolumeIdAndBdcId(volModule.getSpec().getId(), + bdc.getSpec().getId(), bdevName, vcfs); return bdev.getSpec().getSocketPath(); } else if (VolumeProtocol.iSCSI.toString().equals(v.getProtocol())) { + int volId; if (v.getInstallPath().contains("@")) { - // todo - throw new OperationFailureException(operr("not support active snapshot with iscsi protocol")); + int snapId = getSnapIdFromPath(v.getInstallPath()); + VolumeModule vol = apiHelper.queryVolumeByNameAndSnapId(buildSnapshotExportVolumeName(snapId), snapId); + if (vol == null) { + logger.info(String.format("can not find exported volume for snapshot %s", snapId)); + return null; + } + volId = vol.getSpec().getId(); + } else { + volId = getVolIdFromPath(v.getInstallPath()); } String clientIqn = IscsiUtils.getHostInitiatorName(h.getUuid()); IscsiClientModule client = apiHelper.queryIscsiClientByIqn(clientIqn); IscsiClientGroupModule group = apiHelper.getIscsiClientGroup(client.getSpec().getIscsiClientGroupId()); - int volId = getVolIdFromPath(v.getInstallPath()); VolumeClientGroupMappingModule map = apiHelper.queryVolumeClientGroupMappingByGroupIdAndVolId(group.getSpec().getId(), volId); if (map == null) { logger.info(String.format("vol %s not related to client group %s, skip get installPath", volId, group.getSpec().getId())); @@ -313,8 +336,8 @@ public String getActivePath(BaseVolumeInfo v, HostInventory h, boolean shareable public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, boolean shareable) { BaseVolumeInfo info = new BaseVolumeInfo(); String volUuid; - if (activePath.startsWith(vhostSocketDir)) { - volUuid = activePath.replace(String.format("%svolume-", vhostSocketDir), ""); + if (activePath.startsWith(getVhostSocketDir())) { + volUuid = activePath.replace(String.format("%svolume-", getVhostSocketDir()), ""); info.setUuid(volUuid); info.setProtocol(VolumeProtocol.Vhost.toString()); info.setShareable(shareable); @@ -335,7 +358,7 @@ public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, bo @Override public List getActiveClients(String installPath, String protocol) { if (VolumeProtocol.Vhost.toString().equals(protocol)) { - VolumeModule vol = apiHelper.getVolume(getVolIdFromPath(installPath)); + VolumeModule vol = apiHelper.queryVolumeById(getVolIdFromPath(installPath)); if (vol == null) { return Collections.emptyList(); } @@ -351,7 +374,7 @@ public List getActiveClients(String installPath, String prot return c; }).collect(Collectors.toList()); } else if (VolumeProtocol.iSCSI.toString().equals(protocol)) { - VolumeModule vol = apiHelper.getVolume(getVolIdFromPath(installPath)); + VolumeModule vol = apiHelper.queryVolumeById(getVolIdFromPath(installPath)); if (vol == null) { return Collections.emptyList(); } @@ -382,7 +405,12 @@ public List getActiveClients(String installPath, String prot @Override public List getActiveVolumesLocation(HostInventory h) { - return Collections.singletonList("file://" + PathUtil.join(vhostSocketDir, "volume-*")); + return Collections.singletonList("file://" + PathUtil.join(getVhostSocketDir(), "volume-*")); + } + + @Override + public void deployClient(HostInventory h, Completion comp) { + comp.success(); } @Override @@ -402,7 +430,7 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom to.setInstallPath(target.getResourceURI()); to.setHostId(apiHelper.queryBdcByIp(h.getManagementIp()).getSpec().getId()); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(Collections.singletonList(vhostSocketDir)); + to.setCoveringPaths(Collections.singletonList(getVhostSocketDir())); comp.success(to); } @@ -448,7 +476,7 @@ public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { to.setInstallPath(target.getResourceURI()); to.setHostId(apiHelper.queryBdcByIp(h.getManagementIp()).getSpec().getId()); to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); - to.setCoveringPaths(Collections.singletonList(vhostSocketDir)); + to.setCoveringPaths(Collections.singletonList(getVhostSocketDir())); return to; } @@ -514,7 +542,7 @@ public void connect(String config, String url, ReturnValueCompletion new OperationFailureException(operr("fail to get pool[id:%d, name:%s] %s details", it.getId(), it.getName())))); } info.setPools(pools.stream().map(this::getPoolAddonInfo).collect(Collectors.toList())); - + vhostSocketDir = String.format("/var/run/bdc-%s/", apiHelper.getClusterUuid()); comp.success(JSONObjectUtil.rehashObject(info, LinkedHashMap.class)); } @@ -603,7 +631,7 @@ private void setNodeHealthyByIscsi(HostInventory host, NodeHealthy healthy) { private void setNodeHealthyByVhost(HostInventory host, NodeHealthy healthy) { VolumeProtocol protocol = VolumeProtocol.Vhost; BdcModule bdc = apiHelper.queryBdcByIp(host.getManagementIp()); - if (bdc.getMetadata().getState().getState().equals(MetadataState.active.toString())) { + if (bdc.getStatus().getRunState().equals(BdcRunState.Active.toString())) { healthy.setHealthy(protocol, StorageHealthy.Ok); } else { healthy.setHealthy(protocol, StorageHealthy.Failed); @@ -611,9 +639,8 @@ private void setNodeHealthyByVhost(HostInventory host, NodeHealthy healthy) { } private String getProtocolByHypervisorType(String type) { - NodeHealthyCheckProtocolExtensionPoint point = extPsFactory.nodeHealthyCheckProtocolExtensions.get(type); - if (point != null) { - return point.getHealthyProtocol(); + if (!KVMConstant.KVM_HYPERVISOR_TYPE.equals(type)) { + return VolumeProtocol.iSCSI.toString(); } return VolumeProtocol.Vhost.toString(); } @@ -711,8 +738,12 @@ public void trashVolume(String installPath, Completion comp) { @Override public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { + cloneVolume(srcInstallPath, dst, comp, false); + } + + private void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp, boolean flatten) { int snapId = getSnapIdFromPath(srcInstallPath); - VolumeModule vol = apiHelper.cloneVolume(snapId, dst.getName(), null, false); + VolumeModule vol = apiHelper.cloneVolume(snapId, dst.getName(), null, flatten, XinfiniVolumeQos.valueOf(dst.getQos())); if (SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb()) < dst.getSize()) { vol = apiHelper.expandVolume(vol.getSpec().getId(), convertBytesToMegaBytes(dst.getSize())); @@ -723,19 +754,30 @@ public void cloneVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValue stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); + stats.setParentUri(srcInstallPath); comp.success(stats); } @Override public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { - // TODO - throw new OperationFailureException(operr("not support copy volume yet")); + cloneVolume(srcInstallPath, dst, comp, true); } @Override public void flattenVolume(String installPath, ReturnValueCompletion comp) { - // TODO - throw new OperationFailureException(operr("not support flatten volume yet")); + VolumeModule vol = apiHelper.getVolume(getVolIdFromPath(installPath)); + if (vol.getSpec().getBsSnapId() == 0) { + logger.info(String.format("volume[%s] has no related snapshot, no need to flatten", installPath)); + } else { + vol = apiHelper.flattenVolume(getVolIdFromPath(installPath)); + } + + VolumeStats stats = new VolumeStats(); + stats.setInstallPath(installPath); + stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); + stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); + stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + comp.success(stats); } @Override @@ -746,9 +788,19 @@ public void stats(String installPath, ReturnValueCompletion comp) { stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + stats.setParentUri(getParentUri(vol)); comp.success(stats); } + private String getParentUri(VolumeModule vol) { + if (vol.getSpec().getBsSnapId() == 0) { + return null; + } + + VolumeSnapshotModule vss = apiHelper.getVolumeSnapshot(vol.getSpec().getBsSnapId()); + return buildXInfiniSnapshotPath(vss.getSpec().getPoolId(), vss.getSpec().getBsVolumeId(), vss.getSpec().getId()); + } + @Override public void batchStats(Collection installPath, ReturnValueCompletion> comp) { List stats = installPath.stream().map(it -> { @@ -766,11 +818,6 @@ public void batchStats(Collection installPath, ReturnValueCompletion comp) { int id = getVolIdFromPath(installPath); - List bdcBdevs = apiHelper.queryBdcBdevByVolumeId(id); - if (!bdcBdevs.isEmpty()) { - comp.fail(operr("volume has related bdevs, not support live expand yet")); - return; - } VolumeModule vol = apiHelper.expandVolume(id, convertBytesToMegaBytes(size)); VolumeStats stats = new VolumeStats(); @@ -781,14 +828,26 @@ public void expandVolume(String installPath, long size, ReturnValueCompletion 0) + || (v.getQos().getWriteBandwidth() != null && v.getQos().getWriteBandwidth() > 0) + || (v.getQos().getReadIOPS() != null && v.getQos().getReadIOPS() > 0) + || v.getQos().getWriteIOPS() != null && v.getQos().getWriteIOPS() > 0) { + throw new OperationFailureException(operr("xinfini only support set total qos")); + } + + apiHelper.setVolumeQos(getVolIdFromPath(v.getInstallPath()), XinfiniVolumeQos.valueOf(v.getQos())); + comp.success(); } @Override public void deleteVolumeQos(BaseVolumeInfo v, Completion comp) { - // TODO support qos - throw new OperationFailureException(operr("not support set volume qos yet")); + apiHelper.deleteVolumeQos(getVolIdFromPath(v.getInstallPath())); + comp.success(); } @Override @@ -809,13 +868,24 @@ synchronized IscsiRemoteTarget exportIscsi(ExportSpec espec) { return createIscsiRemoteTarget(espec.getClientMnIp(), espec.getClientQualifiedName(), espec.getInstallPath()); } + private VolumeModule cloneVolumeIfNotExist(int snapId, String dstVolumeName) { + VolumeModule vol = apiHelper.queryVolumeByNameAndSnapId(dstVolumeName, snapId); + if (vol != null) { + return vol; + } + vol = apiHelper.cloneVolume(snapId, dstVolumeName, null, false, null); + return vol; + } + private IscsiRemoteTarget createIscsiRemoteTarget(String clientIp, String clientIqn, String installPath) { + int volId; if (installPath.contains("@")) { - // todo - throw new OperationFailureException(operr("not support active snapshot with iscsi protocol")); + int snapId = getSnapIdFromPath(installPath); + VolumeModule vol = cloneVolumeIfNotExist(snapId, buildSnapshotExportVolumeName(snapId)); + volId = vol.getSpec().getId(); + } else { + volId = getVolIdFromPath(installPath); } - - int volId = getVolIdFromPath(installPath); IscsiClientGroupModule group; IscsiClientModule clientModule; clientModule = apiHelper.queryIscsiClientByIqn(clientIqn); @@ -840,7 +910,14 @@ private IscsiRemoteTarget createIscsiRemoteTarget(String clientIp, String client .map(IscsiGatewayClientGroupMappingModule::getSpec) .map(IscsiGatewayClientGroupMappingModule.IscsiGatewayClientGroupMappingSpec::getIscsiGatewayId) .collect(Collectors.toList()); - List groupRelatedGateways = apiHelper.queryIscsiGatewaysByIds(gatewayIds); + List groupRelatedGateways = apiHelper.queryIscsiGatewaysByIds(gatewayIds) + .stream() + .filter(v -> IscsiNodeState.ACTIVE.toString().equals(v.getStatus().getNodeState())) + .collect(Collectors.toList()); + + if (groupRelatedGateways.isEmpty()) { + throw new OperationFailureException(operr("no active gateway found for client[%s]", clientIqn)); + } // refresh client clientModule = apiHelper.queryIscsiClientByIqn(clientIqn); @@ -869,9 +946,17 @@ public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol } private synchronized void unexportIscsi(String source, String clientIqn) { + int volId; if (source.contains("@")) { - // todo - throw new OperationFailureException(operr("not support unexport snapshot with iscsi protocol")); + int snapId = getSnapIdFromPath(source); + VolumeModule vol = apiHelper.queryVolumeByNameAndSnapId(buildSnapshotExportVolumeName(snapId), snapId); + if (vol == null) { + return; + } + + volId = vol.getSpec().getId(); + } else { + volId = getVolIdFromPath(source); } IscsiClientModule clientModule = apiHelper.queryIscsiClientByIqn(clientIqn); @@ -879,12 +964,16 @@ private synchronized void unexportIscsi(String source, String clientIqn) { return; } - VolumeClientGroupMappingModule mapping = apiHelper.queryVolumeClientGroupMappingByGroupIdAndVolId(clientModule.getSpec().getIscsiClientGroupId(), getVolIdFromPath(source)); + VolumeClientGroupMappingModule mapping = apiHelper.queryVolumeClientGroupMappingByGroupIdAndVolId(clientModule.getSpec().getIscsiClientGroupId(), volId); if (mapping == null) { return; } retry(() -> apiHelper.deleteVolumeClientGroupMapping(mapping.getSpec().getId())); + + if (source.contains("@")) { + apiHelper.deleteVolume(volId, true); + } } @Override @@ -904,14 +993,19 @@ public void deleteSnapshot(String installPath, Completion comp) { @Override public void expungeSnapshot(String installPath, Completion comp) { - apiHelper.deleteVolume(getSnapIdFromPath(installPath), true); - comp.success(); + deleteSnapshot(installPath, comp); } @Override public void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompletion comp) { - // TODO - throw new OperationFailureException(operr("not support revert volume snapshot yet")); + int volId = getVolIdFromPath(snapshotInstallPath); + int snapId = getSnapIdFromPath(snapshotInstallPath); + VolumeModule vol = apiHelper.rollbackSnapshot(volId, snapId); + VolumeStats stats = new VolumeStats(); + stats.setInstallPath(buildXInfiniPath(vol.getSpec().getPoolId(), vol.getSpec().getId())); + stats.setSize(SizeUnit.MEGABYTE.toByte(vol.getSpec().getSizeMb())); + stats.setActualSize(vol.getStatus().getAllocatedSizeByte()); + comp.success(stats); } @Override @@ -922,6 +1016,17 @@ public void validateConfig(String config) { @Override public void setTrashExpireTime(int timeInSeconds, Completion completion) { //TODO + completion.success(); + } + + @Override + public void onFirstAdditionConfigure(Completion completion) { + completion.success(); + } + + @Override + public long alignSize(long size) { + return SizeUnit.MEGABYTE.toByte(convertBytesToMegaBytes(size)); } public void cleanActiveRecord(VolumeInventory vol) { diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java index 38f22f52837..4faa1988e18 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/XInfiniStorageFactory.java @@ -1,20 +1,25 @@ package org.zstack.xinfini; -import com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.externalStorage.primary.ExternalStorageFencerType; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.storage.addon.primary.*; import org.zstack.header.volume.VolumeAfterExpungeExtensionPoint; import org.zstack.header.volume.VolumeInventory; +import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import java.util.LinkedHashMap; import java.util.List; +import static org.zstack.core.Platform.operr; + public class XInfiniStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector, VolumeAfterExpungeExtensionPoint { + public static final ExternalStorageFencerType fencerType = new ExternalStorageFencerType(XInfiniConstants.IDENTITY, VolumeProtocol.iSCSI.toString()); + private List preferBackupStorageTypes; @Autowired @@ -34,7 +39,7 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { public void discover(String url, String config, ReturnValueCompletion completion) { // xinfini must set config if (StringUtils.isEmpty(config)) { - completion.success(Maps.newLinkedHashMap()); + completion.fail(operr("empty config, cannot discover xinfini")); return; } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java index 3fc72aaa776..8b486289dc7 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/XInfiniClient.java @@ -6,6 +6,7 @@ import org.springframework.http.HttpMethod; import org.zstack.core.Platform; import org.zstack.externalStorage.sdk.ExternalStorageApiClient; +import org.zstack.externalStorage.sdk.ExternalStorageParam; import org.zstack.header.rest.DefaultSSLVerifier; import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.utils.Utils; @@ -13,9 +14,11 @@ import org.zstack.utils.logging.CLogger; import org.zstack.xinfini.NodeStatus; import org.zstack.xinfini.XInfiniConfig; +import org.zstack.xinfini.sdk.volume.FlattenVolumeRequest; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; +import java.io.EOFException; import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; @@ -156,28 +159,49 @@ XinfiniApiResult doCallWithNode(XInfiniConfig.Node withNode) { Request request = reqBuilder.build(); - logger.debug(String.format("call request[%s: %s]: %s, body: %s", action.getClass().getSimpleName(), taskIdForLog, - request, reqBody)); + int retryCount = 0; + while (retryCount <= 2) { + try { + logger.debug(String.format("call request[%s: %s]: %s, body: %s", action.getClass().getSimpleName(), taskIdForLog, request, reqBody)); + try (Response response = http.newCall(request).execute()) { + if (!response.isSuccessful()) { + if (response.body() == null) { + return httpError(response.code(), null); + } else { + return httpError(response.code(), response.body().string()); + } + } - try { - try (Response response = http.newCall(request).execute()) { - if (!response.isSuccessful()) { - if (response.body() == null) { - return httpError(response.code(), null); - } else { - return httpError(response.code(), response.body().string()); + if (!validHttpStatus.contains(response.code())) { + throw new XInfiniApiException(String.format("[Internal Error] the server returns an unknown status code[%s]", response.code())); } - } - if (!validHttpStatus.contains(response.code())) { - throw new XInfiniApiException(String.format("[Internal Error] the server returns an unknown status code[%s]", response.code())); + return writeApiResult(response); } - - return writeApiResult(response); + } catch (IOException e) { + if (isEOFException(e) && retryCount < 1) { + retryCount++; + try { + TimeUnit.SECONDS.sleep(3); + } catch (InterruptedException ex) { + logger.warn("EOFException sleep failed"); + } + continue; + } + throw new XInfiniApiException(e); } - } catch (IOException e) { - throw new XInfiniApiException(e); } + throw new XInfiniApiException("Max retry attempts reached"); + } + + private boolean isEOFException(IOException e) { + // only retry on query api + if (!(action instanceof XInfiniQueryRequest)) { + return false; + } + + return e instanceof EOFException || + (e.getMessage() != null && e.getMessage().contains("EOF")); } private void fillQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniConfig.Node node) throws Exception { @@ -262,6 +286,7 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } final Map params = new HashMap<>(); + final Map queryableParams = new HashMap<>(); for (String pname : action.getAllParameterNames()) { if (varNames.contains(pname)) { @@ -270,7 +295,13 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } Object value = action.getParameterValue(pname); - if (value != null) { + if (value == null) { + continue; + } + + if (action.isQueryableParam(pname)) { + queryableParams.put(pname, value.toString()); + } else { params.put(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, pname), value); } } @@ -280,6 +311,12 @@ private void fillNonQueryApiRequestBuilder(Request.Builder reqBuilder, XInfiniCo } else if (restInfo.method().equals(HttpMethod.DELETE) && !restInfo.hasBody()) { params.forEach((k, v) -> builder.addQueryParameter(k, v.toString())); reqBuilder.url(builder.build()).delete(); + } else if (!queryableParams.isEmpty()) { + for (Map.Entry entry : queryableParams.entrySet()) { + builder.addQueryParameter(entry.getKey(), entry.getValue()); + } + reqBody = gson.toJson(new WrappedRequest(params)); + reqBuilder.url(builder.build()).method(restInfo.method().toString(), RequestBody.create(XInfiniConstants.JSON, reqBody)); } else { reqBody = gson.toJson(new WrappedRequest(params)); reqBuilder.url(builder.build()).method(restInfo.method().toString(), RequestBody.create(XInfiniConstants.JSON, reqBody)); diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java index aea689ae9c2..54c49aa553c 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiGatewayModule.java @@ -44,6 +44,15 @@ public static class IscsiGatewayStatus extends BaseStatus { private int iscsiClientNum; private int iscsiClientGroupNum; private int iscsiPathNum; + private String nodeState; + + public String getNodeState() { + return nodeState; + } + + public void setNodeState(String nodeState) { + this.nodeState = nodeState; + } public String getConfigContent() { return configContent; diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java new file mode 100644 index 00000000000..a2d2875d574 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/iscsi/IscsiNodeState.java @@ -0,0 +1,6 @@ +package org.zstack.xinfini.sdk.iscsi; + +public enum IscsiNodeState { + ACTIVE, + ERROR +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java new file mode 100644 index 00000000000..6267c1a8546 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/BdcRunState.java @@ -0,0 +1,10 @@ +package org.zstack.xinfini.sdk.vhost; + +/** + * @ Author : yh.w + * @ Date : Created in 11:03 2025/6/12 + */ +public enum BdcRunState { + Active, + Offline +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java index 3b64bebf83a..520cb9f15df 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/vhost/CreateBdcBdevRequest.java @@ -26,9 +26,20 @@ public class CreateBdcBdevRequest extends XInfiniRequest { @Param private int bsVolumeId; + @Param + private int queueNum = 1; + @Param private String name; + public int getQueueNum() { + return queueNum; + } + + public void setQueueNum(int queueNum) { + this.queueNum = queueNum; + } + public String getName() { return name; } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java index 1ecfdc1830e..a31fc3dfe61 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/CloneVolumeRequest.java @@ -17,7 +17,7 @@ @XInfiniRestRequest( path = "/bs-volumes/:clone", method = HttpMethod.POST, - responseClass = CreateVolumeSnapshotResponse.class, + responseClass = CloneVolumeResponse.class, category = XInfiniApiCategory.AFA ) public class CloneVolumeRequest extends XInfiniRequest { @@ -33,9 +33,20 @@ public class CloneVolumeRequest extends XInfiniRequest { @Param private boolean flatten; + @Param(required = false) + private XinfiniVolumeQos qos; + @Param(required = false) private String description; + public XinfiniVolumeQos getQos() { + return qos; + } + + public void setQos(XinfiniVolumeQos qos) { + this.qos = qos; + } + public int getBsSnapId() { return bsSnapId; } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java similarity index 63% rename from plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeRequest.java rename to plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java index 2d1274d7ff0..267a8fd70da 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeRequest.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeRequest.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.externalStorage.sdk.Param; +import org.zstack.header.xinfini.XInfiniConstants; import org.zstack.xinfini.XInfiniApiCategory; import org.zstack.xinfini.sdk.XInfiniRequest; import org.zstack.xinfini.sdk.XInfiniRestRequest; @@ -14,24 +15,32 @@ * @ Date : Created in 17:36 2024/5/27 */ @XInfiniRestRequest( - path = "/bs-volumes/{id}", - method = HttpMethod.PATCH, - responseClass = GetVolumeResponse.class, + path = "/bs-volumes/{id}/:flatten", + method = HttpMethod.POST, + responseClass = FlattenVolumeResponse.class, category = XInfiniApiCategory.AFA ) -public class ExpandVolumeRequest extends XInfiniRequest { +public class FlattenVolumeRequest extends XInfiniRequest { @Param private int id; - @Param - private long sizeMb; + @Param(queryable=true) + private String creator = XInfiniConstants.DEFAULT_CREATOR; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } - public long getSizeMb() { - return sizeMb; + public String getCreator() { + return creator; } - public void setSizeMb(long sizeMb) { - this.sizeMb = sizeMb; + public void setCreator(String creator) { + this.creator = creator; } private static final HashMap parameterMap = new HashMap<>(); @@ -41,11 +50,4 @@ public Map getParameterMap() { return parameterMap; } - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } } diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java new file mode 100644 index 00000000000..a773f18faa1 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/FlattenVolumeResponse.java @@ -0,0 +1,43 @@ + +package org.zstack.xinfini.sdk.volume; + +import org.zstack.xinfini.sdk.BaseResource; +import org.zstack.xinfini.sdk.XInfiniResponse; + +/** + * @ Author : yh.w + * @ Date : Created in 18:30 2024/5/29 + */ +public class FlattenVolumeResponse extends XInfiniResponse { + private BaseResource.Metadata metadata; + private VolumeModule.VolumeSpec spec; + private VolumeModule.VolumeStatus status; + + public BaseResource.Metadata getMetadata() { + return metadata; + } + + public void setMetadata(BaseResource.Metadata metadata) { + this.metadata = metadata; + } + + public VolumeModule.VolumeSpec getSpec() { + return spec; + } + + public void setSpec(VolumeModule.VolumeSpec spec) { + this.spec = spec; + } + + public VolumeModule.VolumeStatus getStatus() { + return status; + } + + public void setStatus(VolumeModule.VolumeStatus status) { + this.status = status; + } + + public VolumeModule toModule() { + return new VolumeModule(metadata, spec, status); + } +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java new file mode 100644 index 00000000000..0403ba39cfd --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotRequest.java @@ -0,0 +1,64 @@ +package org.zstack.xinfini.sdk.volume; + +import org.springframework.http.HttpMethod; +import org.zstack.externalStorage.sdk.Param; +import org.zstack.header.xinfini.XInfiniConstants; +import org.zstack.xinfini.XInfiniApiCategory; +import org.zstack.xinfini.sdk.XInfiniRequest; +import org.zstack.xinfini.sdk.XInfiniRestRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ Author : yh.w + * @ Date : Created in 17:36 2024/5/27 + */ +@XInfiniRestRequest( + path = "/bs-volumes/{id}/:rollback", + method = HttpMethod.POST, + responseClass = RollbackSnapshotResponse.class, + category = XInfiniApiCategory.AFA +) +public class RollbackSnapshotRequest extends XInfiniRequest { + @Param + private int id; + + @Param + private int bsSnapId; + + @Param + private String creator = XInfiniConstants.DEFAULT_CREATOR; + + public int getBsSnapId() { + return bsSnapId; + } + + public void setBsSnapId(int bsSnapId) { + this.bsSnapId = bsSnapId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + private static final HashMap parameterMap = new HashMap<>(); + + @Override + public Map getParameterMap() { + return parameterMap; + } + +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java new file mode 100644 index 00000000000..366b5ca7c40 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/RollbackSnapshotResponse.java @@ -0,0 +1,43 @@ + +package org.zstack.xinfini.sdk.volume; + +import org.zstack.xinfini.sdk.BaseResource; +import org.zstack.xinfini.sdk.XInfiniResponse; + +/** + * @ Author : yh.w + * @ Date : Created in 18:30 2024/5/29 + */ +public class RollbackSnapshotResponse extends XInfiniResponse { + private BaseResource.Metadata metadata; + private VolumeModule.VolumeSpec spec; + private VolumeModule.VolumeStatus status; + + public BaseResource.Metadata getMetadata() { + return metadata; + } + + public void setMetadata(BaseResource.Metadata metadata) { + this.metadata = metadata; + } + + public VolumeModule.VolumeSpec getSpec() { + return spec; + } + + public void setSpec(VolumeModule.VolumeSpec spec) { + this.spec = spec; + } + + public VolumeModule.VolumeStatus getStatus() { + return status; + } + + public void setStatus(VolumeModule.VolumeStatus status) { + this.status = status; + } + + public VolumeModule toModule() { + return new VolumeModule(metadata, spec, status); + } +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java new file mode 100644 index 00000000000..e3fc1c51d9e --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeRequest.java @@ -0,0 +1,84 @@ +package org.zstack.xinfini.sdk.volume; + +import org.springframework.http.HttpMethod; +import org.zstack.externalStorage.sdk.Param; +import org.zstack.xinfini.XInfiniApiCategory; +import org.zstack.xinfini.sdk.XInfiniRequest; +import org.zstack.xinfini.sdk.XInfiniRestRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ Author : yh.w + * @ Date : Created in 17:36 2024/5/27 + */ +@XInfiniRestRequest( + path = "/bs-volumes/{id}", + method = HttpMethod.PATCH, + responseClass = UpdateVolumeResponse.class, + category = XInfiniApiCategory.AFA +) +public class UpdateVolumeRequest extends XInfiniRequest { + @Param(required = false, queryable = true) + private String creator; + + @Param + private int id; + + @Param(required = false) + private Long sizeMb; + + @Param(required = false) + private String name; + + @Param(required = false) + private XinfiniVolumeQos qos; + + public XinfiniVolumeQos getQos() { + return qos; + } + + public void setQos(XinfiniVolumeQos qos) { + this.qos = qos; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public Long getSizeMb() { + return sizeMb; + } + + public void setSizeMb(Long sizeMb) { + this.sizeMb = sizeMb; + } + + private static final HashMap parameterMap = new HashMap<>(); + + @Override + public Map getParameterMap() { + return parameterMap; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeResponse.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeResponse.java similarity index 94% rename from plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeResponse.java rename to plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeResponse.java index a6ba8853adc..3f57e56aee0 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/ExpandVolumeResponse.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/UpdateVolumeResponse.java @@ -7,7 +7,7 @@ * @ Author : yh.w * @ Date : Created in 11:51 2024/5/28 */ -public class ExpandVolumeResponse extends XInfiniResponse { +public class UpdateVolumeResponse extends XInfiniResponse { private BaseResource.Metadata metadata; private VolumeModule.VolumeSpec spec; private VolumeModule.VolumeStatus status; diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java index 20e5f3fd16c..999eb45797a 100644 --- a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/VolumeModule.java @@ -89,6 +89,24 @@ public static class VolumeSpec extends BaseSpec { private int poolId; private boolean flattened; private String serial; + private long maxTotalIops; + private long maxTotalBwBps; + + public long getMaxTotalIops() { + return maxTotalIops; + } + + public void setMaxTotalIops(long maxTotalIops) { + this.maxTotalIops = maxTotalIops; + } + + public long getMaxTotalBwBps() { + return maxTotalBwBps; + } + + public void setMaxTotalBwBps(long maxTotalBwBps) { + this.maxTotalBwBps = maxTotalBwBps; + } public String getSerial() { return serial; diff --git a/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/XinfiniVolumeQos.java b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/XinfiniVolumeQos.java new file mode 100644 index 00000000000..44bd3469011 --- /dev/null +++ b/plugin/xinfini/src/main/java/org/zstack/xinfini/sdk/volume/XinfiniVolumeQos.java @@ -0,0 +1,50 @@ +package org.zstack.xinfini.sdk.volume; + +import org.zstack.externalStorage.sdk.ExternalStorageParam; +import org.zstack.externalStorage.sdk.Param; +import org.zstack.header.volume.VolumeQos; +import org.zstack.xinfini.sdk.XInfiniParam; + +import java.util.HashMap; +import java.util.Map; + +public class XinfiniVolumeQos implements XInfiniParam { + private static final HashMap parameterMap = new HashMap<>(); + + @Param(required = false, numberRange = {104857600, 107374182400L}) + private long maxTotalBwBps; + @Param(required = false, numberRange = {1000, 10000000}) + private long maxTotalIops; + + public static XinfiniVolumeQos valueOf(VolumeQos qos) { + if (qos == null) { + return null; + } + + XinfiniVolumeQos ret = new XinfiniVolumeQos(); + ret.maxTotalBwBps = qos.getTotalBandwidth() == null || qos.getTotalBandwidth() < 0 ? 0 : qos.getTotalBandwidth(); + ret.maxTotalIops = qos.getTotalIOPS() == null || qos.getTotalIOPS() < 0 ? 0 : qos.getTotalIOPS(); + return ret; + } + + public long getMaxTotalBwBps() { + return maxTotalBwBps; + } + + public void setMaxTotalBwBps(long maxTotalBwBps) { + this.maxTotalBwBps = maxTotalBwBps; + } + + public long getMaxTotalIops() { + return maxTotalIops; + } + + public void setMaxTotalIops(long maxTotalIops) { + this.maxTotalIops = maxTotalIops; + } + + @Override + public Map getParameterMap() { + return parameterMap; + } +} diff --git a/plugin/zbs/pom.xml b/plugin/zbs/pom.xml index bbd31a083ed..611473553b8 100644 --- a/plugin/zbs/pom.xml +++ b/plugin/zbs/pom.xml @@ -6,7 +6,7 @@ org.zstack plugin - 5.2.0 + 5.4.0 zbs diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java index 58654afe4f1..8f547cfeb29 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsConstants.java @@ -11,5 +11,13 @@ public interface ZbsConstants { String IDENTITY = "zbs"; String ZBS_PS_IPTABLES_COMMENTS = "Zbsp.allow.port"; String ZBS_PS_ALLOW_PORTS = "7763"; + String ZBS_HEARTBEAT_VOLUME_NAME = "zbs_zstack_heartbeat"; + long ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE = 1; + String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; + String ZBS_CBD_PREFIX_SCHEME = "cbd://"; Integer PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE = 3; + String VOLUME_PHYSICAL_BLOCK_SIZE = "4096"; + String MEGABYTE_SUPPORTED_VERSION = "1.6.1"; + String MEGABYTE_UNIT = "M"; + String DEFAULT_GIGABYTE_UNIT = null; } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java index fbf4b3928e6..16cd549cdf6 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsGlobalProperty.java @@ -15,7 +15,7 @@ public class ZbsGlobalProperty { public static String PRIMARY_STORAGE_MODULE_PATH; @GlobalProperty(name = "Zbs.primaryStorage.ansiblePlaybook", defaultValue = "zbsp.py") public static String PRIMARY_STORAGE_PLAYBOOK_NAME; - @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.0.0.tar.gz") + @GlobalProperty(name = "Zbs.primaryStorage.agentPackageName", defaultValue = "zbsprimarystorage-5.4.0.tar.gz") public static String PRIMARY_STORAGE_PACKAGE_NAME; @GlobalProperty(name = "Zbs.primaryStorageAgent.port", defaultValue = "7763") public static int PRIMARY_STORAGE_AGENT_PORT; diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java index e51471cbf8b..7af981c5194 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsHelper.java @@ -1,9 +1,46 @@ package org.zstack.storage.zbs; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQL; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.storage.primary.PrimaryStorageVO_; +import org.zstack.utils.VersionComparator; +import org.zstack.utils.data.SizeUnit; + /** * @author Xingwei Yu * @date 2024/4/9 17:50 */ public class ZbsHelper { - static String zbsHeartbeatVolumeName = "zbs_zstack_heartbeat"; + public static void configUrl(String psUuid) { + String psUrl = ZbsConstants.ZBS_CBD_PREFIX_SCHEME + psUuid; + if (!psUrl.equals(Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.url).eq(PrimaryStorageVO_.uuid, psUuid).findValue())) { + SQL.New(PrimaryStorageVO.class).set(PrimaryStorageVO_.url, psUrl).eq(PrimaryStorageVO_.uuid, psUuid).update(); + } + } + + public static String buildHeartbeatVolumePath(String logicalPool) { + return String.format("cbd:%s_physical/%s/%s", logicalPool, logicalPool, ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + } + + public static String buildVolumePath(String physicalPool, String logicalPool, String volId) { + String base = volId.replace("-", ""); + return String.format(ZbsConstants.ZBS_CBD_LUN_PATH_FORMAT, physicalPool, logicalPool, base); + } + + public static String getVolumeFromSnapshotPath(String path) { + return path.split("@")[0]; + } + + public static String getSizeUnit(String version) { + return new VersionComparator(version.split("-")[0]).compare(ZbsConstants.MEGABYTE_SUPPORTED_VERSION) >= 0 ? ZbsConstants.MEGABYTE_UNIT : ZbsConstants.DEFAULT_GIGABYTE_UNIT; + } + + public static long alignSizeTo(long size, String unit) { + return ZbsConstants.MEGABYTE_UNIT.equals(unit) ? (long) Math.ceil(SizeUnit.BYTE.toMegaByte((double) size)) : (long) Math.ceil(SizeUnit.BYTE.toGigaByte((double) size)); + } + + public static long convertSizeToByte(long size, String unit) { + return ZbsConstants.MEGABYTE_UNIT.equals(unit) ? SizeUnit.MEGABYTE.toByte(size) : SizeUnit.GIGABYTE.toByte(size); + } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java index b23abf61154..1d4f286233a 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsMdsBase.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.cbd.ClusterInfo; import org.zstack.cbd.MdsInfo; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.Completion; @@ -41,27 +42,27 @@ public MdsInfo getSelf() { } public abstract void connect(Completion completion); - public abstract void ping(Completion completion); + public abstract void ping(ClusterInfo clusterInfo, Completion completion); protected abstract String makeHttpPath(String ip, String path); - protected void checkTools() { + protected void checkSshAndTools() { Ssh ssh = new Ssh(); try { - ssh.setHostname(self.getMdsAddr()).setUsername(self.getSshUsername()).setPassword(self.getSshPassword()).setPort(self.getSshPort()) + ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .checkTool("zbs").setTimeout(60).runErrorByExceptionAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("The problem may be caused by zbs-tool is missing on mds node.")); + throw new OperationFailureException(operr("failed to SSH or zbs-tools was not installed in MDS[%s], you need to check the SSH configuration and dependencies", self.getAddr())); } } - protected void checkHealth() { + protected void checkStorageHealth() { Ssh ssh = new Ssh(); SshResult ret = null; try { - ret = ssh.setHostname(self.getMdsAddr()).setUsername(self.getSshUsername()).setPassword(self.getSshPassword()).setPort(self.getSshPort()) + ret = ssh.setHostname(self.getAddr()).setUsername(self.getUsername()).setPassword(self.getPassword()).setPort(self.getPort()) .shell("zbs status mds --format json").setTimeout(60).runAndClose(); } catch (SshException e) { - throw new OperationFailureException(operr("The problem may be caused by zbs storage health issue.")); + throw new OperationFailureException(operr("failed to get MDS[%s] metadata, you need to check the ZBS configuration", self.getAddr())); } if (ret.getReturnCode() != 0) { @@ -75,6 +76,10 @@ protected void checkHealth() { } } + public T syncCall(final String path, final Object cmd, final Class retClass, TimeUnit unit, long timeout) { + return restf.syncJsonPost(makeHttpPath(self.getAddr(), path), cmd, retClass, unit, timeout); + } + public void httpCall(final String path, final Object cmd, final Class retClass, final ReturnValueCompletion completion) { httpCall(path, cmd, retClass, completion, null, 0); } @@ -103,15 +108,14 @@ public Class getReturnClass() { }; if (unit == null) { - restf.asyncJsonPost(makeHttpPath(self.getMdsAddr(), path), cmd, callback); + restf.asyncJsonPost(makeHttpPath(self.getAddr(), path), cmd, callback); } else { - restf.asyncJsonPost(makeHttpPath(self.getMdsAddr(), path), cmd, callback, unit, timeout); + restf.asyncJsonPost(makeHttpPath(self.getAddr(), path), cmd, callback, unit, timeout); } } public static class AgentResponse { private String error; - @Deprecated private boolean success = true; public String getError() { @@ -123,7 +127,6 @@ public void setError(String error) { this.error = error; } - @Deprecated public boolean isSuccess() { return success; } @@ -142,7 +145,7 @@ public ErrorCode buildErrorCode() { public static class AgentCommand { private String uuid; - private String mdsAddr; + private String addr; public String getUuid() { return uuid; @@ -152,12 +155,12 @@ public void setUuid(String uuid) { this.uuid = uuid; } - public String getMdsAddr() { - return mdsAddr; + public String getAddr() { + return addr; } - public void setMdsAddr(String mdsAddr) { - this.mdsAddr = mdsAddr; + public void setAddr(String addr) { + this.addr = addr; } } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java index 08917b1659e..81309d43642 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsPrimaryStorageMdsBase.java @@ -1,8 +1,10 @@ package org.zstack.storage.zbs; import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.cbd.ClusterInfo; import org.zstack.cbd.MdsInfo; import org.zstack.cbd.MdsStatus; +import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.Platform; import org.zstack.core.ansible.*; @@ -48,14 +50,15 @@ public class ZbsPrimaryStorageMdsBase extends ZbsMdsBase { public static final String ECHO_PATH = "/zbs/primarystorage/echo"; public static final String PING_PATH = "/zbs/primarystorage/ping"; + public static final String SYNC_METADATA_PATH = "/zbs/primarystorage/metadata/sync"; public ZbsPrimaryStorageMdsBase(MdsInfo self) { super(self); - this.syncId = String.format("connect-mds-%s", self.getMdsAddr()); + this.syncId = String.format("connect-mds-%s", self.getAddr()); } private void doConnect(final Completion completion) { - getSelf().setMdsStatus(MdsStatus.Connecting); + getSelf().setStatus(MdsStatus.Connecting); final FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName("connect-mds"); @@ -69,8 +72,8 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - checkTools(); - checkHealth(); + checkSshAndTools(); + checkStorageHealth(); trigger.next(); } }); @@ -81,30 +84,30 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { SshFileMd5Checker checker = new SshFileMd5Checker(); - checker.setTargetIp(getSelf().getMdsAddr()); - checker.setUsername(getSelf().getSshUsername()); - checker.setPassword(getSelf().getSshPassword()); + checker.setTargetIp(getSelf().getAddr()); + checker.setUsername(getSelf().getUsername()); + checker.setPassword(getSelf().getPassword()); checker.addSrcDestPair(SshFileMd5Checker.ZSTACKLIB_SRC_PATH, String.format("/var/lib/zstack/zbsp/package/%s", AnsibleGlobalProperty.ZSTACKLIB_PACKAGE_NAME)); checker.addSrcDestPair(PathUtil.findFileOnClassPath(String.format("ansible/zbsp/%s", ZbsGlobalProperty.PRIMARY_STORAGE_PACKAGE_NAME), true).getAbsolutePath(), String.format("/var/lib/zstack/zbsp/package/%s", ZbsGlobalProperty.PRIMARY_STORAGE_PACKAGE_NAME)); SshChronyConfigChecker chronyChecker = new SshChronyConfigChecker(); - chronyChecker.setTargetIp(getSelf().getMdsAddr()); - chronyChecker.setUsername(getSelf().getSshUsername()); - chronyChecker.setPassword(getSelf().getSshPassword()); - chronyChecker.setSshPort(getSelf().getSshPort()); + chronyChecker.setTargetIp(getSelf().getAddr()); + chronyChecker.setUsername(getSelf().getUsername()); + chronyChecker.setPassword(getSelf().getPassword()); + chronyChecker.setSshPort(getSelf().getPort()); SshYumRepoChecker repoChecker = new SshYumRepoChecker(); - repoChecker.setTargetIp(getSelf().getMdsAddr()); - repoChecker.setUsername(getSelf().getSshUsername()); - repoChecker.setPassword(getSelf().getSshPassword()); - repoChecker.setSshPort(getSelf().getSshPort()); + repoChecker.setTargetIp(getSelf().getAddr()); + repoChecker.setUsername(getSelf().getUsername()); + repoChecker.setPassword(getSelf().getPassword()); + repoChecker.setSshPort(getSelf().getPort()); CallBackNetworkChecker callBackChecker = new CallBackNetworkChecker(); - callBackChecker.setTargetIp(getSelf().getMdsAddr()); - callBackChecker.setUsername(getSelf().getSshUsername()); - callBackChecker.setPassword(getSelf().getSshPassword()); - callBackChecker.setPort(getSelf().getSshPort()); + callBackChecker.setTargetIp(getSelf().getAddr()); + callBackChecker.setUsername(getSelf().getUsername()); + callBackChecker.setPassword(getSelf().getPassword()); + callBackChecker.setPort(getSelf().getPort()); callBackChecker.setCallbackIp(Platform.getManagementServerIp()); callBackChecker.setCallBackPort(CloudBusGlobalProperty.HTTP_PORT); @@ -113,10 +116,11 @@ public void run(FlowTrigger trigger, Map data) { runner.installChecker(chronyChecker); runner.installChecker(repoChecker); runner.installChecker(callBackChecker); - runner.setUsername(getSelf().getSshUsername()); - runner.setPassword(getSelf().getSshPassword()); - runner.setTargetIp(getSelf().getMdsAddr()); - runner.setTargetUuid(getSelf().getMdsAddr()); + runner.setUsername(getSelf().getUsername()); + runner.setPassword(getSelf().getPassword()); + runner.setSshPort(getSelf().getPort()); + runner.setTargetIp(getSelf().getAddr()); + runner.setTargetUuid(getSelf().getAddr()); runner.setAgentPort(ZbsGlobalProperty.PRIMARY_STORAGE_AGENT_PORT); runner.setPlayBookName(ZbsGlobalProperty.PRIMARY_STORAGE_PLAYBOOK_NAME); @@ -143,25 +147,26 @@ public void fail(ErrorCode errorCode) { @Autowired public void run(FlowTrigger trigger, Map data) { StringBuilder builder = new StringBuilder(); + String allowPorts = ZbsConstants.ZBS_PS_ALLOW_PORTS + ',' + HostGlobalConfig.NBD_PORT_RANGE.value(String.class); if (!ZbsGlobalProperty.MN_NETWORKS.isEmpty()) { builder.append(String.format("sudo bash %s -m %s -p %s -c %s", "/var/lib/zstack/zbsp/package/zbsps-iptables", ZbsConstants.ZBS_PS_IPTABLES_COMMENTS, - ZbsConstants.ZBS_PS_ALLOW_PORTS, + allowPorts, String.join(",", ZbsGlobalProperty.MN_NETWORKS))); } else { builder.append(String.format("sudo bash %s -m %s -p %s", "/var/lib/zstack/zbsp/package/zbsps-iptables", ZbsConstants.ZBS_PS_IPTABLES_COMMENTS, - ZbsConstants.ZBS_PS_ALLOW_PORTS)); + allowPorts)); } try { new Ssh().shell(builder.toString()) - .setUsername(getSelf().getSshUsername()) - .setPassword(getSelf().getSshPassword()) - .setHostname(getSelf().getMdsAddr()) - .setPort(getSelf().getSshPort()).runErrorByExceptionAndClose(); + .setUsername(getSelf().getUsername()) + .setPassword(getSelf().getPassword()) + .setHostname(getSelf().getAddr()) + .setPort(getSelf().getPort()).runErrorByExceptionAndClose(); } catch (SshException ex) { throw new OperationFailureException(operr(ex.toString())); } @@ -176,7 +181,7 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - restf.echo(ZbsAgentUrl.primaryStorageUrl(getSelf().getMdsAddr(), ECHO_PATH), new Completion(trigger) { + restf.echo(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), ECHO_PATH), new Completion(trigger) { @Override public void success() { trigger.next(); @@ -190,10 +195,38 @@ public void fail(ErrorCode errorCode) { } }); + flow(new NoRollbackFlow() { + String __name__ = "sync-metadata"; + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncMetadataCmd cmd = new SyncMetadataCmd(); + cmd.setAddr(getSelf().getAddr()); + + restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), SYNC_METADATA_PATH), cmd, new JsonAsyncRESTCallback(trigger) { + @Override + public void success(SyncMetadataRsp ret) { + getSelf().setExternalAddr(ret.getExternalAddr()); + trigger.next(); + } + + @Override + public void fail(ErrorCode err) { + trigger.fail(err); + } + + @Override + public Class getReturnClass() { + return SyncMetadataRsp.class; + } + }); + } + }); + done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { - getSelf().setMdsStatus(MdsStatus.Connected); + getSelf().setStatus(MdsStatus.Connected); completion.success(); } }); @@ -201,7 +234,7 @@ public void handle(Map data) { error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - getSelf().setMdsStatus(MdsStatus.Disconnected); + getSelf().setStatus(MdsStatus.Disconnected); completion.fail(errCode); } }); @@ -236,13 +269,13 @@ public String getSyncSignature() { @Override public String getName() { - return String.format("mds-%s", getSelf().getMdsAddr()); + return String.format("mds-%s", getSelf().getAddr()); } }); } @Override - public void ping(Completion completion) { + public void ping(ClusterInfo clusterInfo, Completion completion) { thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { @@ -251,7 +284,7 @@ public String getSyncSignature() { @Override public void run(final SyncTaskChain chain) { - pingMds(new Completion(completion) { + pingMds(clusterInfo, new Completion(completion) { @Override public void success() { completion.success(); @@ -268,12 +301,12 @@ public void fail(ErrorCode errorCode) { @Override public String getName() { - return String.format("ping-zbs-primary-storage-mds-%s", getSelf().getMdsAddr()); + return String.format("ping-zbs-primary-storage-mds-%s", getSelf().getAddr()); } }); } - private void pingMds(final Completion completion) { + private void pingMds(ClusterInfo clusterInfo, final Completion completion) { final Integer MAX_PING_CNT = ZbsConstants.PRIMARY_STORAGE_MDS_MAXIMUM_PING_FAILURE; final List stepCount = new ArrayList<>(); for (int i = 1; i <= MAX_PING_CNT; i++) { @@ -282,18 +315,30 @@ private void pingMds(final Completion completion) { new While<>(stepCount).each((step, comp) -> { PingCmd cmd = new PingCmd(); - cmd.setMdsAddr(getSelf().getMdsAddr()); - - restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getMdsAddr(), PING_PATH), + cmd.setClusterInfo(clusterInfo); + cmd.setAddr(getSelf().getAddr()); + restf.asyncJsonPost(ZbsAgentUrl.primaryStorageUrl(getSelf().getAddr(), PING_PATH), cmd, new JsonAsyncRESTCallback(completion) { @Override public void success(PingRsp rsp) { - comp.allDone(); + if (rsp.isSuccess()){ + comp.allDone(); + return; + } + + comp.addError(operr("%s", rsp.getError())); + + if (step.equals(MAX_PING_CNT)) { + comp.allDone(); + return; + } + + comp.done(); } @Override public void fail(ErrorCode errorCode) { - logger.warn(String.format("ping zbs primary storage mds[%s] failed (%d/%d): %s", getSelf().getMdsAddr(), step, MAX_PING_CNT, errorCode.toString())); + logger.warn(String.format("ping ZBS primary storage MDS[%s] failed (%d/%d): %s", getSelf().getAddr(), step, MAX_PING_CNT, errorCode.toString())); comp.addError(errorCode); if (step.equals(MAX_PING_CNT)) { @@ -325,6 +370,30 @@ public static class PingRsp extends ZbsMdsBase.AgentResponse { } public static class PingCmd extends ZbsMdsBase.AgentCommand { + private ClusterInfo clusterInfo; + + public ClusterInfo getClusterInfo() { + return clusterInfo; + } + + public void setClusterInfo(ClusterInfo clusterInfo) { + this.clusterInfo = clusterInfo; + } + } + + public static class SyncMetadataRsp extends ZbsMdsBase.AgentResponse { + private String externalAddr; + + public String getExternalAddr() { + return externalAddr; + } + + public void setExternalAddr(String externalAddr) { + this.externalAddr = externalAddr; + } + } + + public static class SyncMetadataCmd extends ZbsMdsBase.AgentCommand { } @Override diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java index f223755fb6d..4b725d7d952 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java @@ -7,33 +7,46 @@ import org.zstack.cbd.*; import org.zstack.cbd.kvm.CbdHeartbeatVolumeTO; import org.zstack.cbd.kvm.CbdVolumeTo; +import org.zstack.compute.host.HostGlobalConfig; import org.zstack.core.CoreGlobalProperty; +import org.zstack.core.ansible.AnsibleGlobalProperty; import org.zstack.core.asyncbatch.While; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.HasThreadContext; -import org.zstack.header.core.Completion; -import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.HostAO_; +import org.zstack.header.host.HostConstant; import org.zstack.header.host.HostInventory; +import org.zstack.header.host.HostVO; import org.zstack.header.image.ImageConstant; +import org.zstack.header.message.MessageReply; import org.zstack.header.rest.RESTFacade; import org.zstack.header.storage.addon.*; import org.zstack.header.storage.addon.primary.*; -import org.zstack.header.storage.primary.PrimaryStorageStatus; -import org.zstack.header.storage.primary.VolumeSnapshotCapability; +import org.zstack.header.storage.primary.*; import org.zstack.header.storage.snapshot.VolumeSnapshotStats; import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeProtocol; import org.zstack.header.volume.VolumeStats; +import org.zstack.kvm.KVMHostAsyncHttpCallMsg; +import org.zstack.kvm.KVMHostAsyncHttpCallReply; +import org.zstack.kvm.KVMHostVO; +import org.zstack.kvm.KVMHostVO_; +import org.zstack.resourceconfig.ResourceConfig; +import org.zstack.resourceconfig.ResourceConfigFacade; +import org.zstack.storage.volume.VolumeGlobalConfig; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.data.SizeUnit; @@ -47,6 +60,7 @@ import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; +import static org.zstack.storage.zbs.ZbsHelper.*; /** * @author Xingwei Yu @@ -60,26 +74,34 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar private DatabaseFacade dbf; @Autowired protected RESTFacade restf; + @Autowired + private ResourceConfigFacade rcf; + @Autowired + private CloudBus bus; private ExternalPrimaryStorageVO self; private AddonInfo addonInfo; private Config config; - public static final String GET_FACTS_PATH = "/zbs/primarystorage/facts"; + public static final String DEPLOY_CLIENT_PATH = "/zbs/primarystorage/client/deploy"; public static final String GET_CAPACITY_PATH = "/zbs/primarystorage/capacity"; + public static final String GET_FACTS_PATH = "/zbs/primarystorage/facts"; public static final String COPY_PATH = "/zbs/primarystorage/copy"; public static final String CREATE_VOLUME_PATH = "/zbs/primarystorage/volume/create"; public static final String DELETE_VOLUME_PATH = "/zbs/primarystorage/volume/delete"; public static final String CLONE_VOLUME_PATH = "/zbs/primarystorage/volume/clone"; public static final String QUERY_VOLUME_PATH = "/zbs/primarystorage/volume/query"; + public static final String BATCH_QUERY_VOLUME_PATH = "/zbs/primarystorage/volume/query/batch"; public static final String EXPAND_VOLUME_PATH = "/zbs/primarystorage/volume/expand"; + public static final String FLATTEN_VOLUME_PATH = "/zbs/primarystorage/volume/flatten"; public static final String CBD_TO_NBD_PATH = "/zbs/primarystorage/volume/cbdtonbd"; public static final String CLEAN_NBD_PATH = "/zbs/primarystorage/volume/cleannbd"; public static final String CREATE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/create"; public static final String DELETE_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/delete"; public static final String ROLLBACK_SNAPSHOT_PATH = "/zbs/primarystorage/snapshot/rollback"; - - private static final String ZBS_CBD_LUN_PATH_FORMAT = "cbd:%s/%s/%s"; + public static final String CHECK_HOST_STORAGE_CONNECTION_PATH = "/zbs/primarystorage/check/host/connection"; + public static final String GET_VOLUME_CLIENTS_PATH = "/zbs/primarystorage/volume/clients"; + public static final String UPDATE_HOST_DEPENDENCY_PATH = "/zbs/primarystorage/host/updatedependency"; private static final StorageCapabilities capabilities = new StorageCapabilities(); @@ -87,8 +109,12 @@ public class ZbsStorageController implements PrimaryStorageControllerSvc, Primar VolumeSnapshotCapability scap = new VolumeSnapshotCapability(); scap.setSupport(true); scap.setArrangementType(VolumeSnapshotCapability.VolumeSnapshotArrangementType.INDIVIDUAL); + scap.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL); scap.setSupportCreateOnHypervisor(false); + scap.setSupportLazyDelete(false); + scap.setVolumePathFromInternalSnapshotRegex("^[^@]+"); capabilities.setSnapshotCapability(scap); + capabilities.setSupportShareableVolume(true); capabilities.setSupportCloneFromVolume(false); capabilities.setSupportStorageQos(false); capabilities.setSupportLiveExpandVolume(false); @@ -109,17 +135,18 @@ public void activate(BaseVolumeInfo v, HostInventory h, boolean shareable, Retur @Override public void deactivate(String installPath, String protocol, HostInventory h, Completion comp) { - + // not support inactive client yet + comp.success(); } @Override public void deactivate(String installPath, String protocol, ActiveVolumeClient client, Completion comp) { - + comp.success(); } @Override public void blacklist(String installPath, String protocol, HostInventory h, Completion comp) { - + comp.success(); } @Override @@ -135,7 +162,23 @@ public BaseVolumeInfo getActiveVolumeInfo(String activePath, HostInventory h, bo @Override public List getActiveClients(String installPath, String protocol) { if (VolumeProtocol.CBD.toString().equals(protocol)) { - return Collections.emptyList(); + GetVolumeClientsCmd cmd = new GetVolumeClientsCmd(); + cmd.setPath(installPath); + GetVolumeClientsRsp rsp = syncHttpCall(GET_VOLUME_CLIENTS_PATH, cmd, GetVolumeClientsRsp.class); + List clients = new ArrayList<>(); + + if (!rsp.isSuccess()) { + throw new OperationFailureException(operr(rsp.getError())); + } + + if (rsp.getClients() != null) { + for (ClientInfo clientInfo : rsp.getClients()) { + ActiveVolumeClient client = new ActiveVolumeClient(); + client.setManagerIp(clientInfo.getIp()); + clients.add(client); + } + } + return clients; } else { throw new OperationFailureException(operr("not supported protocol[%s] for active", protocol)); } @@ -146,13 +189,106 @@ public List getActiveVolumesLocation(HostInventory h) { return null; } + @Override + public void deployClient(HostInventory h, Completion comp) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("deploy-zbs-client-on-host-%s", h.getUuid())); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "deploy-client"; + + @Override + public void run(FlowTrigger trigger, Map data) { + KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + if (host == null) { + trigger.fail(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + return; + } + + DeployClientCmd cmd = new DeployClientCmd(); + cmd.setIp(h.getManagementIp()); + cmd.setPort(host.getPort()); + cmd.setUsername(host.getUsername()); + cmd.setPassword(host.getPassword()); + httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(trigger) { + @Override + public void success(DeployClientRsp returnValue) { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "update-host-client-dependency"; + + @Override + public void run(FlowTrigger trigger, Map data) { + UpdateHostDependencyCmd cmd = new UpdateHostDependencyCmd(); + cmd.updatePackages = "libcbd"; + cmd.zstackRepo = AnsibleGlobalProperty.ZSTACK_REPO; + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setCommand(cmd); + msg.setHostUuid(h.getUuid()); + msg.setPath(UPDATE_HOST_DEPENDENCY_PATH); + msg.setNoStatusCheck(true); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, msg.getHostUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + KVMHostAsyncHttpCallReply hreply = reply.castReply(); + UpdateHostDependencyRsp rsp = hreply.toResponse(UpdateHostDependencyRsp.class); + if (!rsp.isSuccess()) { + trigger.fail(operr(rsp.getError())); + return; + } + + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(comp) { + @Override + public void handle(Map data) { + comp.success(); + } + }); + + error(new FlowErrorHandler(comp) { + @Override + public void handle(ErrorCode errCode, Map data) { + comp.fail(errCode); + } + }); + } + }).start(); + } + @Override public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCompletion comp) { - reloadDbInfo(); + if (config == null) { + reloadDbInfo(); + } CreateVolumeCmd cmd = new CreateVolumeCmd(); - cmd.setLogicalPoolName(config.getLogicalPoolName()); - cmd.setLunName(ZbsHelper.zbsHeartbeatVolumeName); + cmd.setLogicalPool(config.getLogicalPoolName()); + cmd.setVolume(ZbsConstants.ZBS_HEARTBEAT_VOLUME_NAME); + cmd.setSize(ZbsConstants.ZBS_HEARTBEAT_VOLUME_SIZE_IN_GIGABYTE); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -160,7 +296,8 @@ public synchronized void activateHeartbeatVolume(HostInventory h, ReturnValueCom public void success(CreateVolumeRsp returnValue) { CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); to.setInstallPath(returnValue.installPath); - to.setHeartbeatRequiredSpace(SizeUnit.GIGABYTE.toByte(1)); + to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); + to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); comp.success(to); } @@ -173,12 +310,21 @@ public void fail(ErrorCode errorCode) { @Override public void deactivateHeartbeatVolume(HostInventory h, Completion comp) { - + comp.success(); } @Override public HeartbeatVolumeTO getHeartbeatVolumeActiveInfo(HostInventory h) { - return null; + if (config == null) { + reloadDbInfo(); + } + + CbdHeartbeatVolumeTO to = new CbdHeartbeatVolumeTO(); + to.setInstallPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); + to.setHeartbeatRequiredSpace(SizeUnit.MEGABYTE.toByte(1)); + to.setCoveringPaths(Collections.singletonList(config.getLogicalPoolName())); + + return to; } @Override @@ -188,49 +334,32 @@ public String getIdentity() { @Override public void connect(String cfg, String url, ReturnValueCompletion completion) { - changeStatus(PrimaryStorageStatus.Connecting); - - reloadDbInfo(); - if (config.getLogicalPoolName().contains("/")) { - throw new CloudRuntimeException(String.format("invalid logical pool name[%s]", config.getLogicalPoolName())); - } - - List mdsInfos = new ArrayList<>(); - for (String mdsUrl : config.getMdsUrls()) { - MdsUri uri = new MdsUri(mdsUrl); - MdsInfo mdsInfo = new MdsInfo(); - mdsInfo.setSshUsername(uri.getSshUsername()); - mdsInfo.setSshPassword(uri.getSshPassword()); - mdsInfo.setSshPort(uri.getSshPort()); - mdsInfo.setMdsAddr(uri.getHostname()); - mdsInfo.setMdsPort(uri.getMdsPort()); - mdsInfos.add(mdsInfo); - } - - AddonInfo info = new AddonInfo(); - info.setMdsInfos(mdsInfos); - final List mds = CollectionUtils.transformToList(info.getMdsInfos(), + AddonInfo newAddonInfo = new AddonInfo(); + Config current = JSONObjectUtil.toObject(cfg, Config.class); + List mdsInfos = parseMdsInfos(current.getMdsUrls()); + newAddonInfo.setMdsInfos(mdsInfos); + final List mdsList = CollectionUtils.transformToList(newAddonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); class Connector { private final ErrorCodeList errorCodes = new ErrorCodeList(); - private final Iterator it = mds.iterator(); + private final Iterator it = mdsList.iterator(); void connect(final FlowTrigger trigger) { if (!it.hasNext()) { - if (errorCodes.getCauses().size() == mds.size()) { + if (errorCodes.getCauses().size() == mdsList.size()) { if (errorCodes.getCauses().isEmpty()) { - trigger.fail(operr("unable to connect to the zbs primary storage[uuid:%s]," + - " failed to connect all zbs mds", self.getUuid())); + trigger.fail(operr("unable to connect to the ZBS primary storage[uuid:%s]," + + " failed to connect all MDS", self.getUuid())); } else { - trigger.fail(operr(errorCodes, "unable to connect to the zbs primary storage[uuid:%s]," + - " failed to connect all zbs mds", + trigger.fail(operr(errorCodes, "unable to connect to the ZBS primary storage[uuid:%s]," + + " failed to connect all MDS", self.getUuid())); } } else { ExternalPrimaryStorageVO vo = dbf.reload(self); if (vo == null) { - trigger.fail(operr("zbs primary storage[uuid:%s] may have been deleted", self.getUuid())); + trigger.fail(operr("ZBS primary storage[uuid:%s] may have been deleted", self.getUuid())); } else { self = vo; trigger.next(); @@ -266,6 +395,7 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { new Connector().connect(trigger); + addonInfo = newAddonInfo; } }); @@ -274,31 +404,76 @@ public void run(FlowTrigger trigger, Map data) { @Override public void run(FlowTrigger trigger, Map data) { - String mdsListenAddr = mds.stream().map(m -> m.getSelf().getMdsAddr() + ":" + m.getSelf().getMdsPort()).collect(Collectors.joining(",")); - List errors = new ArrayList<>(); - new While<>(mds).each((m, comp) -> { - GetFactsCmd cmd = new GetFactsCmd(); - cmd.setUuid(self.getUuid()); - cmd.setMdsAddr(m.getSelf().getMdsAddr()); - cmd.setMdsListenAddr(mdsListenAddr); - m.httpCall(GET_FACTS_PATH, cmd, GetFactsRsp.class, new ReturnValueCompletion(comp) { + httpCall(GET_FACTS_PATH, new GetFactsCmd(), GetFactsRsp.class, new ReturnValueCompletion(trigger) { + @Override + public void success(GetFactsRsp returnValue) { + ClusterInfo info = new ClusterInfo(); + info.setUuid(returnValue.getUuid()); + info.setVersion(returnValue.getVersion()); + newAddonInfo.setClusterInfo(info); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "deploy-client"; + + List refs = Q.New(PrimaryStorageClusterRefVO.class) + .eq(PrimaryStorageClusterRefVO_.primaryStorageUuid, self.getUuid()) + .list(); + + @Override + public boolean skip(Map data) { + return refs.isEmpty(); + } + + @Override + public void run(FlowTrigger trigger, Map data) { + List clusterUuids = refs.stream() + .map(PrimaryStorageClusterRefVO::getClusterUuid) + .collect(Collectors.toList()); + + List hosts = Q.New(HostVO.class) + .in(HostAO_.clusterUuid, clusterUuids) + .list(); + + new While<>(hosts).each((h, comp) -> { + KVMHostVO host = Q.New(KVMHostVO.class).eq(KVMHostVO_.uuid, h.getUuid()).find(); + if (host == null) { + comp.addError(operr("cannot found kvm host[uuid:%s], unable to deploy client", h.getUuid())); + comp.allDone(); + return; + } + + DeployClientCmd cmd = new DeployClientCmd(); + cmd.setIp(h.getManagementIp()); + cmd.setPort(host.getPort()); + cmd.setUsername(host.getUsername()); + cmd.setPassword(host.getPassword()); + httpCall(DEPLOY_CLIENT_PATH, cmd, DeployClientRsp.class, new ReturnValueCompletion(comp) { @Override - public void success(GetFactsRsp returnValue) { - m.getSelf().setMdsVersion(returnValue.version); + public void success(DeployClientRsp returnValue) { comp.done(); } @Override public void fail(ErrorCode errorCode) { - errors.add(errorCode); - comp.done(); + comp.addError(errorCode); + comp.allDone(); } }); }).run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { - if (!errors.isEmpty()) { - trigger.fail(errors.get(0)); + if (!errorCodeList.getCauses().isEmpty()) { + trigger.fail(errorCodeList.getCauses().get(0)); return; } @@ -311,16 +486,15 @@ public void done(ErrorCodeList errorCodeList) { done(new FlowDoneHandler(completion) { @Override public void handle(Map data) { - changeStatus(PrimaryStorageStatus.Connected); - addonInfo = info; - completion.success(JSONObjectUtil.rehashObject(info, LinkedHashMap.class)); + configUrl(self.getUuid()); + addonInfo = newAddonInfo; + completion.success(JSONObjectUtil.rehashObject(newAddonInfo, LinkedHashMap.class)); } }); error(new FlowErrorHandler(completion) { @Override public void handle(ErrorCode errCode, Map data) { - changeStatus(PrimaryStorageStatus.Disconnected); completion.fail(errCode); } }); @@ -332,28 +506,41 @@ public void handle(ErrorCode errCode, Map data) { public void ping(Completion completion) { reloadDbInfo(); - final List mds = CollectionUtils.transformToList(addonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); + if (addonInfo == null || addonInfo.getClusterInfo() == null) { + completion.fail(operr(String.format("addon info is null, primary storage[uuid:%s] is not ready, skip ping task", self.getUuid()))); + return; + } - new While<>(mds).each((m, comp) -> { - m.ping(new Completion(comp) { - @Override - public void success() { - m.getSelf().setMdsStatus(MdsStatus.Connected); - comp.done(); - } + final List mds = CollectionUtils.transformToList(addonInfo.getMdsInfos(), ZbsPrimaryStorageMdsBase::new); + new While<>(mds).each((m, comp) -> m.ping(addonInfo.getClusterInfo(), new Completion(comp) { + @Override + public void success() { + m.getSelf().setStatus(MdsStatus.Connected); + comp.done(); + } - @Override - public void fail(ErrorCode errorCode) { - m.getSelf().setMdsStatus(MdsStatus.Disconnected); - comp.done(); - } - }); - }).run(new WhileDoneCompletion(completion) { + @Override + public void fail(ErrorCode errorCode) { + m.getSelf().setStatus(MdsStatus.Disconnected); + comp.done(); + } + })).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) .update(); + + boolean isConnected = addonInfo.getMdsInfos().stream().anyMatch(mdsInfo -> MdsStatus.Connected.equals(mdsInfo.getStatus())); + if (!isConnected) { + String notConnectedIps = addonInfo.getMdsInfos().stream() + .filter(mdsInfo -> !MdsStatus.Connected.equals(mdsInfo.getStatus())) + .map(MdsInfo::getAddr) + .collect(Collectors.joining(", ")); + + completion.fail(operr("no MDS is Connected, the following MDS[%s] are not Connected.", notConnectedIps)); + return; + } completion.success(); } }); @@ -364,17 +551,25 @@ public void reportCapacity(ReturnValueCompletion comp) { reloadDbInfo(); GetCapacityCmd cmd = new GetCapacityCmd(); - cmd.setLogicalPoolName(config.getLogicalPoolName()); + cmd.setLogicalPool(config.getLogicalPoolName()); httpCall(GET_CAPACITY_PATH, cmd, GetCapacityRsp.class, new ReturnValueCompletion(comp) { @Override public void success(GetCapacityRsp returnValue) { + addonInfo.setLogicalPoolInfos(returnValue.getLogicalPoolInfos()); + SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) + .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) + .update(); + + List logicalPoolInfos = getSelfPools(); + long total = logicalPoolInfos.stream().mapToLong(LogicalPoolInfo::getCapacity).sum(); + long used = logicalPoolInfos.stream().mapToLong(LogicalPoolInfo::getUsedSize).sum(); + long avail = total != 0 ? total - used : 0; + StorageCapacity cap = new StorageCapacity(); - long total = returnValue.getCapacity(); - long avail = total != 0 ? total - returnValue.getUsedSize() : 0; - cap.setHealthy(StorageHealthy.Ok); cap.setTotalCapacity(total); cap.setAvailableCapacity(avail); + cap.setHealthy(StorageHealthy.Ok); comp.success(cap); } @@ -392,14 +587,31 @@ public void reportHealthy(ReturnValueCompletion comp) { @Override public void reportNodeHealthy(HostInventory host, ReturnValueCompletion comp) { - NodeHealthy healthy = new NodeHealthy(); + CheckHostStorageConnectionCmd cmd = new CheckHostStorageConnectionCmd(); + cmd.setHostUuid(host.getUuid()); + cmd.setPath(buildHeartbeatVolumePath(config.getLogicalPoolName())); + + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setCommand(cmd); + msg.setHostUuid(host.getUuid()); + msg.setPath(CHECK_HOST_STORAGE_CONNECTION_PATH); + msg.setNoStatusCheck(true); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, msg.getHostUuid()); + bus.send(msg, new CloudBusCallBack(comp) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + comp.fail(reply.getError()); + return; + } - Arrays.asList(VolumeProtocol.CBD).forEach(it -> { - // TODO: CHECK_HOST_STORAGE_CONNECTION_PATH - healthy.setHealthy(it, StorageHealthy.Ok); + KVMHostAsyncHttpCallReply hreply = reply.castReply(); + CheckHostStorageConnectionRsp rsp = hreply.toResponse(CheckHostStorageConnectionRsp.class); + NodeHealthy healthy = new NodeHealthy(); + healthy.setHealthy(VolumeProtocol.CBD, rsp.isSuccess() ? StorageHealthy.Ok : StorageHealthy.Failed); + comp.success(healthy); + } }); - - comp.success(healthy); } @Override @@ -409,19 +621,42 @@ public StorageCapabilities reportCapabilities() { @Override public String allocateSpace(AllocateSpaceSpec aspec) { - reloadDbInfo(); + if (config == null || addonInfo == null) { + reloadDbInfo(); + } + + // TODO allocate pool + LogicalPoolInfo logicalPoolInfo = allocateFreePool(aspec.getSize()); + if (logicalPoolInfo == null) { + throw new OperationFailureException(operr("no available logical pool with enough space[%d]", aspec.getSize())); + } return buildVolumePath("", config.getLogicalPoolName(), ""); } + private LogicalPoolInfo allocateFreePool(long size) { + List logicalPoolInfos = getSelfPools(); + return logicalPoolInfos.stream().filter(it -> it.getCapacity() - it.getUsedSize() > size) + .max(Comparator.comparingLong(it -> it.getCapacity() - it.getUsedSize())) + .orElse(null); + } + + private List getSelfPools() { + String configLogicalPoolName = config.getLogicalPoolName(); + List logicalPoolInfos = addonInfo.getLogicalPoolInfos(); + logicalPoolInfos.removeIf(it -> !configLogicalPoolName.equals(it.getLogicalPoolName())); + return logicalPoolInfos; + } + @Override public void createVolume(CreateVolumeSpec v, ReturnValueCompletion comp) { reloadDbInfo(); CreateVolumeCmd cmd = new CreateVolumeCmd(); - cmd.setLogicalPoolName(config.getLogicalPoolName()); - cmd.setLunName(v.getName()); - cmd.setSize((long)Math.ceil(SizeUnit.BYTE.toGigaByte((double)v.getSize()))); + cmd.setLogicalPool(config.getLogicalPoolName()); + cmd.setVolume(v.getName()); + cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); + cmd.setSize(alignSizeTo(v.getSize(), cmd.getUnit())); cmd.setSkipIfExisting(true); httpCall(CREATE_VOLUME_PATH, cmd, CreateVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -449,7 +684,7 @@ public void deleteVolume(String installPath, Completion comp) { @Override public void deleteVolumeAndSnapshot(String installPath, Completion comp) { - + doDeleteVolume(installPath, true, comp); } @Override @@ -472,10 +707,8 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { CloneVolumeCmd cmd = new CloneVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(srcInstallPath)); - cmd.setLunName(getLunNameFromPath(srcInstallPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(srcInstallPath)); - cmd.setDstLunName(dst.getName()); + cmd.setPath(srcInstallPath); + cmd.setDstVolume(dst.getName()); httpCall(CLONE_VOLUME_PATH, cmd, CloneVolumeRsp.class, new ReturnValueCompletion(trigger) { @Override @@ -484,6 +717,7 @@ public void success(CloneVolumeRsp returnValue) { stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); stats.setSize(returnValue.getSize()); stats.setActualSize(returnValue.getActualSize()); + stats.setParentUri(srcInstallPath); trigger.next(); } @@ -506,9 +740,9 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(stats.getInstallPath())); - cmd.setLunName(getLunNameFromPath(stats.getInstallPath())); - cmd.setSize(SizeUnit.BYTE.toGigaByte(dst.getSize())); + cmd.setPath(stats.getInstallPath()); + cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); + cmd.setSize(alignSizeTo(dst.getSize(), cmd.getUnit())); httpCall(EXPAND_VOLUME_PATH, cmd, ExpandVolumeRsp.class, new ReturnValueCompletion(trigger) { @Override @@ -545,12 +779,9 @@ public void handle(ErrorCode errCode, Map data) { @Override public void copyVolume(String srcInstallPath, CreateVolumeSpec dst, ReturnValueCompletion comp) { CopyCmd cmd = new CopyCmd(); - cmd.setPhysicalPoolName(getPhysicalPoolNameFromPath(srcInstallPath)); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(srcInstallPath)); - cmd.setLunName(getLunNameFromPath(srcInstallPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(srcInstallPath)); - cmd.setDstLunName(dst.getName()); - cmd.setDstLunSize(dst.getSize() / (1L << 30)); + cmd.setPath(srcInstallPath); + cmd.setDstVolume(dst.getName()); + cmd.setDstSize(dst.getSize() / (1L << 30)); httpCall(COPY_PATH, cmd, CopyRsp.class, new ReturnValueCompletion(comp) { @Override @@ -572,14 +803,32 @@ public void fail(ErrorCode errorCode) { @Override public void flattenVolume(String installPath, ReturnValueCompletion comp) { + FlattenVolumeCmd cmd = new FlattenVolumeCmd(); + cmd.setPath(installPath); + + httpCall(FLATTEN_VOLUME_PATH, cmd, FlattenVolumeRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(FlattenVolumeRsp returnValue) { + VolumeStats stats = new VolumeStats(); + stats.setInstallPath(installPath); + stats.setSize(returnValue.getSize()); + stats.setActualSize(returnValue.getActualSize()); + stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + stats.setParentUri(returnValue.getParentUri()); + comp.success(stats); + } + @Override + public void fail(ErrorCode errorCode) { + comp.fail(errorCode); + } + }); } @Override public void stats(String installPath, ReturnValueCompletion comp) { QueryVolumeCmd cmd = new QueryVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); + cmd.setPath(installPath); httpCall(QUERY_VOLUME_PATH, cmd, QueryVolumeRsp.class, new ReturnValueCompletion(comp) { @Override @@ -589,6 +838,7 @@ public void success(QueryVolumeRsp returnValue) { stats.setSize(returnValue.getSize()); stats.setActualSize(returnValue.getActualSize()); stats.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + stats.setParentUri(returnValue.getParentUri()); comp.success(stats); } @@ -601,15 +851,36 @@ public void fail(ErrorCode errorCode) { @Override public void batchStats(Collection installPath, ReturnValueCompletion> comp) { + BatchQueryVolumeCmd cmd = new BatchQueryVolumeCmd(); + cmd.setInstallPaths(installPath); + httpCall(BATCH_QUERY_VOLUME_PATH, cmd, BatchQueryVolumeRsp.class, new ReturnValueCompletion(comp) { + @Override + public void success(BatchQueryVolumeRsp returnValue) { + List stats = returnValue.getVolumes().entrySet().stream().map(v -> { + VolumeStats s = new VolumeStats(); + s.setInstallPath(v.getKey()); + s.setSize(v.getValue().get("length")); + s.setActualSize(v.getValue().get("usedSize")); + s.setFormat(VolumeConstant.VOLUME_FORMAT_RAW); + return s; + }).collect(Collectors.toList()); + comp.success(stats); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.fail(errorCode); + } + }); } @Override public void expandVolume(String installPath, long size, ReturnValueCompletion comp) { ExpandVolumeCmd cmd = new ExpandVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); - cmd.setSize(SizeUnit.BYTE.toGigaByte(size)); + cmd.setPath(installPath); + cmd.setUnit(getSizeUnit(addonInfo.getClusterInfo().getVersion())); + cmd.setSize(alignSizeTo(size, cmd.getUnit())); httpCall(EXPAND_VOLUME_PATH, cmd, ExpandVolumeRsp.class, new ReturnValueCompletion(comp) { @Override @@ -629,12 +900,12 @@ public void fail(ErrorCode errorCode) { @Override public void setVolumeQos(BaseVolumeInfo v, Completion comp) { - + comp.success(); } @Override public void deleteVolumeQos(BaseVolumeInfo v, Completion comp) { - + comp.success(); } @Override @@ -653,7 +924,8 @@ public void export(ExportSpec espec, VolumeProtocol protocol, ReturnValueComplet } CbdToNbdCmd cmd = new CbdToNbdCmd(); - cmd.setInstallPath(espec.getInstallPath()); + cmd.setPath(espec.getInstallPath()); + cmd.setPortRange(HostGlobalConfig.NBD_PORT_RANGE.value(String.class)); httpCall(CBD_TO_NBD_PATH, cmd, CbdToNbdRsp.class, new ReturnValueCompletion(comp) { @Override @@ -684,7 +956,7 @@ public void unexport(ExportSpec espec, RemoteTarget remoteTarget, VolumeProtocol } if (remoteTarget == null || remoteTarget.getResourceURI() == null) { - logger.debug("remote target or the uri does not exist"); + logger.debug("remote target or the URI does not exist"); comp.success(); return; } @@ -707,16 +979,15 @@ public void fail(ErrorCode errorCode) { } }).setTargetMds(uri.getHost()).call(); } catch (URISyntaxException e) { - comp.fail(operr("Invalid URI syntax: %s", e.getMessage())); + comp.fail(operr("invalid URI syntax: %s", e.getMessage())); } } @Override public void createSnapshot(CreateVolumeSnapshotSpec spec, ReturnValueCompletion comp) { CreateSnapshotCmd cmd = new CreateSnapshotCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(spec.getVolumeInstallPath())); - cmd.setLunName(getLunNameFromPath(spec.getVolumeInstallPath())); - cmd.setSnapshotName(spec.getName()); + cmd.setPath(spec.getVolumeInstallPath()); + cmd.setSnapshot(spec.getName()); cmd.setSkipOnExisting(true); httpCall(CREATE_SNAPSHOT_PATH, cmd, CreateSnapshotRsp.class, new ReturnValueCompletion(comp) { @@ -738,9 +1009,7 @@ public void fail(ErrorCode errorCode) { @Override public void deleteSnapshot(String installPath, Completion comp) { DeleteSnapshotCmd cmd = new DeleteSnapshotCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(installPath)); + cmd.setPath(installPath); httpCall(DELETE_SNAPSHOT_PATH, cmd, DeleteSnapshotRsp.class, new ReturnValueCompletion(comp) { @Override @@ -757,15 +1026,13 @@ public void fail(ErrorCode errorCode) { @Override public void expungeSnapshot(String installPath, Completion comp) { - + comp.success(); } @Override public void revertVolumeSnapshot(String snapshotInstallPath, ReturnValueCompletion comp) { RollbackSnapshotCmd cmd = new RollbackSnapshotCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(snapshotInstallPath)); - cmd.setLunName(getLunNameFromPath(snapshotInstallPath)); - cmd.setSnapshotName(getSnapshotNameFromPath(snapshotInstallPath)); + cmd.setPath(snapshotInstallPath); httpCall(ROLLBACK_SNAPSHOT_PATH, cmd, RollbackSnapshotRsp.class, new ReturnValueCompletion(comp) { @Override @@ -787,34 +1054,58 @@ public void fail(ErrorCode errorCode) { @Override public void validateConfig(String config) { + Config old = JSONObjectUtil.toObject(self.getConfig(), Config.class); + Config current = JSONObjectUtil.toObject(config, Config.class); - } + if (current.getLogicalPoolName().contains("/")) { + throw new CloudRuntimeException(String.format("invalid logical pool name[%s]", current.getLogicalPoolName())); + } - @Override - public void setTrashExpireTime(int timeInSeconds, Completion completion) { + if (current.getMdsUrls().isEmpty()) { + throw new OperationFailureException(operr("ensure at least one MDS is configured")); + } - } + List newMdsInfos = parseMdsInfos(current.getMdsUrls()); + List duplicateMdsInfos = newMdsInfos.stream().collect(Collectors.groupingBy(MdsInfo::getAddr)) + .values().stream().filter(addr -> addr.size() > 1).flatMap(List::stream).collect(Collectors.toList()); + if (!duplicateMdsInfos.isEmpty()) { + throw new OperationFailureException(operr("do not allow to add duplicate MDS[%s]", + duplicateMdsInfos.stream().map(MdsInfo::getAddr).distinct().collect(Collectors.joining(", ")) + )); + } - public String getLogicalPoolNameFromPath(String url) { - return url.split("/")[1]; + List oldMdsInfos = parseMdsInfos(old.getMdsUrls()); + List changedMdsInfos = newMdsInfos.stream().filter(n -> oldMdsInfos.stream().noneMatch(o -> o.equals(n))).collect(Collectors.toList()); + if (!changedMdsInfos.isEmpty() && !CoreGlobalProperty.UNIT_TEST_ON) { + List mdsList = CollectionUtils.transformToList(changedMdsInfos, ZbsPrimaryStorageMdsBase::new); + for (ZbsPrimaryStorageMdsBase base : mdsList) { + base.checkSshAndTools(); + base.checkStorageHealth(); + } + } } - public String getPhysicalPoolNameFromPath(String url) { - return url.split("/")[0].split(":")[1]; + @Override + public void setTrashExpireTime(int timeInSeconds, Completion completion) { + completion.success(); } - public String getLunNameFromPath(String url) { - return url.split("/")[2].split("@")[0]; + @Override + public void onFirstAdditionConfigure(Completion completion) { + ResourceConfig rc = rcf.getResourceConfig(VolumeGlobalConfig.VOLUME_PHYSICAL_BLOCK_SIZE.getIdentity()); + rc.updateValue(self.getUuid(), ZbsConstants.VOLUME_PHYSICAL_BLOCK_SIZE); + completion.success(); } - public String getSnapshotNameFromPath(String url) { - return url.split("/")[2].split("@")[1]; + @Override + public long alignSize(long size) { + String unit = getSizeUnit(addonInfo.getClusterInfo().getVersion()); + return convertSizeToByte(alignSizeTo(size, unit), unit); } public void doDeleteVolume(String installPath, Boolean force, Completion comp) { DeleteVolumeCmd cmd = new DeleteVolumeCmd(); - cmd.setLogicalPoolName(getLogicalPoolNameFromPath(installPath)); - cmd.setLunName(getLunNameFromPath(installPath)); + cmd.setPath(installPath); cmd.setForce(force); httpCall(DELETE_VOLUME_PATH, cmd, DeleteVolumeRsp.class, new ReturnValueCompletion(comp) { @@ -830,43 +1121,38 @@ public void fail(ErrorCode errorCode) { }); } - public static String buildVolumePath(String physicalPoolName, String logicalPoolName, String volId) { - String base = volId.replace("-", ""); - return String.format(ZBS_CBD_LUN_PATH_FORMAT, physicalPoolName, logicalPoolName, base); - } - private void reloadDbInfo() { self = dbf.reload(self); addonInfo = StringUtils.isEmpty(self.getAddonInfo()) ? new AddonInfo() : JSONObjectUtil.toObject(self.getAddonInfo(), AddonInfo.class); config = StringUtils.isEmpty(self.getConfig()) ? new Config() : JSONObjectUtil.toObject(self.getConfig(), Config.class); } - public void changeStatus(PrimaryStorageStatus status) { - String uuid = self.getUuid(); - self = dbf.reload(self); - if (self == null) { - throw new OperationFailureException(operr( - "cannot update status of the zbs primary storage[uuid:%s], it has been deleted." + - "This error can be ignored", uuid - )); - } + private List parseMdsInfos(List mdsUrls) { + return mdsUrls.stream().map(mdsUrl -> { + MdsUri uri = new MdsUri(mdsUrl); + MdsInfo mdsInfo = new MdsInfo(); + mdsInfo.setUsername(uri.getUsername()); + mdsInfo.setPassword(uri.getPassword()); + mdsInfo.setPort(uri.getSshPort()); + mdsInfo.setAddr(uri.getHostname()); + return mdsInfo; + }).collect(Collectors.toList()); + } - if (self.getStatus() == status) { - return; - } + protected T syncHttpCall(final String path, final AgentCommand cmd, final Class retClass) { + return httpCall(path, cmd, retClass, null, 0, true); + } - PrimaryStorageStatus oldStatus = self.getStatus(); - self.setStatus(status); - self = dbf.updateAndRefresh(self); - logger.debug(String.format("zbs primary storage[uuid:%s] changed status from %s to %s", self.getUuid(), oldStatus, status)); + protected T httpCall(final String path, final AgentCommand cmd, final Class retClass, TimeUnit unit, long timeout, boolean sync) { + return new HttpCaller<>(path, cmd, retClass, null, unit, timeout, sync).syncCall(); } protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback) { - httpCall(path, cmd, retClass, callback, null, 0); + httpCall(path, cmd, retClass, callback, null, 0, false); } - protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback, TimeUnit unit, long timeout) { - new HttpCaller<>(path, cmd, retClass, callback, unit, timeout).call(); + protected void httpCall(final String path, final AgentCommand cmd, final Class retClass, final ReturnValueCompletion callback, TimeUnit unit, long timeout, boolean sync) { + new HttpCaller<>(path, cmd, retClass, callback, unit, timeout, sync).call(); } public class HttpCaller { @@ -880,14 +1166,15 @@ public class HttpCaller { private final ReturnValueCompletion callback; private final TimeUnit unit; private final long timeout; + private final boolean sync; private boolean tryNext = false; public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueCompletion callback) { - this(path, cmd, retClass, callback, null, 0); + this(path, cmd, retClass, callback, null, 0, false); } - public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueCompletion callback, TimeUnit unit, long timeout) { + public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueCompletion callback, TimeUnit unit, long timeout, boolean sync) { this.path = path; this.cmd = cmd; this.retClass = retClass; @@ -895,6 +1182,7 @@ public HttpCaller(String path, AgentCommand cmd, Class retClass, ReturnValueC this.unit = unit; this.timeout = timeout; this.mdsInfos = prepareMds(); + this.sync = sync; } public void call() { @@ -903,13 +1191,19 @@ public void call() { doCall(); } + public T syncCall() { + prepareMdsIterator(); + prepareCmd(); + return doSyncCall(); + } + HttpCaller setTargetMds(String mdsAddr) { - logger.debug(String.format("target mds[ip:%s]", mdsAddr)); + logger.debug(String.format("target MDS[%s]", mdsAddr)); - mdsInfos.removeIf(it -> !it.getMdsAddr().equals(mdsAddr)); + mdsInfos.removeIf(it -> !it.getAddr().equals(mdsAddr)); if (mdsInfos.isEmpty()) { throw new OperationFailureException(operr( - "not found mds[ip:%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) + "not found MDS[%s] of zbs primary storage[uuid:%s] node", mdsAddr, self.getUuid()) ); } @@ -925,10 +1219,10 @@ private List prepareMds() { Collections.shuffle(mds); - mds.removeIf(it -> it.getMdsStatus() != MdsStatus.Connected); + mds.removeIf(it -> it.getStatus() != MdsStatus.Connected); if (mds.isEmpty()) { throw new OperationFailureException(operr( - "all zbs mds of primary storage[uuid:%s] are not in Connected state", self.getUuid()) + "all MDS of ZBS primary storage[uuid:%s] are not in Connected state", self.getUuid()) ); } @@ -939,14 +1233,37 @@ private void prepareMdsIterator() { it = mdsInfos.stream().map(ZbsPrimaryStorageMdsBase::new).collect(Collectors.toList()).iterator(); } + private T doSyncCall() { + if (!it.hasNext()) { + throw new OperationFailureException(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + } + + ZbsPrimaryStorageMdsBase base = it.next(); + cmd.setAddr(base.getSelf().getAddr()); + + T ret = base.syncCall(path, cmd, retClass, unit, timeout); + if (!ret.isSuccess()) { + logger.warn(String.format("failed to execute http call[%s] on MDS[%s], error is: %s", + path, base.getSelf().getAddr(), JSONObjectUtil.toJsonString(ret.getError()))); + errorCodes.getCauses().add(operr(ret.getError())); + if (tryNext) { + return doSyncCall(); + } else { + throw new OperationFailureException(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); + } + } + + return ret; + } + private void doCall() { if (!it.hasNext()) { - callback.fail(operr(errorCodes, "all mds cannot execute http call[%s]", path)); + callback.fail(operr(errorCodes, "all MDS cannot execute http call[%s]", path)); return; } ZbsPrimaryStorageMdsBase base = it.next(); - cmd.setMdsAddr(base.getSelf().getMdsAddr()); + cmd.setAddr(base.getSelf().getAddr()); ReturnValueCompletion completion = new ReturnValueCompletion(callback) { @Override @@ -957,8 +1274,8 @@ public void success(T ret) { @Override public void fail(ErrorCode errorCode) { if (!errorCode.isError(SysErrors.OPERATION_ERROR) && !errorCode.isError(SysErrors.TIMEOUT)) { - logger.warn(String.format("mds[addr:%s] failed to execute http call[%s], error is: %s", - base.getSelf().getMdsAddr(), path, JSONObjectUtil.toJsonString(errorCode))); + logger.warn(String.format("failed to execute http call[%s] on MDS[%s], error is: %s", + path, base.getSelf().getAddr(), JSONObjectUtil.toJsonString(errorCode))); errorCodes.getCauses().add(errorCode); doCall(); return; @@ -1059,6 +1376,7 @@ public static class DeleteSnapshotRsp extends AgentResponse { public static class QueryVolumeRsp extends AgentResponse { private long size; private long actualSize; + private String parentUri; public long getSize() { return size; @@ -1075,6 +1393,30 @@ public long getActualSize() { public void setActualSize(long actualSize) { this.actualSize = actualSize; } + + public String getParentUri() { + return parentUri; + } + + public void setParentUri(String parentUri) { + this.parentUri = parentUri; + } + } + + public static class FlattenVolumeRsp extends QueryVolumeRsp { + + } + + public static class BatchQueryVolumeRsp extends AgentResponse { + private Map> volumes; + + public Map> getVolumes() { + return volumes; + } + + public void setVolumes(Map> volumes) { + this.volumes = volumes; + } } public static class CbdToNbdRsp extends AgentResponse { @@ -1192,216 +1534,264 @@ public void setActualSize(long actualSize) { } public static class GetCapacityRsp extends AgentResponse { - private long capacity; - private long usedSize; + private List logicalPoolInfos; - public long getCapacity() { - return capacity; + public List getLogicalPoolInfos() { + return logicalPoolInfos; } - public void setCapacity(long capacity) { - this.capacity = capacity; + public void setLogicalPoolInfos(List logicalPoolInfos) { + this.logicalPoolInfos = logicalPoolInfos; } + } - public long getUsedSize() { - return usedSize; - } + public static class DeployClientRsp extends AgentResponse { - public void setUsedSize(long usedSize) { - this.usedSize = usedSize; - } } - public static class GetFactsRsp extends AgentResponse { - private String version; + public static class ExpandVolumeCmd extends SizeCmd { + private String path; - public String getVersion() { - return version; + public String getPath() { + return path; } - public void setVersion(String version) { - this.version = version; + public void setPath(String path) { + this.path = path; } } - public static class ExpandVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private long size; + public static class CopyCmd extends AgentCommand implements HasThreadContext { + private String path; + private String dstVolume; + private long dstSize; - public String getLogicalPoolName() { - return logicalPoolName; + public String getPath() { + return path; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPath(String path) { + this.path = path; } - public String getLunName() { - return lunName; + public String getDstVolume() { + return dstVolume; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setDstVolume(String dstVolume) { + this.dstVolume = dstVolume; } - public long getSize() { - return size; + public long getDstSize() { + return dstSize; } - public void setSize(long size) { - this.size = size; + public void setDstSize(long dstSize) { + this.dstSize = dstSize; } } - public static class CopyCmd extends AgentCommand implements HasThreadContext { - private String physicalPoolName; - private String logicalPoolName; - private String lunName; - private String snapshotName; - private String dstLunName; - private long dstLunSize; + public static class RollbackSnapshotCmd extends AgentCommand { + private String path; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + } + + public static class DeleteSnapshotCmd extends AgentCommand { + private String path; - public String getPhysicalPoolName() { - return physicalPoolName; + public String getPath() { + return path; } - public void setPhysicalPoolName(String physicalPoolName) { - this.physicalPoolName = physicalPoolName; + public void setPath(String path) { + this.path = path; } + } - public String getLogicalPoolName() { - return logicalPoolName; + public static class QueryVolumeCmd extends AgentCommand { + private String path; + + public String getPath() { + return path; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPath(String path) { + this.path = path; } + } - public String getLunName() { - return lunName; + public static class FlattenVolumeCmd extends AgentCommand { + private String path; + + public String getPath() { + return path; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPath(String path) { + this.path = path; } + } - public String getSnapshotName() { - return snapshotName; + public static class BatchQueryVolumeCmd extends AgentCommand { + private Collection installPaths; + + public Collection getInstallPaths() { + return installPaths; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setInstallPaths(Collection installPaths) { + this.installPaths = installPaths; } + } - public String getDstLunName() { - return dstLunName; + public static class CleanNbdCmd extends AgentCommand { + private String nbdAddr; + private int port; + + public String getNbdAddr() { + return nbdAddr; } - public void setDstLunName(String dstLunName) { - this.dstLunName = dstLunName; + public void setNbdAddr(String nbdAddr) { + this.nbdAddr = nbdAddr; } - public long getDstLunSize() { - return dstLunSize; + public int getPort() { + return port; } - public void setDstLunSize(long dstLunSize) { - this.dstLunSize = dstLunSize; + public void setPort(int port) { + this.port = port; } } - public static class RollbackSnapshotCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; + public static class CbdToNbdCmd extends AgentCommand { + private String path; + private String portRange; - public String getLogicalPoolName() { - return logicalPoolName; + public String getPath() { + return path; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPath(String path) { + this.path = path; } - public String getLunName() { - return lunName; + public String getPortRange() { + return portRange; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPortRange(String portRange) { + this.portRange = portRange; } + } - public String getSnapshotName() { - return snapshotName; + public static class CloneVolumeCmd extends AgentCommand { + private String path; + private String dstVolume; + + public String getPath() { + return path; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setPath(String path) { + this.path = path; + } + + public String getDstVolume() { + return dstVolume; + } + + public void setDstVolume(String dstVolume) { + this.dstVolume = dstVolume; } } - public static class DeleteSnapshotCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; + public static class CreateSnapshotCmd extends AgentCommand { + private String path; + private String snapshot; + private boolean skipOnExisting; - public String getLogicalPoolName() { - return logicalPoolName; + public String getPath() { + return path; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPath(String path) { + this.path = path; } - public String getLunName() { - return lunName; + public String getSnapshot() { + return snapshot; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setSnapshot(String snapshot) { + this.snapshot = snapshot; } - public String getSnapshotName() { - return snapshotName; + public boolean isSkipOnExisting() { + return skipOnExisting; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setSkipOnExisting(boolean skipOnExisting) { + this.skipOnExisting = skipOnExisting; } } - public static class QueryVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; + public static class DeleteVolumeCmd extends AgentCommand { + private String path; + private boolean force; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } - public String getLogicalPoolName() { - return logicalPoolName; + public boolean isForce() { + return force; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setForce(boolean force) { + this.force = force; } + } + + public static class GetVolumeClientsCmd extends AgentCommand { + private String path; - public String getLunName() { - return lunName; + public String getPath() { + return path; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setPath(String path) { + this.path = path; } } - public static class CleanNbdCmd extends AgentCommand { - private String nbdAddr; + public static class ClientInfo { + public ClientInfo(String ip, int port) { + this.ip = ip; + this.port = port; + } + + private String ip; private int port; - public String getNbdAddr() { - return nbdAddr; + public String getIp() { + return ip; } - public void setNbdAddr(String nbdAddr) { - this.nbdAddr = nbdAddr; + public void setIp(String ip) { + this.ip = ip; } public int getPort() { @@ -1413,187 +1803,174 @@ public void setPort(int port) { } } - public static class CbdToNbdCmd extends AgentCommand { - private String installPath; + public static class GetVolumeClientsRsp extends AgentResponse { + private List clients; - public String getInstallPath() { - return installPath; + public List getClients() { + return clients; } - public void setInstallPath(String installPath) { - this.installPath = installPath; + public void setClients(List clients) { + this.clients = clients; } } - public static class CloneVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; - private String dstLunName; + public static class SizeCmd extends AgentCommand { + private long size; + private String unit; - public String getLogicalPoolName() { - return logicalPoolName; + public long getSize() { + return size; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setSize(long size) { + this.size = size; } - public String getLunName() { - return lunName; + public String getUnit() { + return unit; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setUnit(String unit) { + this.unit = unit; } + } - public String getSnapshotName() { - return snapshotName; - } + public static class CreateVolumeCmd extends SizeCmd { + private String logicalPool; + private String volume; + private boolean skipIfExisting; - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public String getLogicalPool() { + return logicalPool; } - public String getDstLunName() { - return dstLunName; + public void setLogicalPool(String logicalPool) { + this.logicalPool = logicalPool; } - public void setDstLunName(String dstLunName) { - this.dstLunName = dstLunName; + public String getVolume() { + return volume; } - } - - public static class CreateSnapshotCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private String snapshotName; - private boolean skipOnExisting; - public String getLogicalPoolName() { - return logicalPoolName; + public void setVolume(String volume) { + this.volume = volume; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public boolean isSkipIfExisting() { + return skipIfExisting; } - public String getLunName() { - return lunName; + public void setSkipIfExisting(boolean skipIfExisting) { + this.skipIfExisting = skipIfExisting; } + } - public void setLunName(String lunName) { - this.lunName = lunName; - } + public static class GetCapacityCmd extends AgentCommand { + private String logicalPool; - public String getSnapshotName() { - return snapshotName; + public String getLogicalPool() { + return logicalPool; } - public void setSnapshotName(String snapshotName) { - this.snapshotName = snapshotName; + public void setLogicalPool(String logicalPool) { + this.logicalPool = logicalPool; } + } - public boolean isSkipOnExisting() { - return skipOnExisting; - } + public static class DeployClientCmd extends AgentCommand { + private String ip; + private Integer port; + private String username; + private String password; - public void setSkipOnExisting(boolean skipOnExisting) { - this.skipOnExisting = skipOnExisting; + public String getIp() { + return ip; } - } - public static class DeleteVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private boolean force; + public void setIp(String ip) { + this.ip = ip; + } - public String getLogicalPoolName() { - return logicalPoolName; + public Integer getPort() { + return port; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPort(Integer port) { + this.port = port; } - public String getLunName() { - return lunName; + public String getUsername() { + return username; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setUsername(String username) { + this.username = username; } - public boolean isForce() { - return force; + public String getPassword() { + return password; } - public void setForce(boolean force) { - this.force = force; + public void setPassword(String password) { + this.password = password; } } - public static class CreateVolumeCmd extends AgentCommand { - private String logicalPoolName; - private String lunName; - private long size = 1L; - private boolean skipIfExisting; + public static class GetFactsRsp extends AgentResponse { + private String uuid; + private String version; - public String getLogicalPoolName() { - return logicalPoolName; + public String getUuid() { + return uuid; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setUuid(String uuid) { + this.uuid = uuid; } - public String getLunName() { - return lunName; + public String getVersion() { + return version; } - public void setLunName(String lunName) { - this.lunName = lunName; + public void setVersion(String version) { + this.version = version; } + } - public long getSize() { - return size; - } + public static class GetFactsCmd extends AgentCommand { + } - public void setSize(long size) { - this.size = size; - } + public static class CheckHostStorageConnectionCmd extends AgentCommand { + public String hostUuid; + private String path; - public boolean isSkipIfExisting() { - return skipIfExisting; + public String getHostUuid() { + return hostUuid; } - public void setSkipIfExisting(boolean skipIfExisting) { - this.skipIfExisting = skipIfExisting; + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; } - } - - public static class GetCapacityCmd extends AgentCommand { - private String logicalPoolName; - public String getLogicalPoolName() { - return logicalPoolName; + public String getPath() { + return path; } - public void setLogicalPoolName(String logicalPoolName) { - this.logicalPoolName = logicalPoolName; + public void setPath(String path) { + this.path = path; } } - public static class GetFactsCmd extends AgentCommand { - private String mdsListenAddr; + public static class CheckHostStorageConnectionRsp extends AgentResponse { + } - public String getMdsListenAddr() { - return mdsListenAddr; - } + public static class UpdateHostDependencyCmd extends AgentCommand { + public String updatePackages; + public String zstackRepo; + } - public void setMdsListenAddr(String mdsListenAddr) { - this.mdsListenAddr = mdsListenAddr; - } + public static class UpdateHostDependencyRsp extends AgentResponse { } public static class AgentResponse extends ZbsMdsBase.AgentResponse { @@ -1604,5 +1981,6 @@ public static class AgentCommand extends ZbsMdsBase.AgentCommand { public ZbsStorageController(ExternalPrimaryStorageVO self) { this.self = self; + this.reloadDbInfo(); } } diff --git a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java index 5f0421053c4..df9fb479a2c 100644 --- a/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java +++ b/plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageFactory.java @@ -1,23 +1,45 @@ package org.zstack.storage.zbs; -import org.zstack.cbd.CbdConstants; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.db.Q; +import org.zstack.core.trash.StorageTrash; import org.zstack.externalStorage.primary.ExternalStorageFencerType; +import org.zstack.header.core.Completion; +import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.ReturnValueCompletion; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageSvcBuilder; -import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; -import org.zstack.header.storage.addon.primary.PrimaryStorageControllerSvc; -import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.*; +import org.zstack.header.storage.primary.DeleteVolumeBitsOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.snapshot.VolumeSnapshotAfterDeleteExtensionPoint; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.volume.VolumeProtocol; +import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.zstack.storage.zbs.ZbsHelper.*; + +import static org.zstack.core.Platform.operr; /** * @author Xingwei Yu * @date 2024/3/21 11:56 */ -public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder { +public class ZbsStorageFactory implements ExternalPrimaryStorageSvcBuilder, BackupStorageSelector { + private static CLogger logger = Utils.getLogger(ZbsStorageFactory.class); public static final ExternalStorageFencerType fencerType = new ExternalStorageFencerType(ZbsConstants.IDENTITY, VolumeProtocol.CBD.toString()); + private List preferBackupStorageTypes; + @Override public PrimaryStorageControllerSvc buildControllerSvc(ExternalPrimaryStorageVO vo) { return new ZbsStorageController(vo); @@ -30,7 +52,16 @@ public PrimaryStorageNodeSvc buildNodeSvc(ExternalPrimaryStorageVO vo) { @Override public void discover(String url, String config, ReturnValueCompletion completion) { + completion.fail(operr("zbs not support discover yet")); + } + public void setPreferBackupStorageTypes(List preferBackupStorageTypes) { + this.preferBackupStorageTypes = preferBackupStorageTypes; + } + + @Override + public List getPreferBackupStorageTypes() { + return preferBackupStorageTypes; } @Override diff --git a/pom.xml b/pom.xml index fdd9ff9a347..7eb089349a4 100755 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 3.6.1 1.8 5.2.25.RELEASE - 5.7.11 + 5.7.13 5.3.26.Final 1.8.9 1.10 @@ -23,7 +23,7 @@ 4.0.0 org.zstack zstack - 5.2.0 + 5.4.0 pom zstack @@ -50,6 +50,7 @@ longjob resourceconfig plugin/iscsi + abstraction @@ -353,7 +354,7 @@ commons-beanutils commons-beanutils - 1.9.4 + 1.11.0 org.javassist @@ -454,12 +455,12 @@ io.prometheus simpleclient - 0.0.26 + 0.16.0 io.prometheus simpleclient_httpserver - 0.0.26 + 0.16.0 org.influxdb @@ -474,7 +475,7 @@ org.projectlombok lombok - 1.16.6 + 1.18.24 net.bytebuddy @@ -541,6 +542,13 @@ + + + maven-releases + http://maven.nexus.zstack.io/repository/maven-zstack-open-source/ + + + premium diff --git a/portal/pom.xml b/portal/pom.xml index 39b84c0e824..8a8775d4c5c 100755 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. portal diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java index b7addac8b80..7409fbc5df1 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMediatorImpl.java @@ -9,12 +9,42 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.thread.SyncTask; import org.zstack.core.thread.ThreadFacade; +import org.zstack.core.thread.ThreadPool; +import org.zstack.core.thread.ThreadPoolRegisterExtensionPoint; import org.zstack.header.AbstractService; -import org.zstack.header.apimediator.*; +import org.zstack.header.apimediator.APIIsReadyToGoMsg; +import org.zstack.header.apimediator.APIIsReadyToGoReply; +import org.zstack.header.apimediator.ApiMediatorConstant; +import org.zstack.header.apimediator.ApiMessageInterceptionException; +import org.zstack.header.apimediator.ApiWorkerThreadPoolStrategy; +import org.zstack.header.apimediator.GlobalApiMessageInterceptor; +import org.zstack.header.apimediator.PortalErrors; +import org.zstack.header.apimediator.StopRoutingException; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.SysErrors; -import org.zstack.header.managementnode.*; -import org.zstack.header.message.*; +import org.zstack.header.managementnode.APIGetCurrentTimeMsg; +import org.zstack.header.managementnode.APIGetCurrentTimeReply; +import org.zstack.header.managementnode.APIGetManagementNodeArchMsg; +import org.zstack.header.managementnode.APIGetManagementNodeArchReply; +import org.zstack.header.managementnode.APIGetManagementNodeOSMsg; +import org.zstack.header.managementnode.APIGetManagementNodeOSReply; +import org.zstack.header.managementnode.APIGetPlatformTimeZoneMsg; +import org.zstack.header.managementnode.APIGetPlatformTimeZoneReply; +import org.zstack.header.managementnode.APIGetSupportAPIsMsg; +import org.zstack.header.managementnode.APIGetSupportAPIsReply; +import org.zstack.header.managementnode.APIGetVersionMsg; +import org.zstack.header.managementnode.APIGetVersionReply; +import org.zstack.header.managementnode.APIManagementNodeMessage; +import org.zstack.header.managementnode.IsManagementNodeReadyMsg; +import org.zstack.header.managementnode.IsManagementNodeReadyReply; +import org.zstack.header.managementnode.ManagementNodeConstant; +import org.zstack.header.message.APICreateMessage; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIReply; +import org.zstack.header.message.APISyncCallMessage; +import org.zstack.header.message.Message; +import org.zstack.header.message.MessageReply; import org.zstack.header.rest.RestAPIExtensionPoint; import org.zstack.utils.StringDSL; import org.zstack.utils.Utils; @@ -23,6 +53,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,7 +63,10 @@ import static org.zstack.utils.CollectionDSL.map; -public class ApiMediatorImpl extends AbstractService implements ApiMediator, GlobalApiMessageInterceptor { +public class ApiMediatorImpl extends AbstractService implements + ApiMediator, + ThreadPoolRegisterExtensionPoint, + GlobalApiMessageInterceptor { private static final CLogger logger = Utils.getLogger(ApiMediator.class); @Autowired @@ -45,11 +79,19 @@ public class ApiMediatorImpl extends AbstractService implements ApiMediator, Glo private PluginRegistry pluginRgty; private List apiExts = new ArrayList<>(); + private final String API_WORKER_SYNC_SIGNATURE = "api.worker"; + + private final String ASYNC_API_WORKER_SYNC_SIGNATURE = "async.api.worker"; + + private final String MANAGEMENT_API_WORKER_SYNC_SIGNATURE = "management.api.worker"; private ApiMessageProcessor processor; private List serviceConfigFolders; private int apiWorkerNum = 5; + private int asyncApiWorkerNum = 5; + private int managementApiWorkerNum = 5; + private ApiWorkerThreadPoolStrategy threadPoolStrategy = ApiWorkerThreadPoolStrategy.ISOLATED; private void dispatchMessage(APIMessage msg) { ApiMessageDescriptor desc = processor.getApiMessageDescriptor(msg); @@ -103,10 +145,33 @@ private void dispatchMessage(APIMessage msg) { @Override public void handleMessage(final Message msg) { apiExts.forEach(e -> e.afterAPIRequest(msg)); + + if (threadPoolStrategy == ApiWorkerThreadPoolStrategy.ISOLATED) { + if (msg instanceof APIManagementNodeMessage) { + managementCallMessageHandle(msg); + } else if (msg instanceof APISyncCallMessage) { + syncCallMessageHandle(msg); + } else { + asyncCallMessageHandle(msg); + } + } else { + handleMessageInSharedStrategy(msg); + } + } + + /** + * Handle message using legacy shared thread pool strategy. + * In shared mode, all API calls (management, sync, async) share the same thread pool, + * which is controlled by single parameter 'apiWorkerNum'. + * This mode is kept for backwards compatibility. + * + * @param msg The message to be handled + */ + private void handleMessageInSharedStrategy(final Message msg) { thdf.syncSubmit(new SyncTask() { @Override public String getSyncSignature() { - return "api.worker"; + return API_WORKER_SYNC_SIGNATURE; } @Override @@ -116,30 +181,152 @@ public int getSyncLevel() { @Override public String getName() { - return "api.worker"; + return API_WORKER_SYNC_SIGNATURE; } @MessageSafe void handleMessage(Message msg) { - if (msg instanceof APIIsReadyToGoMsg) { - handle((APIIsReadyToGoMsg) msg); - } else if (msg instanceof APIGetVersionMsg) { - handle((APIGetVersionMsg) msg); - }else if (msg instanceof APIGetSupportAPIsMsg) { - handle((APIGetSupportAPIsMsg) msg); - } else if (msg instanceof APIGetCurrentTimeMsg) { - handle((APIGetCurrentTimeMsg) msg); - } else if (msg instanceof APIGetPlatformTimeZoneMsg) { - handle((APIGetPlatformTimeZoneMsg) msg); - } else if (msg instanceof APIGetManagementNodeArchMsg) { - handle((APIGetManagementNodeArchMsg) msg); - } else if (msg instanceof APIGetManagementNodeOSMsg) { - handle((APIGetManagementNodeOSMsg) msg); - } else if (msg instanceof APIMessage) { - dispatchMessage((APIMessage) msg); - } else { - logger.debug("Not an APIMessage.Message ID is " + msg.getId()); - } + doHandleAllMessages(msg); + } + + @Override + public Object call() { + handleMessage(msg); + return null; + } + }); + } + + private void doHandleAllMessages(final Message msg) { + if (msg instanceof APIIsReadyToGoMsg) { + handle((APIIsReadyToGoMsg) msg); + } else if (msg instanceof APIGetVersionMsg) { + handle((APIGetVersionMsg) msg); + }else if (msg instanceof APIGetSupportAPIsMsg) { + handle((APIGetSupportAPIsMsg) msg); + } else if (msg instanceof APIGetCurrentTimeMsg) { + handle((APIGetCurrentTimeMsg) msg); + } else if (msg instanceof APIGetPlatformTimeZoneMsg) { + handle((APIGetPlatformTimeZoneMsg) msg); + } else if (msg instanceof APIGetManagementNodeArchMsg) { + handle((APIGetManagementNodeArchMsg) msg); + } else if (msg instanceof APIGetManagementNodeOSMsg) { + handle((APIGetManagementNodeOSMsg) msg); + } else if (msg instanceof APIMessage) { + dispatchMessage((APIMessage) msg); + } else { + logger.debug("Not an APIMessage.Message ID is " + msg.getId()); + } + } + + private void managementCallMessageHandle(final Message msg) { + thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return MANAGEMENT_API_WORKER_SYNC_SIGNATURE; + } + + @Override + public int getSyncLevel() { + return managementApiWorkerNum; + } + + @Override + public String getName() { + return MANAGEMENT_API_WORKER_SYNC_SIGNATURE; + } + + @MessageSafe + void handleMessage(Message msg) { + doHandleManagementMessage(msg); + } + + @Override + public Object call() { + handleMessage(msg); + return null; + } + }); + } + + private void doHandleManagementMessage(final Message msg) { + if (msg instanceof APIIsReadyToGoMsg) { + handle((APIIsReadyToGoMsg) msg); + } else if (msg instanceof APIGetVersionMsg) { + handle((APIGetVersionMsg) msg); + }else if (msg instanceof APIGetSupportAPIsMsg) { + handle((APIGetSupportAPIsMsg) msg); + } else if (msg instanceof APIGetCurrentTimeMsg) { + handle((APIGetCurrentTimeMsg) msg); + } else if (msg instanceof APIGetPlatformTimeZoneMsg) { + handle((APIGetPlatformTimeZoneMsg) msg); + } else if (msg instanceof APIGetManagementNodeArchMsg) { + handle((APIGetManagementNodeArchMsg) msg); + } else if (msg instanceof APIGetManagementNodeOSMsg) { + handle((APIGetManagementNodeOSMsg) msg); + } else { + logger.debug("Not an APIMessage.Message ID is " + msg.getId()); + } + } + + private void doHandleMessage(final Message msg) { + if (msg instanceof APIMessage) { + dispatchMessage((APIMessage) msg); + } else { + logger.debug("Not an APIMessage.Message ID is " + msg.getId()); + } + } + + private void asyncCallMessageHandle(final Message msg) { + thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return ASYNC_API_WORKER_SYNC_SIGNATURE; + } + + @Override + public int getSyncLevel() { + return asyncApiWorkerNum; + } + + @Override + public String getName() { + return ASYNC_API_WORKER_SYNC_SIGNATURE; + } + + @MessageSafe + void handleMessage(Message msg) { + doHandleMessage(msg); + } + + @Override + public Object call() { + handleMessage(msg); + return null; + } + }); + } + + private void syncCallMessageHandle(final Message msg) { + thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return API_WORKER_SYNC_SIGNATURE; + } + + @Override + public int getSyncLevel() { + return apiWorkerNum; + } + + @Override + public String getName() { + return API_WORKER_SYNC_SIGNATURE; + } + + @MessageSafe + void handleMessage(Message msg) { + doHandleMessage(msg); } @Override @@ -238,9 +425,27 @@ public boolean start() { bus.registerService(this); apiExts = pluginRgty.getExtensionList(RestAPIExtensionPoint.class); + logThreadPoolConfiguration(); return true; } + private void logThreadPoolConfiguration() { + if (threadPoolStrategy == ApiWorkerThreadPoolStrategy.SHARED) { + logger.info("API Worker running in SHARED thread pool mode:"); + logger.info("- All API calls share same thread pool"); + logger.info("- Available parameters:"); + logger.info(String.format(" * apiWorkerNum: %d (thread pool size for all API calls)", apiWorkerNum)); + } else { + logger.info("API Worker running in ISOLATED thread pool mode:"); + logger.info("- Using separate thread pools for different API types"); + logger.info("- Available parameters:"); + logger.info(String.format(" * managementApiWorkerNum: %d (thread pool size for management APIs)", managementApiWorkerNum)); + logger.info(String.format(" * apiWorkerNum: %d (thread pool size for sync APIs)", apiWorkerNum)); + logger.info(String.format(" * asyncApiWorkerNum: %d (thread pool size for async APIs)", asyncApiWorkerNum)); + logger.info(String.format(" * threadPoolStrategy: %s (SHARED/ISOLATED)", threadPoolStrategy)); + } + } + @Override public boolean stop() { bus.unregisterService(this); @@ -255,6 +460,18 @@ public void setApiWorkerNum(int apiWorkerNum) { this.apiWorkerNum = apiWorkerNum; } + public void setAsyncApiWorkerNum(int asyncApiWorkerNum) { + this.asyncApiWorkerNum = asyncApiWorkerNum; + } + + public void setManagementApiWorkerNum(int managementApiWorkerNum) { + this.managementApiWorkerNum = managementApiWorkerNum; + } + + public void setThreadPoolStrategy(ApiWorkerThreadPoolStrategy threadPoolStrategy) { + this.threadPoolStrategy = threadPoolStrategy; + } + @Override public List getMessageClassToIntercept() { List lst = new ArrayList<>(); @@ -286,4 +503,25 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti public ApiMessageProcessor getProcesser() { return processor; } + + @Override + public List registerThreadPool() { + if (threadPoolStrategy == ApiWorkerThreadPoolStrategy.SHARED) { + return null; + } + + ThreadPool pool = new ThreadPool(); + pool.setSyncSignature(API_WORKER_SYNC_SIGNATURE); + pool.setThreadNum(apiWorkerNum); + + ThreadPool asyncPool = new ThreadPool(); + asyncPool.setSyncSignature(ASYNC_API_WORKER_SYNC_SIGNATURE); + asyncPool.setThreadNum(asyncApiWorkerNum); + + ThreadPool managementPool = new ThreadPool(); + managementPool.setSyncSignature(MANAGEMENT_API_WORKER_SYNC_SIGNATURE); + managementPool.setThreadNum(managementApiWorkerNum); + + return Arrays.asList(pool, asyncPool, managementPool); + } } diff --git a/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java b/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java index f2d556912fa..20d7df9a1c2 100755 --- a/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java +++ b/portal/src/main/java/org/zstack/portal/apimediator/ApiMessageProcessorImpl.java @@ -91,7 +91,7 @@ private void dump() { public ApiMessageProcessorImpl(Map config) { this.unitTestOn = CoreGlobalProperty.UNIT_TEST_ON; this.minimalOn = Platform.isMinimalOn(); - this.configFolders = (List )config.get("serviceConfigFolders"); + this.configFolders = (List) config.get("serviceConfigFolders"); this.supportApis = new ArrayList<>(); populateGlobalInterceptors(); diff --git a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java index 87e9cd3316a..747a154919b 100755 --- a/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java +++ b/portal/src/main/java/org/zstack/portal/managementnode/ManagementNodeManagerImpl.java @@ -40,6 +40,7 @@ import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.managementnode.IsManagementNodeReadyMsg; import org.zstack.header.managementnode.IsManagementNodeReadyReply; @@ -100,6 +101,7 @@ public class ManagementNodeManagerImpl extends AbstractService implements Manage private static boolean stopped = false; private Future heartBeatTask = null; private HeartBeatDBSource heartBeatDBSource; + private static final String DEBUG_SIGNAL = "DumpNodeInfo"; private List lifeCycleExtension = new ArrayList(); // A dictionary (nodeId -> ManagementNodeInventory) of joined management Node final private Map joinedManagementNodes = new ConcurrentHashMap<>(); @@ -385,6 +387,20 @@ private void dumpDebugMessages() { } } + private void registerDebugDumpNodeInfo() { + DebugManager.registerDebugSignalHandler(DEBUG_SIGNAL, () -> { + StringBuilder sb = new StringBuilder(); + sb.append("\n================ BEGIN: NODE INFO ===================\n"); + + destinationMaker.getAllNodeInfo().forEach((nodeInfo) -> { + sb.append(String.format("Node[%s, %s]\n", nodeInfo.getNodeUuid(), nodeInfo.getNodeIP())); + }); + + sb.append("================ END: NODE INFO =====================\n"); + logger.debug(sb.toString()); + }); + } + @Override public boolean start() { if (started) { @@ -417,6 +433,10 @@ class Result { final ManagementNodeManagerImpl self = this; FlowChain bootstrap = FlowChainBuilder.newSimpleFlowChain(); bootstrap.setName("management-node-bootstrap"); + bootstrap.preCheck(data -> { + return Platform.IS_RUNNING ? null : new ErrorCode(SysErrors.INTERNAL.toString(), + "the management node is not running for some reason while starting"); + }); bootstrap.then(new Flow() { String __name__ = "bootstrap-cloudbus"; @@ -596,7 +616,7 @@ public void handle(ErrorCode errCode, Map data) { lock.unlock(); } - if (!ret.success) { + if (!ret.success || !Platform.IS_RUNNING) { logger.warn(String.format("management node[%s] failed to start for some reason", Platform.getUuid())); stopped = true; @@ -611,6 +631,7 @@ public void handle(ErrorCode errCode, Map data) { stopped = false; installShutdownHook(); + registerDebugDumpNodeInfo(); DebugSignalHandler.listenTo("USR2", this); logger.info("Management node: " + getId() + " starts successfully"); @@ -864,7 +885,17 @@ public void run() { @Override public Void call() { + logger.debug(String.format("heartbeat thread[%s] for management node[uuid:%s] started", + Thread.currentThread().getName(), node().getUuid())); while (true) { + if (Thread.currentThread().isInterrupted()) { + // the heartbeat task may be cancelled by the heartbeat interval change, + // just return, don't break, otherwise it stops the management node + logger.debug(String.format("heartbeat thread[%s] for management node[uuid:%s] is interrupted, exit heartbeat loop", + Thread.currentThread().getName(), node().getUuid())); + return null; + } + try { if (!amIalive()) { logger.warn(String.format("cannot find my[uuid:%s] heartbeat in database, quit process", node().getUuid())); @@ -887,23 +918,19 @@ public Void call() { } sleepAHeartbeatInterval(); - - if (heartBeatTask.isCancelled()) { - // the heartbeat task may be cancelled by the heartbeat interval change, - // just return, don't break, otherwise it stops the management node - return null; - } } stop(); return null; } - private void sleepAHeartbeatInterval() { + private boolean sleepAHeartbeatInterval() { try { TimeUnit.SECONDS.sleep(ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.value(Long.class)); + return true; } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); + return false; } } @@ -922,6 +949,10 @@ private boolean handleHeartbeatFailure(Throwable t) { int heartbeatFailureTimes = 0; while (true) { + if (Thread.currentThread().isInterrupted()) { + return false; + } + if (heartbeatFailureTimes > PortalGlobalProperty.MAX_HEARTBEAT_FAILURE) { logger.warn(String.format("the heartbeat has failed %s times that is greater than the max allowed value[%s]," + " quit process", heartbeatFailureTimes, PortalGlobalProperty.MAX_HEARTBEAT_FAILURE), t); diff --git a/resourceconfig/pom.xml b/resourceconfig/pom.xml index 9639e09778e..52e0a5ec525 100644 --- a/resourceconfig/pom.xml +++ b/resourceconfig/pom.xml @@ -6,7 +6,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. resourceconfig diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java index 2b1daa04244..6b502c5e18d 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java @@ -2,6 +2,7 @@ import org.springframework.http.HttpMethod; import org.zstack.core.Platform; +import org.zstack.header.Constants; import org.zstack.header.message.APIMessage; import org.zstack.header.message.APIParam; import org.zstack.header.rest.RestRequest; @@ -10,7 +11,8 @@ @RestRequest(path = "/resource-configurations/{category}/{name}/{resourceUuid}/actions", method = HttpMethod.PUT, isAction = true, - responseClass = APIUpdateResourceConfigEvent.class) + responseClass = APIUpdateResourceConfigEvent.class, + morphTransform = Constants.MORPH_TRANSFORM_IAM2) public class APIUpdateResourceConfigMsg extends APIMessage implements ResourceConfigMessage { @APIParam private String category; diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java index a2a519844c5..cbec4e64dde 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfig.java @@ -110,11 +110,6 @@ public T getResourceConfigValue(String resourceUuid, Class clz) { return TypeUtils.stringToValue(value, clz); } - public T getResourceConfigValueByResourceType(String resourceUuid, String resourceType, Class clz) { - String value = getResourceConfigValueByResourceType(resourceUuid, resourceType); - return TypeUtils.stringToValue(value, clz); - } - public Map getResourceConfigValues(List resourceUuids, Class clz) { Map values = new HashMap<>(); getResourceConfigValues(resourceUuids).forEach((key, value) -> values.put(key, TypeUtils.stringToValue(value, clz))); @@ -248,24 +243,6 @@ protected String getResourceConfigValue(String resourceUuid) { return getter.getResourceConfigValue(resourceUuid); } - @Transactional(readOnly = true) - protected String getResourceConfigValueByResourceType(String resourceUuid, String type) { - String resourceType = Q.New(ResourceVO.class).select(ResourceVO_.resourceType).eq(ResourceVO_.uuid, resourceUuid).findValue(); - if (resourceType == null || !resourceType.equals(type)) { - logger.warn(String.format("no resource[uuid:%s] by resourceType[%s] found, cannot get it's resource config", resourceUuid, type)); - return null; - } - - ResourceConfigGetter getter = configGetter.get(resourceType); - if (getter == null) { - logger.warn(String.format("resource[uuid:%s, type:%s] is not bound to global config[category:%s, name:%s]", - resourceUuid, resourceType, globalConfig.getCategory(), globalConfig.getName())); - return null; - } - - return loadConfigValue(resourceUuid); - } - @Transactional(readOnly = true) protected Map getResourceConfigValues(List resourceUuids) { Map valuesByResourceUuids = new HashMap<>(); diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java index cf1f4b395f0..81074e7c319 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacade.java @@ -12,8 +12,6 @@ public interface ResourceConfigFacade { T getResourceConfigValue(GlobalConfig gc, String resourceUuid, Class clz); - T getResourceConfigValueByResourceType(GlobalConfig gc, String resourceUuid, String type, Class clz); - Map getResourceConfigValues(GlobalConfig gc, List resourceUuids, Class clz); Map getResourceConfigValueByResourceUuids(GlobalConfig gc, List resourceUuids, Class clz); diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java index b210a908e4e..2c5fa2aa959 100644 --- a/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java +++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java @@ -200,16 +200,6 @@ public T getResourceConfigValue(GlobalConfig gc, String resourceUuid, Class< return rc.getResourceConfigValue(resourceUuid, clz); } - @Override - public T getResourceConfigValueByResourceType(GlobalConfig gc, String resourceUuid, String resourceType, Class clz) { - ResourceConfig rc = resourceConfigs.get(gc.getIdentity()); - if (rc == null) { - logger.debug(String.format("resource[uuid:%s] is not bound to global config[category:%s, name:%s]", resourceUuid, gc.getCategory(), gc.getName())); - return null; - } - return rc.getResourceConfigValueByResourceType(resourceUuid, resourceType, clz); - } - @Override public Map getResourceConfigValues(GlobalConfig gc, List resourceUuids, Class clz) { ResourceConfig rc = resourceConfigs.get(gc.getIdentity()); diff --git a/rest/pom.xml b/rest/pom.xml index b9422f415ac..1a79e191c0f 100755 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/rest/src/main/java/org/zstack/rest/RateLimiter.java b/rest/src/main/java/org/zstack/rest/RateLimiter.java new file mode 100644 index 00000000000..9bd579b3d48 --- /dev/null +++ b/rest/src/main/java/org/zstack/rest/RateLimiter.java @@ -0,0 +1,65 @@ +package org.zstack.rest; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +public class RateLimiter { + private final LoadingCache requestCache; + private final int maxRequestsPerMinute; + + public RateLimiter(int maxRequestsPerMinute) { + this.maxRequestsPerMinute = maxRequestsPerMinute; + this.requestCache = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.MINUTES) + .build(new CacheLoader() { + @Override + public TokenBucket load(String key) { + return new TokenBucket(maxRequestsPerMinute); + } + }); + } + + public boolean isRateLimitExceeded(String clientIp) { + try { + TokenBucket bucket = requestCache.get(clientIp); + return !bucket.tryConsume(); + } catch (ExecutionException e) { + // 处理异常 + return false; + } + } + + private static class TokenBucket { + private final Queue timestamps = new ConcurrentLinkedQueue<>(); + private final int capacity; + + public TokenBucket(int capacity) { + this.capacity = capacity; + } + + public synchronized boolean tryConsume() { + long now = System.currentTimeMillis(); + long boundary = now - TimeUnit.MINUTES.toMillis(1); + + // remove time stamps over boundary + while (!timestamps.isEmpty() && timestamps.peek() <= boundary) { + timestamps.poll(); + } + + // check requests limitation + if (timestamps.size() >= capacity) { + return false; + } + + // add latest request timestamp + timestamps.offer(now); + return true; + } + } +} diff --git a/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java b/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java index 0c95c86ae21..60f8e015e80 100755 --- a/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java +++ b/rest/src/main/java/org/zstack/rest/RestGlobalProperty.java @@ -10,4 +10,7 @@ public class RestGlobalProperty { @GlobalProperty(name="RestServer.maxCachedApiResults", defaultValue = "2000") public static int MAX_CACHED_API_RESULTS; + + @GlobalProperty(name="RestServer.rateLimits", defaultValue = "12000") + public static int REST_RATE_LIMITS; } diff --git a/rest/src/main/java/org/zstack/rest/RestServer.java b/rest/src/main/java/org/zstack/rest/RestServer.java index 8d4558b7b8c..322089899f4 100755 --- a/rest/src/main/java/org/zstack/rest/RestServer.java +++ b/rest/src/main/java/org/zstack/rest/RestServer.java @@ -41,6 +41,12 @@ import org.zstack.header.identity.SuppressCredentialCheck; import org.zstack.header.log.MaskSensitiveInfo; import org.zstack.header.message.*; +import org.zstack.header.message.APIEvent; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APISyncCallMessage; +import org.zstack.header.message.Event; +import org.zstack.header.message.JsonSchemaBuilder; +import org.zstack.header.message.MessageReply; import org.zstack.header.query.APIQueryMessage; import org.zstack.header.query.APIQueryReply; import org.zstack.header.query.QueryCondition; @@ -60,7 +66,12 @@ import org.zstack.rest.sdk.DocumentGenerator; import org.zstack.rest.sdk.SdkFile; import org.zstack.rest.sdk.SdkTemplate; -import org.zstack.utils.*; +import org.zstack.utils.DebugUtils; +import org.zstack.utils.FieldUtils; +import org.zstack.utils.GroovyUtils; +import org.zstack.utils.HttpServletRequestUtils; +import org.zstack.utils.TypeUtils; +import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; import org.zstack.utils.path.PathUtil; @@ -129,6 +140,8 @@ public class RestServer implements Component, CloudBusEventListener { @Autowired private PluginRegistry pluginRgty; + RateLimiter rateLimiter = new RateLimiter(RestGlobalProperty.REST_RATE_LIMITS); + private Map restAuthBackends = new HashMap(); private List interceptors = new ArrayList<>(); @@ -149,8 +162,37 @@ public void registerRestServletRequestInterceptor(RestServletRequestInterceptor } formatter = new DateTimeFormatterBuilder() - .parseCaseInsensitive() - .appendPattern("EEE, dd MMM yyyy HH:mm:ss z") + .parseCaseInsensitive() // Allows parsing of month names and day periods (e.g., "Jan" or "JAN", "AM" or "am") in a case-insensitive manner. + + // Common RFC 1123-like format with two-digit day and time zone name (e.g., "Thu, 26 Oct 2023 10:30:00 GMT"). + // Note: The 'z' pattern has limited support for time zone names (e.g., typically parses "GMT" but not full IDs like "Asia/Shanghai"). + .appendOptional(DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH)) + + // Standard RFC 1123 date-time formatter, commonly used in HTTP headers. + // It handles single-digit days (e.g., '5 Jun') and formats time zones as offsets (e.g., '+0800') or 'GMT'. + // Example: "Thu, 5 Jun 2025 15:47:29 +0800". + .appendOptional(DateTimeFormatter.RFC_1123_DATE_TIME) + + // ISO 8601 (International Organization for Standardization standard) + // Appends the ISO-8601 date-time formatter with an offset from UTC. Example: "2023-10-26T10:30:00+08:00". + .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + + // Appends a custom formatter for date-time with milliseconds and a two-character ISO-8601 offset. Example: "2023-10-26T10:30:00.123+08". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxx", Locale.ENGLISH)) + + // Appends a custom formatter for date-time with milliseconds and a four-digit offset (e.g., "+0800"). Example: "2023-10-26T10:30:00.123+0800". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ENGLISH)) + + // Appends a custom formatter for date-time with a colon-separated ISO-8601 extended offset. Example: "2023-10-26T10:30:00+08:00". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH)) + + // Appends a custom formatter for date-time (no milliseconds) with a two-character ISO-8601 offset. Example: "2023-10-26T10:30:00+08". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxx", Locale.ENGLISH)) + + // Appends a custom formatter for date-time (no milliseconds) with a four-digit offset. Example: "2023-10-26T10:30:00+0800". + .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH)) + + // Completes the builder and creates the final DateTimeFormatter, ensuring that English locale rules are used for parsing (e.g., for month names). .toFormatter(Locale.ENGLISH); } @@ -168,8 +210,13 @@ static class RequestInfo { public RequestInfo(HttpServletRequest req) { session = req.getSession(); remoteHost = req.getRemoteHost(); - clientIp = HttpServletRequestUtils.getClientIP(req); clientBrowser = HttpServletRequestUtils.getClientBrowser(req); + String ipFromRequest = HttpServletRequestUtils.getClientIP(req); + if (ipFromRequest == null) { + clientIp = "Unknown"; + } else { + clientIp = ipFromRequest; + } for (Enumeration e = req.getHeaderNames(); e.hasMoreElements() ;) { String name = e.nextElement().toString(); @@ -347,18 +394,24 @@ private void callWebHook(RequestData d) throws IllegalAccessException, NoSuchMet if (d.apiMessage instanceof APIBatchRequest) { if (evt.isSuccess()) { - APIBatchRequest.Result batchResult = ((APIBatchRequest) d.apiMessage).collectResult(d.apiMessage, evt); + try { + APIBatchRequest.Result batchResult = ((APIBatchRequest) d.apiMessage).collectResult(d.apiMessage, evt); + + DebugUtils.Assert(batchResult != null, "APIBatchRequest.collectResult should not return null"); + RestConstants.Batch result; + if (batchResult.getSuccessCount() == 0) { + result = RestConstants.Batch.FAIL; + } else if (batchResult.getSuccessCount() == batchResult.getTotalCount()) { + result = RestConstants.Batch.SUCCESS; + } else { + result = RestConstants.Batch.PARTIAL; + } - RestConstants.Batch result; - if (batchResult.getSuccessCount() == 0) { - result = RestConstants.Batch.FAIL; - } else if (batchResult.getSuccessCount() == batchResult.getTotalCount()) { - result = RestConstants.Batch.SUCCESS; - } else { - result = RestConstants.Batch.PARTIAL; + rb.addHeader(RestConstants.HEADER_JOB_BATCH, result.toString()); + } catch (Exception e) { + logger.error(String.format("failed to collect batch result for %s", d.apiMessage.getId()), e); + rb.addHeader(RestConstants.HEADER_JOB_BATCH, RestConstants.Batch.FAIL.toString()); } - - rb.addHeader(RestConstants.HEADER_JOB_BATCH, result.toString()); } else { rb.addHeader(RestConstants.HEADER_JOB_BATCH, RestConstants.Batch.FAIL.toString()); } @@ -637,6 +690,12 @@ private String getMatchPath(String path) { void handle(HttpServletRequest req, HttpServletResponse rsp) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { RequestInfo info = new RequestInfo(req); + + if (rateLimiter.isRateLimitExceeded(info.clientIp)) { + sendResponse(HttpStatus.TOO_MANY_REQUESTS.value(), "Rate limit exceeded", rsp); + return; + } + requestInfo.set(info); rsp.setCharacterEncoding("utf-8"); String path = getDecodedUrl(req); @@ -1030,7 +1089,10 @@ private void checkTime(String dateStr, boolean checkTimeZone) throws RestExcepti try { date = ZonedDateTime.parse(dateStr, formatter); } catch (RuntimeException e) { - throw new RestException(HttpStatus.BAD_REQUEST.value(), "'Date' format error, correct format is 'EEE, dd MMM yyyy HH:mm:ss z'"); + throw new RestException(HttpStatus.BAD_REQUEST.value(), + "Date format error. The 'Date' header must conform to one of the supported RFC 1123 or ISO 8601 formats. " + + "Examples include: 'Thu, 5 Jun 2025 15:47:29 +0800', '2025-06-05T16:08:42+08:00', or '2025-06-05T16:08:42.123Z'." + ); } ZonedDateTime now = ZonedDateTime.now(); diff --git a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy index 59828ba3b9b..3bad534aa29 100755 --- a/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy +++ b/rest/src/main/resources/scripts/RestDocumentationGenerator.groovy @@ -42,6 +42,7 @@ import javax.xml.bind.JAXBContext import javax.xml.bind.JAXBException import javax.xml.bind.Unmarshaller import java.lang.reflect.Field +import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method import java.lang.reflect.Modifier import java.nio.file.Paths @@ -528,7 +529,7 @@ class RestDocumentationGenerator implements DocumentGenerator { Set apiClasses = getRequestRequestApiSet() apiClasses.each { - println("generating doc template for class ${it}") + logger.info("generating doc template for class ${it}") def tmp = new ApiRequestDocTemplate(it) tmp.generateDocFile(mode) } @@ -549,6 +550,9 @@ class RestDocumentationGenerator implements DocumentGenerator { String specifiedClasses = System.getProperty("classes") + apiClasses.forEach {it -> + logger.info("apiClasses 1: ${it}".toString()) + } if (specifiedClasses != null) { def classes = specifiedClasses.split(",") as List apiClasses = apiClasses.findAll { @@ -562,6 +566,10 @@ class RestDocumentationGenerator implements DocumentGenerator { } } + apiClasses.forEach {it -> + logger.info("apiClasses 2: ${it}".toString()) + } + return apiClasses } @@ -1242,7 +1250,13 @@ ${category(err)} } Doc createDoc(String docTemplatePath) { - Script script = new GroovyShell().parse(new File(docTemplatePath)) + Script script + try { + script = new GroovyShell().parse(new File(docTemplatePath)) + } catch (FileNotFoundException e) { + throw new CloudRuntimeException("cannot find doc template file[path:${docTemplatePath}]", e) + } + return createDocFromGroobyScript(script) } @@ -1543,7 +1557,13 @@ ${table.join("\n")} throw new CloudRuntimeException("__example__() of ${clz.name} must be declared as a static method") } - def example = m.invoke(null) + def example + try { + example = m.invoke(null) + } catch (InvocationTargetException e) { + throw new CloudRuntimeException("cannot generate the markdown document for the class[${clz.name}], the __example__() method has an error: ${e.getTargetException().printStackTrace()}") + } + DocUtils.removeApiUuidMap(example.class.name) @@ -1551,7 +1571,12 @@ ${table.join("\n")} example.validate() } - LinkedHashMap map = JSONObjectUtil.rehashObject(example, LinkedHashMap.class) + LinkedHashMap map + try { + map = JSONObjectUtil.rehashObject(example, LinkedHashMap.class) + } catch (IllegalStateException e) { + throw new CloudRuntimeException("cannot generate the markdown document for the class[${clz.name}], the __example__() method has an error: ${e.getMessage()}") + } List apiFields = getApiFieldsOfClass(clz) @@ -1572,6 +1597,7 @@ ${table.join("\n")} } catch (NoSuchMethodException e) { //throw new CloudRuntimeException("class[${clz.name}] doesn't have static __example__ method", e) logger.warn("class[${clz.name}] doesn't have static __example__ method") + return null } } @@ -1601,7 +1627,13 @@ ${table.join("\n")} Map allFields = getApiExampleOfTheClass(clz) - String urlPath = substituteUrl("${RestConstants.API_VERSION}${it}", allFields) + String urlPath + try { + urlPath = substituteUrl("${RestConstants.API_VERSION}${it}", allFields) + } catch (CloudRuntimeException e) { + logger.warn("Failed to substituteUrl for class ${clz.name} url ${it}, ${e.getMessage()}") + throw e + } if (!queryString) { def apiFields = getRequestBody() @@ -1679,6 +1711,9 @@ ${examples.join("\n")} // the API has a body Map apiFields = getApiExampleOfTheClass(clz) + if (apiFields == null) { + throw new CloudRuntimeException("cannot find the example of the class[${clz.name}]") + } List urlVars = getVarNamesFromUrl(at.path()) apiFields = apiFields.findAll { k, v -> !urlVars.contains(k) } return [(paramName): apiFields] @@ -1950,6 +1985,10 @@ ${pythonSdk()} String txt = resolvedRefs[it._clz] if (txt == null) { + if (it._clz == null) { + throw new CloudRuntimeException("cannot find the class[${it._name}]") + } + String path = getDocTemplatePathFromClass(it._clz) Doc refDoc = createDoc(path) def dmd = new DataStructMarkDown(it._clz, refDoc) @@ -1989,6 +2028,7 @@ ${txt} char.class, String.class, Enum.class, + byte[].class ] class ApiResponseDocTemplate { diff --git a/rest/src/main/resources/scripts/SdkApiTemplate.groovy b/rest/src/main/resources/scripts/SdkApiTemplate.groovy index eeb6d64c58c..7ff5e238cee 100755 --- a/rest/src/main/resources/scripts/SdkApiTemplate.groovy +++ b/rest/src/main/resources/scripts/SdkApiTemplate.groovy @@ -284,7 +284,9 @@ class SdkApiTemplate implements SdkTemplate { info.path = "${path}"; info.needSession = ${!apiMessageClass.isAnnotationPresent(SuppressCredentialCheck.class)}; info.needPoll = ${!APISyncCallMessage.class.isAssignableFrom(apiMessageClass)}; - info.parameterName = "${requestAnnotation.isAction() ? StringUtils.uncapitalize(normalizeApiName()) : requestAnnotation.parameterName()}"; + info.parameterName = "${requestAnnotation.isAction() ? StringUtils.uncapitalize(normalizeApiName()) : requestAnnotation.parameterName()}";\ +${requestAnnotation.morphTransform() ? """ + info.morphTransform = \"${requestAnnotation.morphTransform()}\";""" : ""} return info; } """) diff --git a/sdk/pom.xml b/sdk/pom.xml index af1a3d2ec04..72ed68dd8ab 100755 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 703c2b14eb8..976ae5d4e48 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -5,8 +5,35 @@ public class SourceClassMap { public final static HashMap srcToDstMapping = new HashMap() { { + put("org.zstack.abstraction.OptionType", "org.zstack.sdk.OptionType"); + put("org.zstack.abstraction.OptionType$InputType", "org.zstack.sdk.InputType"); put("org.zstack.accessKey.AccessKeyInventory", "org.zstack.sdk.AccessKeyInventory"); put("org.zstack.accessKey.AccessKeyState", "org.zstack.sdk.AccessKeyState"); + 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"); + put("org.zstack.ai.entity.ModelCenterCapacityInventory", "org.zstack.sdk.ModelCenterCapacityInventory"); + put("org.zstack.ai.entity.ModelCenterInventory", "org.zstack.sdk.ModelCenterInventory"); + put("org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory", "org.zstack.sdk.ModelEvalServiceInstanceGroupInventory"); + put("org.zstack.ai.entity.ModelEvaluationTaskInventory", "org.zstack.sdk.ModelEvaluationTaskInventory"); + put("org.zstack.ai.entity.ModelInventory", "org.zstack.sdk.ModelInventory"); + put("org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory", "org.zstack.sdk.ModelServiceGroupDatasetRefInventory"); + put("org.zstack.ai.entity.ModelServiceInstanceGroupInventory", "org.zstack.sdk.ModelServiceInstanceGroupInventory"); + put("org.zstack.ai.entity.ModelServiceInstanceInventory", "org.zstack.sdk.ModelServiceInstanceInventory"); + put("org.zstack.ai.entity.ModelServiceInventory", "org.zstack.sdk.ModelServiceInventory"); + put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory"); + put("org.zstack.ai.entity.ModelServiceTemplateInventory", "org.zstack.sdk.ModelServiceTemplateInventory"); + put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory"); + put("org.zstack.ai.message.ArchitectureImageMapping", "org.zstack.sdk.ArchitectureImageMapping"); + put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage"); + put("org.zstack.ai.message.ModelCenterServiceInventory", "org.zstack.sdk.ModelCenterServiceInventory"); + put("org.zstack.ai.message.ModelCenterServiceInventory$MetaServerService", "org.zstack.sdk.MetaServerService"); + put("org.zstack.ai.message.ModelCenterServiceInventory$ServiceStatus", "org.zstack.sdk.ServiceStatus"); + put("org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService", "org.zstack.sdk.ZdfsService"); + put("org.zstack.ai.message.ModelService", "org.zstack.sdk.ModelService"); + put("org.zstack.ai.message.ModelServiceMatchEntry", "org.zstack.sdk.ModelServiceMatchEntry"); + put("org.zstack.ai.message.ModelServiceMatchEntryName", "org.zstack.sdk.ModelServiceMatchEntryName"); + put("org.zstack.ai.message.ModelServiceMatchStatus", "org.zstack.sdk.ModelServiceMatchStatus"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessGroupInventory", "org.zstack.sdk.AliyunNasAccessGroupInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasAccessRuleInventory", "org.zstack.sdk.AliyunNasAccessRuleInventory"); put("org.zstack.aliyun.nas.filesystem.AliyunNasFileSystemInventory", "org.zstack.sdk.AliyunNasFileSystemInventory"); @@ -88,6 +115,16 @@ public class SourceClassMap { put("org.zstack.cloudformation.template.struct.ActionStruct", "org.zstack.sdk.ActionStruct"); put("org.zstack.cloudformation.template.struct.ResourceStruct", "org.zstack.sdk.ResourceStruct"); put("org.zstack.cloudformation.template.struct.ResourceType", "org.zstack.sdk.ResourceType"); + put("org.zstack.container.ContainerBackupStorageInventory", "org.zstack.sdk.ContainerBackupStorageInventory"); + put("org.zstack.container.ContainerUsage", "org.zstack.sdk.ContainerUsage"); + put("org.zstack.container.entity.ContainerImageInventory", "org.zstack.sdk.ContainerImageInventory"); + put("org.zstack.container.entity.ContainerImageTagInventory", "org.zstack.sdk.ContainerImageTagInventory"); + put("org.zstack.container.entity.ContainerManagementEndpointInventory", "org.zstack.sdk.ContainerManagementEndpointInventory"); + put("org.zstack.container.entity.NativeClusterInventory", "org.zstack.sdk.NativeClusterInventory"); + put("org.zstack.container.entity.NativeHostInventory", "org.zstack.sdk.NativeHostInventory"); + put("org.zstack.container.entity.PodInventory", "org.zstack.sdk.PodInventory"); + put("org.zstack.container.entity.ProjectRepositoryInventory", "org.zstack.sdk.ProjectRepositoryInventory"); + put("org.zstack.container.entity.ZakuImageInventory", "org.zstack.sdk.ZakuImageInventory"); put("org.zstack.core.config.GlobalConfigInventory", "org.zstack.sdk.GlobalConfigInventory"); put("org.zstack.core.config.GlobalConfigOptions", "org.zstack.sdk.GlobalConfigOptions"); put("org.zstack.core.config.GuestOsCharacterInventory", "org.zstack.sdk.GuestOsCharacterInventory"); @@ -112,6 +149,8 @@ public class SourceClassMap { put("org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecretResourcePoolInventory", "org.zstack.sdk.InfoSecSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecurityMachineInventory", "org.zstack.sdk.InfoSecSecurityMachineInventory"); put("org.zstack.crypto.securitymachine.thirdparty.jit.JitSecurityMachineInventory", "org.zstack.sdk.JitSecurityMachineInventory"); + put("org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory", "org.zstack.sdk.KoAlSecretResourcePoolInventory"); + put("org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory", "org.zstack.sdk.PluginSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecretResourcePoolInventory", "org.zstack.sdk.SanSecSecretResourcePoolInventory"); put("org.zstack.crypto.securitymachine.thirdparty.sansec.SanSecSecurityMachineInventory", "org.zstack.sdk.SanSecSecurityMachineInventory"); put("org.zstack.directory.DirectoryInventory", "org.zstack.sdk.DirectoryInventory"); @@ -137,6 +176,8 @@ public class SourceClassMap { put("org.zstack.guesttools.GuestVmScriptExecutedRecordDetailInventory", "org.zstack.sdk.GuestVmScriptExecutedRecordDetailInventory"); put("org.zstack.guesttools.GuestVmScriptExecutedRecordInventory", "org.zstack.sdk.GuestVmScriptExecutedRecordInventory"); put("org.zstack.guesttools.GuestVmScriptInventory", "org.zstack.sdk.GuestVmScriptInventory"); + put("org.zstack.guesttools.InvocationRecord", "org.zstack.sdk.InvocationRecord"); + put("org.zstack.guesttools.InvocationRecordDetail", "org.zstack.sdk.InvocationRecordDetail"); put("org.zstack.ha.HaStrategyConditionInventory", "org.zstack.sdk.HaStrategyConditionInventory"); put("org.zstack.header.acl.AccessControlListEntryInventory", "org.zstack.sdk.AccessControlListEntryInventory"); put("org.zstack.header.acl.AccessControlListInventory", "org.zstack.sdk.AccessControlListInventory"); @@ -185,6 +226,10 @@ public class SourceClassMap { put("org.zstack.header.buildapp.BuildApplicationInventory", "org.zstack.sdk.BuildApplicationInventory"); put("org.zstack.header.buildsystem.AppBuildSystemInventory", "org.zstack.sdk.AppBuildSystemInventory"); put("org.zstack.header.buildsystem.AppBuildSystemZoneRefInventory", "org.zstack.sdk.AppBuildSystemZoneRefInventory"); + put("org.zstack.header.cbt.CbtTaskInventory", "org.zstack.sdk.CbtTaskInventory"); + put("org.zstack.header.cbt.CbtTaskResourceRefInventory", "org.zstack.sdk.CbtTaskResourceRefInventory"); + put("org.zstack.header.cbt.CbtTaskStatus", "org.zstack.sdk.CbtTaskStatus"); + put("org.zstack.header.cbt.VolumeCbtBackupInfo", "org.zstack.sdk.VolumeCbtBackupInfo"); put("org.zstack.header.cloudformation.CloudFormationStackEventInventory", "org.zstack.sdk.CloudFormationStackEventInventory"); put("org.zstack.header.cloudformation.PreviewResourceStruct", "org.zstack.sdk.PreviewResourceStruct"); put("org.zstack.header.cloudformation.ResourceStackInventory", "org.zstack.sdk.ResourceStackInventory"); @@ -197,6 +242,7 @@ public class SourceClassMap { put("org.zstack.header.configuration.InstanceOfferingInventory", "org.zstack.sdk.InstanceOfferingInventory"); put("org.zstack.header.console.ConsoleInventory", "org.zstack.sdk.ConsoleInventory"); put("org.zstack.header.console.ConsoleProxyAgentInventory", "org.zstack.sdk.ConsoleProxyAgentInventory"); + put("org.zstack.header.core.external.plugin.PluginDriverInventory", "org.zstack.sdk.PluginDriverInventory"); put("org.zstack.header.core.external.service.ExternalServiceCapabilities", "org.zstack.sdk.ExternalServiceCapabilities"); put("org.zstack.header.core.external.service.ExternalServiceInventory", "org.zstack.sdk.ExternalServiceInventory"); put("org.zstack.header.core.progress.ChainInfo", "org.zstack.sdk.ChainInfo"); @@ -217,12 +263,13 @@ public class SourceClassMap { put("org.zstack.header.flowMeter.FlowMeterInventory", "org.zstack.sdk.FlowMeterInventory"); put("org.zstack.header.flowMeter.NetworkRouterFlowMeterRefInventory", "org.zstack.sdk.NetworkRouterFlowMeterRefInventory"); put("org.zstack.header.host.AddHostFromFileResult", "org.zstack.sdk.AddHostFromFileResult"); + put("org.zstack.header.host.CpuArchitecture", "org.zstack.sdk.CpuArchitecture"); put("org.zstack.header.host.HostInventory", "org.zstack.sdk.HostInventory"); put("org.zstack.header.host.HostIpmiInventory", "org.zstack.sdk.HostIpmiInventory"); put("org.zstack.header.host.HostNUMANode", "org.zstack.sdk.HostNUMANode"); put("org.zstack.header.host.HostNetworkBondingServiceRefInventory", "org.zstack.sdk.HostNetworkBondingServiceRefInventory"); put("org.zstack.header.host.HostNetworkInterfaceServiceRefInventory", "org.zstack.sdk.HostNetworkInterfaceServiceRefInventory"); - put("org.zstack.header.host.HostNetworkInterfaceServiceType", "org.zstack.sdk.HostNetworkInterfaceServiceType"); + put("org.zstack.header.host.HostNetworkLabelInventory", "org.zstack.sdk.HostNetworkLabelInventory"); put("org.zstack.header.host.HostPhysicalMemoryInventory", "org.zstack.sdk.HostPhysicalMemoryInventory"); put("org.zstack.header.host.HwMonitorStatus", "org.zstack.sdk.HwMonitorStatus"); put("org.zstack.header.host.ServiceTypeStatisticData", "org.zstack.sdk.ServiceTypeStatisticData"); @@ -239,11 +286,11 @@ public class SourceClassMap { put("org.zstack.header.identity.AccountResourceRefInventory", "org.zstack.sdk.AccountResourceRefInventory"); put("org.zstack.header.identity.PolicyInventory", "org.zstack.sdk.PolicyInventory"); put("org.zstack.header.identity.PolicyStatement", "org.zstack.sdk.PolicyStatement"); + put("org.zstack.header.identity.PolicyStatementEffect", "org.zstack.sdk.PolicyStatementEffect"); put("org.zstack.header.identity.Quota$QuotaUsage", "org.zstack.sdk.QuotaUsage"); put("org.zstack.header.identity.QuotaInventory", "org.zstack.sdk.QuotaInventory"); put("org.zstack.header.identity.SessionInventory", "org.zstack.sdk.SessionInventory"); put("org.zstack.header.identity.SharedResourceInventory", "org.zstack.sdk.SharedResourceInventory"); - put("org.zstack.header.identity.StatementEffect", "org.zstack.sdk.PolicyStatementEffect"); put("org.zstack.header.identity.UserGroupInventory", "org.zstack.sdk.UserGroupInventory"); put("org.zstack.header.identity.UserInventory", "org.zstack.sdk.UserInventory"); put("org.zstack.header.identity.login.LoginAuthenticationProcedureDesc", "org.zstack.sdk.LoginAuthenticationProcedureDesc"); @@ -259,6 +306,8 @@ public class SourceClassMap { put("org.zstack.header.image.APICreateRootVolumeTemplateFromVolumeSnapshotEvent$Failure", "org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotFailure"); put("org.zstack.header.image.APIGetUploadImageJobDetailsReply$JobDetails", "org.zstack.sdk.JobDetails"); put("org.zstack.header.image.ImageBackupStorageRefInventory", "org.zstack.sdk.ImageBackupStorageRefInventory"); + put("org.zstack.header.image.ImageGroupInventory", "org.zstack.sdk.ImageGroupInventory"); + put("org.zstack.header.image.ImageGroupRefInventory", "org.zstack.sdk.ImageGroupRefInventory"); put("org.zstack.header.image.ImageInventory", "org.zstack.sdk.ImageInventory"); put("org.zstack.header.longjob.LongJobInventory", "org.zstack.sdk.LongJobInventory"); put("org.zstack.header.longjob.LongJobState", "org.zstack.sdk.LongJobState"); @@ -276,6 +325,9 @@ public class SourceClassMap { put("org.zstack.header.network.l3.ReservedIpRangeInventory", "org.zstack.sdk.ReservedIpRangeInventory"); put("org.zstack.header.network.l3.UsedIpInventory", "org.zstack.sdk.UsedIpInventory"); put("org.zstack.header.network.l3.datatypes.IpCapacityData", "org.zstack.sdk.IpCapacityData"); + put("org.zstack.header.network.sdncontroller.SdnControllerHostRefInventory", "org.zstack.sdk.SdnControllerHostRefInventory"); + put("org.zstack.header.network.sdncontroller.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); + put("org.zstack.header.network.sdncontroller.SdnControllerStatus", "org.zstack.sdk.SdnControllerStatus"); put("org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory", "org.zstack.sdk.NetworkServiceL3NetworkRefInventory"); put("org.zstack.header.network.service.NetworkServiceProviderInventory", "org.zstack.sdk.NetworkServiceProviderInventory"); put("org.zstack.header.portMirror.MirrorNetworkUsedIpInventory", "org.zstack.sdk.MirrorNetworkUsedIpInventory"); @@ -362,6 +414,7 @@ public class SourceClassMap { put("org.zstack.header.vm.VmPriorityLevel", "org.zstack.sdk.VmPriorityLevel"); put("org.zstack.header.vm.VmSchedHistoryInventory", "org.zstack.sdk.VmSchedHistoryInventory"); put("org.zstack.header.vm.cdrom.VmCdRomInventory", "org.zstack.sdk.VmCdRomInventory"); + put("org.zstack.header.vm.devices.DeviceAddress", "org.zstack.sdk.DeviceAddress"); put("org.zstack.header.vm.devices.VmInstanceDeviceAddressArchiveInventory", "org.zstack.sdk.VmInstanceDeviceAddressArchiveInventory"); put("org.zstack.header.vm.devices.VmInstanceDeviceAddressGroupInventory", "org.zstack.sdk.VmInstanceDeviceAddressGroupInventory"); put("org.zstack.header.vmscheduling.HostSchedulingRuleGroupInventory", "org.zstack.sdk.HostSchedulingRuleGroupInventory"); @@ -383,13 +436,20 @@ public class SourceClassMap { put("org.zstack.header.vpc.ha.VpcHaGroupMonitorIpInventory", "org.zstack.sdk.VpcHaGroupMonitorIpInventory"); put("org.zstack.header.vpc.ha.VpcHaGroupNetworkServiceRefInventory", "org.zstack.sdk.VpcHaGroupNetworkServiceRefInventory"); put("org.zstack.header.vpc.ha.VpcHaGroupVipRefInventory", "org.zstack.sdk.VpcHaGroupVipRefInventory"); + put("org.zstack.header.zdfs.StorageType", "org.zstack.sdk.StorageType"); + put("org.zstack.header.zdfs.ZdfsInventory", "org.zstack.sdk.ZdfsInventory"); + put("org.zstack.header.zdfs.ZdfsStorageInventory", "org.zstack.sdk.ZdfsStorageInventory"); put("org.zstack.header.zone.ZoneInventory", "org.zstack.sdk.ZoneInventory"); + put("org.zstack.header.zwatch.AuditData", "org.zstack.sdk.AuditData"); + put("org.zstack.header.zwatch.AuditDataV1", "org.zstack.sdk.AuditDataV1"); + put("org.zstack.header.zwatch.AuditDataV2", "org.zstack.sdk.AuditDataV2"); put("org.zstack.hybrid.account.HybridAccountInventory", "org.zstack.sdk.HybridAccountInventory"); put("org.zstack.hybrid.core.HybridType", "org.zstack.sdk.HybridType"); put("org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionMsg$APIPermissionStruct", "org.zstack.sdk.iam2.api.APIPermissionStruct"); put("org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission", "org.zstack.sdk.iam2.api.Permission"); put("org.zstack.iam2.api.Attribute", "org.zstack.sdk.iam2.api.Attribute"); put("org.zstack.iam2.api.ErrorResult", "org.zstack.sdk.iam2.api.ErrorResult"); + put("org.zstack.iam2.container.ContainerClusterInventory", "org.zstack.sdk.iam2.container.ContainerClusterInventory"); put("org.zstack.iam2.entity.AttributeType", "org.zstack.sdk.iam2.entity.AttributeType"); put("org.zstack.iam2.entity.IAM2AttributeInventory", "org.zstack.sdk.iam2.entity.IAM2AttributeInventory"); put("org.zstack.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory"); @@ -400,13 +460,13 @@ public class SourceClassMap { put("org.zstack.iam2.entity.IAM2ProjectInventory", "org.zstack.sdk.iam2.entity.IAM2ProjectInventory"); put("org.zstack.iam2.entity.IAM2ProjectRoleInventory", "org.zstack.sdk.iam2.entity.IAM2ProjectRoleInventory"); put("org.zstack.iam2.entity.IAM2ProjectTemplateInventory", "org.zstack.sdk.iam2.entity.IAM2ProjectTemplateInventory"); + put("org.zstack.iam2.entity.IAM2State", "org.zstack.sdk.iam2.entity.IAM2State"); put("org.zstack.iam2.entity.IAM2VirtualIDAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDAttributeInventory"); put("org.zstack.iam2.entity.IAM2VirtualIDGroupAttributeInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupAttributeInventory"); put("org.zstack.iam2.entity.IAM2VirtualIDGroupInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupInventory"); put("org.zstack.iam2.entity.IAM2VirtualIDInventory", "org.zstack.sdk.iam2.entity.IAM2VirtualIDInventory"); put("org.zstack.iam2.entity.OrganizationType", "org.zstack.sdk.iam2.entity.OrganizationType"); put("org.zstack.iam2.entity.ProjectState", "org.zstack.sdk.iam2.entity.ProjectState"); - put("org.zstack.iam2.entity.State", "org.zstack.sdk.iam2.entity.State"); put("org.zstack.iam2.entity.StateEvent", "org.zstack.sdk.iam2.entity.StateEvent"); put("org.zstack.iam2.project.template.Template", "org.zstack.sdk.iam2.project.template.Template"); put("org.zstack.imagereplicator.ImageReplicationGroupBackupStorageRefInventory", "org.zstack.sdk.ImageReplicationGroupBackupStorageRefInventory"); @@ -416,8 +476,14 @@ public class SourceClassMap { put("org.zstack.ipsec.IPsecL3NetworkRefInventory", "org.zstack.sdk.IPsecL3NetworkRefInventory"); put("org.zstack.ipsec.IPsecPeerCidrInventory", "org.zstack.sdk.IPsecPeerCidrInventory"); put("org.zstack.kvm.APIKvmRunShellEvent$ShellResult", "org.zstack.sdk.ShellResult"); + put("org.zstack.kvm.BaseVirtualDeviceTO", "org.zstack.sdk.BaseVirtualDeviceTO"); + put("org.zstack.kvm.KVMAgentCommands$CdRomTO", "org.zstack.sdk.CdRomTO"); + put("org.zstack.kvm.KVMAgentCommands$IsoTO", "org.zstack.sdk.IsoTO"); + put("org.zstack.kvm.KVMAgentCommands$NicTO", "org.zstack.sdk.NicTO"); + put("org.zstack.kvm.KVMAgentCommands$VHostAddOn", "org.zstack.sdk.VHostAddOn"); put("org.zstack.kvm.KVMHostInventory", "org.zstack.sdk.KVMHostInventory"); put("org.zstack.kvm.KVMIsoTO", "org.zstack.sdk.KVMIsoTO"); + put("org.zstack.kvm.VolumeTO", "org.zstack.sdk.VolumeTO"); put("org.zstack.kvm.hypervisor.datatype.HostOsCategoryInventory", "org.zstack.sdk.HostOsCategoryInventory"); put("org.zstack.kvm.hypervisor.datatype.HypervisorVersionState", "org.zstack.sdk.HypervisorVersionState"); put("org.zstack.kvm.hypervisor.datatype.KvmHostHypervisorMetadataInventory", "org.zstack.sdk.KvmHostHypervisorMetadataInventory"); @@ -432,6 +498,18 @@ public class SourceClassMap { 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"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityClientUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientUsageView"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityServerUsageView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView"); + put("org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); + put("org.zstack.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.license.header.server.LicenseUsageView", "org.zstack.sdk.license.header.server.LicenseUsageView"); + put("org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView"); + 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.LogType", "org.zstack.sdk.LogType"); put("org.zstack.login.entity.LdapResourceRefInventory", "org.zstack.sdk.LdapResourceRefInventory"); put("org.zstack.loginControl.entity.AccessControlRuleInventory", "org.zstack.sdk.AccessControlRuleInventory"); put("org.zstack.loginControl.entity.ControlStrategy", "org.zstack.sdk.ControlStrategy"); @@ -456,8 +534,15 @@ public class SourceClassMap { put("org.zstack.nas.NasProtocolType", "org.zstack.sdk.NasProtocolType"); put("org.zstack.network.hostNetworkInterface.HostNetworkBondingInventory", "org.zstack.sdk.HostNetworkBondingInventory"); put("org.zstack.network.hostNetworkInterface.HostNetworkInterfaceInventory", "org.zstack.sdk.HostNetworkInterfaceInventory"); + put("org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory", "org.zstack.sdk.PhysicalSwitchInventory"); + put("org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory", "org.zstack.sdk.PhysicalSwitchPortInventory"); put("org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpInventory", "org.zstack.sdk.HostNetworkInterfaceLldpInventory"); put("org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefInventory", "org.zstack.sdk.HostNetworkInterfaceLldpRefInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterFabricInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterFabricInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterSdnControllerInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterSdnControllerInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterTenantInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterTenantInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterVRouterInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterVRouterInventory"); + put("org.zstack.network.huawei.imaster.HuaweiIMasterVpcInventory", "org.zstack.sdk.huawei.imaster.HuaweiIMasterVpcInventory"); put("org.zstack.network.l2.virtualSwitch.header.L2PortGroupNetworkInventory", "org.zstack.sdk.L2PortGroupNetworkInventory"); put("org.zstack.network.l2.virtualSwitch.header.L2PortGroupVlanMode", "org.zstack.sdk.L2PortGroupVlanMode"); put("org.zstack.network.l2.virtualSwitch.header.L2VirtualSwitchNetworkInventory", "org.zstack.sdk.L2VirtualSwitchNetworkInventory"); @@ -466,6 +551,8 @@ public class SourceClassMap { put("org.zstack.network.l2.vxlan.vxlanNetwork.L2VxlanNetworkInventory", "org.zstack.sdk.L2VxlanNetworkInventory"); put("org.zstack.network.l2.vxlan.vxlanNetworkPool.L2VxlanNetworkPoolInventory", "org.zstack.sdk.L2VxlanNetworkPoolInventory"); put("org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory", "org.zstack.sdk.VniRangeInventory"); + put("org.zstack.network.ovn.OvnControllerVmInstanceInventory", "org.zstack.sdk.OvnControllerVmInstanceInventory"); + put("org.zstack.network.ovn.OvnControllerVmOfferingInventory", "org.zstack.sdk.OvnControllerVmOfferingInventory"); put("org.zstack.network.securitygroup.SecurityGroupIngressRuleTO", "org.zstack.sdk.SecurityGroupIngressRuleTO"); put("org.zstack.network.securitygroup.SecurityGroupInventory", "org.zstack.sdk.SecurityGroupInventory"); put("org.zstack.network.securitygroup.SecurityGroupRuleInventory", "org.zstack.sdk.SecurityGroupRuleInventory"); @@ -499,6 +586,10 @@ public class SourceClassMap { put("org.zstack.network.service.virtualrouter.VirtualRouterOfferingInventory", "org.zstack.sdk.VirtualRouterOfferingInventory"); put("org.zstack.network.service.virtualrouter.VirtualRouterSoftwareVersionInventory", "org.zstack.sdk.VirtualRouterSoftwareVersionInventory"); put("org.zstack.network.service.virtualrouter.VirtualRouterVmInventory", "org.zstack.sdk.VirtualRouterVmInventory"); + put("org.zstack.observabilityServer.ObservabilityServerOfferingInventory", "org.zstack.sdk.ObservabilityServerOfferingInventory"); + put("org.zstack.observabilityServer.ObservabilityServerVmInventory", "org.zstack.sdk.ObservabilityServerVmInventory"); + put("org.zstack.observabilityServer.service.ObservabilityServerServiceDataInventory", "org.zstack.sdk.ObservabilityServerServiceDataInventory"); + put("org.zstack.observabilityServer.service.loadBalancer.LoadBalancerDataInventory", "org.zstack.sdk.LoadBalancerDataInventory"); put("org.zstack.ovf.datatype.ImagePackageInventory", "org.zstack.sdk.ImagePackageInventory"); put("org.zstack.ovf.datatype.ImagePackageState", "org.zstack.sdk.ImagePackageState"); put("org.zstack.ovf.datatype.OvfCdDriverInfo", "org.zstack.sdk.OvfCdDriverInfo"); @@ -525,7 +616,10 @@ public class SourceClassMap { put("org.zstack.pciDevice.PciDeviceState", "org.zstack.sdk.PciDeviceState"); put("org.zstack.pciDevice.PciDeviceStatus", "org.zstack.sdk.PciDeviceStatus"); put("org.zstack.pciDevice.PciDeviceType", "org.zstack.sdk.PciDeviceType"); + put("org.zstack.pciDevice.gpu.GpuAllocateStatus", "org.zstack.sdk.GpuAllocateStatus"); put("org.zstack.pciDevice.gpu.GpuDeviceInventory", "org.zstack.sdk.GpuDeviceInventory"); + put("org.zstack.pciDevice.gpu.GpuDeviceSpecInventory", "org.zstack.sdk.GpuDeviceSpecInventory"); + put("org.zstack.pciDevice.gpu.GpuVendor", "org.zstack.sdk.GpuVendor"); put("org.zstack.pciDevice.specification.mdev.MdevDeviceSpecInventory", "org.zstack.sdk.MdevDeviceSpecInventory"); put("org.zstack.pciDevice.specification.mdev.MdevDeviceSpecState", "org.zstack.sdk.MdevDeviceSpecState"); put("org.zstack.pciDevice.specification.mdev.PciDeviceMdevSpecRefInventory", "org.zstack.sdk.PciDeviceMdevSpecRefInventory"); @@ -548,12 +642,15 @@ public class SourceClassMap { put("org.zstack.policyRoute.PolicyRouteTableInventory", "org.zstack.sdk.PolicyRouteTableInventory"); put("org.zstack.policyRoute.PolicyRouteTableRouteEntryInventory", "org.zstack.sdk.PolicyRouteTableRouteEntryInventory"); put("org.zstack.policyRoute.PolicyRouteTableVRouterRefInventory", "org.zstack.sdk.PolicyRouteTableVRouterRefInventory"); + put("org.zstack.proxy.UserProxyConfigInventory", "org.zstack.sdk.UserProxyConfigInventory"); + put("org.zstack.proxy.UserProxyConfigResourceRefInventory", "org.zstack.sdk.UserProxyConfigResourceRefInventory"); put("org.zstack.resourceconfig.APIGetResourceBindableConfigReply$ResourceBindableConfigStruct", "org.zstack.sdk.ResourceBindableConfigStruct"); put("org.zstack.resourceconfig.ResourceConfigInventory", "org.zstack.sdk.ResourceConfigInventory"); put("org.zstack.resourceconfig.ResourceConfigStruct", "org.zstack.sdk.ResourceConfigStruct"); + put("org.zstack.sdnController.header.H3cSdnControllerTenantInventory", "org.zstack.sdk.H3cSdnControllerTenantInventory"); + put("org.zstack.sdnController.header.HardwareL2VxlanNetworkInventory", "org.zstack.sdk.HardwareL2VxlanNetworkInventory"); put("org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory"); - put("org.zstack.sdnController.header.SdnControllerInventory", "org.zstack.sdk.SdnControllerInventory"); - put("org.zstack.sdnController.header.SdnVniRange", "org.zstack.sdk.SdnVniRange"); + put("org.zstack.sdnController.header.SdnVlanRange", "org.zstack.sdk.SdnVlanRange"); put("org.zstack.snmp.agent.SnmpAgentInventory", "org.zstack.sdk.SnmpAgentInventory"); put("org.zstack.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sns.SNSApplicationEndpointInventory", "org.zstack.sdk.sns.SNSApplicationEndpointInventory"); @@ -571,16 +668,23 @@ public class SourceClassMap { put("org.zstack.sns.platform.feishu.SNSFeiShuEndpointInventory", "org.zstack.sdk.sns.platform.feishu.SNSFeiShuEndpointInventory"); put("org.zstack.sns.platform.http.SNSHttpEndpointInventory", "org.zstack.sdk.sns.platform.http.SNSHttpEndpointInventory"); put("org.zstack.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory", "org.zstack.sdk.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory"); + put("org.zstack.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sns.platform.snmp.SNSSnmpPlatformInventory", "org.zstack.sdk.sns.platform.snmp.SNSSnmpPlatformInventory"); put("org.zstack.sns.platform.universalsms.SNSUniversalSmsEndpointInventory", "org.zstack.sdk.sns.platform.universalsms.SNSUniversalSmsEndpointInventory"); put("org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); put("org.zstack.sns.platform.wecom.SNSWeComAtPersonInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComAtPersonInventory"); put("org.zstack.sns.platform.wecom.SNSWeComEndpointInventory", "org.zstack.sdk.sns.platform.wecom.SNSWeComEndpointInventory"); + put("org.zstack.sso.header.AttributePurpose", "org.zstack.sdk.AttributePurpose"); put("org.zstack.sso.header.CasClientInventory", "org.zstack.sdk.CasClientInventory"); put("org.zstack.sso.header.CasState", "org.zstack.sdk.CasState"); + put("org.zstack.sso.header.ExtendedAttribute", "org.zstack.sdk.ExtendedAttribute"); put("org.zstack.sso.header.OAuth2ClientInventory", "org.zstack.sdk.OAuth2ClientInventory"); put("org.zstack.sso.header.OAuth2TokenInventory", "org.zstack.sdk.OAuth2TokenInventory"); put("org.zstack.sso.header.RedirectUrlTemplate", "org.zstack.sdk.RedirectUrlTemplate"); + put("org.zstack.sso.header.RuleAttributeType", "org.zstack.sdk.RuleAttributeType"); + put("org.zstack.sso.header.SAML2ClientInventory", "org.zstack.sdk.SAML2ClientInventory"); + put("org.zstack.sso.header.SAML2State", "org.zstack.sdk.SAML2State"); + put("org.zstack.sso.header.SSOClientAttributeInventory", "org.zstack.sdk.SSOClientAttributeInventory"); put("org.zstack.sso.header.SSOClientInventory", "org.zstack.sdk.SSOClientInventory"); put("org.zstack.sso.header.SSORedirectTemplateInventory", "org.zstack.sdk.SSORedirectTemplateInventory"); put("org.zstack.sso.header.SSOServerTokenInventory", "org.zstack.sdk.SSOServerTokenInventory"); @@ -595,8 +699,16 @@ public class SourceClassMap { put("org.zstack.storage.ceph.primary.CephPrimaryStorageInventory", "org.zstack.sdk.CephPrimaryStorageInventory"); put("org.zstack.storage.ceph.primary.CephPrimaryStorageMonInventory", "org.zstack.sdk.CephPrimaryStorageMonInventory"); put("org.zstack.storage.ceph.primary.CephPrimaryStoragePoolInventory", "org.zstack.sdk.CephPrimaryStoragePoolInventory"); + put("org.zstack.storage.ceph.primary.KVMCephVolumeTO", "org.zstack.sdk.KVMCephVolumeTO"); + put("org.zstack.storage.ceph.primary.KVMCephVolumeTO$MonInfo", "org.zstack.sdk.MonInfo"); + put("org.zstack.storage.ceph.primary.KvmCephCdRomTO", "org.zstack.sdk.KvmCephCdRomTO"); + put("org.zstack.storage.ceph.primary.KvmCephCdRomTO$MonInfo", "org.zstack.sdk.MonInfo"); + put("org.zstack.storage.ceph.primary.KvmCephIsoTO", "org.zstack.sdk.KvmCephIsoTO"); + put("org.zstack.storage.ceph.primary.KvmCephIsoTO$MonInfo", "org.zstack.sdk.MonInfo"); put("org.zstack.storage.device.fibreChannel.FiberChannelLunInventory", "org.zstack.sdk.FiberChannelLunInventory"); put("org.zstack.storage.device.fibreChannel.FiberChannelStorageInventory", "org.zstack.sdk.FiberChannelStorageInventory"); + put("org.zstack.storage.device.hba.FcHbaDeviceInventory", "org.zstack.sdk.FcHbaDeviceInventory"); + put("org.zstack.storage.device.hba.HbaDeviceInventory", "org.zstack.sdk.HbaDeviceInventory"); put("org.zstack.storage.device.iscsi.IscsiLunInventory", "org.zstack.sdk.IscsiLunInventory"); put("org.zstack.storage.device.iscsi.IscsiServerClusterRefInventory", "org.zstack.sdk.IscsiServerClusterRefInventory"); put("org.zstack.storage.device.iscsi.IscsiServerInventory", "org.zstack.sdk.IscsiServerInventory"); @@ -607,6 +719,8 @@ public class SourceClassMap { put("org.zstack.storage.device.localRaid.RaidPhysicalDriveInventory", "org.zstack.sdk.RaidPhysicalDriveInventory"); put("org.zstack.storage.device.localRaid.RunningState", "org.zstack.sdk.RunningState"); put("org.zstack.storage.device.localRaid.SmartDataStruct", "org.zstack.sdk.SmartDataStruct"); + put("org.zstack.storage.device.multipath.DeviceTO", "org.zstack.sdk.DeviceTO"); + put("org.zstack.storage.device.multipath.MultipathTopologyStruct", "org.zstack.sdk.MultipathTopologyStruct"); put("org.zstack.storage.device.nvme.NvmeLunHostRefInventory", "org.zstack.sdk.NvmeLunHostRefInventory"); put("org.zstack.storage.device.nvme.NvmeLunInventory", "org.zstack.sdk.NvmeLunInventory"); put("org.zstack.storage.device.nvme.NvmeServerClusterRefInventory", "org.zstack.sdk.NvmeServerClusterRefInventory"); @@ -712,9 +826,6 @@ public class SourceClassMap { put("org.zstack.zwatch.datatype.AlarmData", "org.zstack.sdk.zwatch.datatype.AlarmData"); put("org.zstack.zwatch.datatype.AlarmDataV1", "org.zstack.sdk.zwatch.datatype.AlarmDataV1"); put("org.zstack.zwatch.datatype.AlarmDataV2", "org.zstack.sdk.zwatch.datatype.AlarmDataV2"); - put("org.zstack.zwatch.datatype.AuditData", "org.zstack.sdk.zwatch.datatype.AuditData"); - put("org.zstack.zwatch.datatype.AuditDataV1", "org.zstack.sdk.zwatch.datatype.AuditDataV1"); - put("org.zstack.zwatch.datatype.AuditDataV2", "org.zstack.sdk.zwatch.datatype.AuditDataV2"); put("org.zstack.zwatch.datatype.AuditType", "org.zstack.sdk.zwatch.datatype.AuditType"); put("org.zstack.zwatch.datatype.Datapoint", "org.zstack.sdk.zwatch.datatype.Datapoint"); put("org.zstack.zwatch.datatype.EmergencyLevel", "org.zstack.sdk.zwatch.datatype.EmergencyLevel"); @@ -792,7 +903,13 @@ public class SourceClassMap { put("org.zstack.sdk.AppBuildSystemInventory", "org.zstack.header.buildsystem.AppBuildSystemInventory"); put("org.zstack.sdk.AppBuildSystemZoneRefInventory", "org.zstack.header.buildsystem.AppBuildSystemZoneRefInventory"); put("org.zstack.sdk.ApplianceVmInventory", "org.zstack.appliancevm.ApplianceVmInventory"); + put("org.zstack.sdk.ApplicationDevelopmentServiceInventory", "org.zstack.ai.entity.ApplicationDevelopmentServiceInventory"); + put("org.zstack.sdk.ArchitectureImageMapping", "org.zstack.ai.message.ArchitectureImageMapping"); put("org.zstack.sdk.AttachTagResult", "org.zstack.tag2.AttachTagResult"); + put("org.zstack.sdk.AttributePurpose", "org.zstack.sso.header.AttributePurpose"); + put("org.zstack.sdk.AuditData", "org.zstack.header.zwatch.AuditData"); + put("org.zstack.sdk.AuditDataV1", "org.zstack.header.zwatch.AuditDataV1"); + put("org.zstack.sdk.AuditDataV2", "org.zstack.header.zwatch.AuditDataV2"); put("org.zstack.sdk.AutoScalingGroupActivityInventory", "org.zstack.autoscaling.group.activity.AutoScalingGroupActivityInventory"); put("org.zstack.sdk.AutoScalingGroupInstanceInventory", "org.zstack.autoscaling.group.instance.AutoScalingGroupInstanceInventory"); put("org.zstack.sdk.AutoScalingGroupInventory", "org.zstack.autoscaling.group.AutoScalingGroupInventory"); @@ -833,6 +950,7 @@ public class SourceClassMap { put("org.zstack.sdk.BaremetalNicInventory", "org.zstack.header.baremetal.network.BaremetalNicInventory"); put("org.zstack.sdk.BaremetalPxeServerInventory", "org.zstack.header.baremetal.pxeserver.BaremetalPxeServerInventory"); put("org.zstack.sdk.BaremetalVlanNicInventory", "org.zstack.header.baremetal.network.BaremetalVlanNicInventory"); + put("org.zstack.sdk.BaseVirtualDeviceTO", "org.zstack.kvm.BaseVirtualDeviceTO"); put("org.zstack.sdk.BatchDeleteVolumeSnapshotStruct", "org.zstack.header.storage.snapshot.BatchDeleteVolumeSnapshotStruct"); put("org.zstack.sdk.BillingInventory", "org.zstack.billing.generator.BillingInventory"); put("org.zstack.sdk.BlockPrimaryStorageInventory", "org.zstack.storage.primary.block.BlockPrimaryStorageInventory"); @@ -845,6 +963,10 @@ public class SourceClassMap { put("org.zstack.sdk.CSPSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.csp.CSPSecretResourcePoolInventory"); put("org.zstack.sdk.CasClientInventory", "org.zstack.sso.header.CasClientInventory"); put("org.zstack.sdk.CasState", "org.zstack.sso.header.CasState"); + put("org.zstack.sdk.CbtTaskInventory", "org.zstack.header.cbt.CbtTaskInventory"); + 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.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"); @@ -873,7 +995,13 @@ public class SourceClassMap { put("org.zstack.sdk.ConnectionRelationShipProperty", "org.zstack.header.aliyun.network.connection.ConnectionRelationShipProperty"); put("org.zstack.sdk.ConsoleInventory", "org.zstack.header.console.ConsoleInventory"); put("org.zstack.sdk.ConsoleProxyAgentInventory", "org.zstack.header.console.ConsoleProxyAgentInventory"); + put("org.zstack.sdk.ContainerBackupStorageInventory", "org.zstack.container.ContainerBackupStorageInventory"); + put("org.zstack.sdk.ContainerImageInventory", "org.zstack.container.entity.ContainerImageInventory"); + put("org.zstack.sdk.ContainerImageTagInventory", "org.zstack.container.entity.ContainerImageTagInventory"); + put("org.zstack.sdk.ContainerManagementEndpointInventory", "org.zstack.container.entity.ContainerManagementEndpointInventory"); + put("org.zstack.sdk.ContainerUsage", "org.zstack.container.ContainerUsage"); put("org.zstack.sdk.ControlStrategy", "org.zstack.loginControl.entity.ControlStrategy"); + put("org.zstack.sdk.CpuArchitecture", "org.zstack.header.host.CpuArchitecture"); put("org.zstack.sdk.CpuMemoryCapacityData", "org.zstack.header.allocator.datatypes.CpuMemoryCapacityData"); put("org.zstack.sdk.CreateDataVolumeTemplateFromVolumeSnapshotFailure", "org.zstack.header.image.APICreateDataVolumeTemplateFromVolumeSnapshotEvent$Failure"); put("org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotFailure", "org.zstack.header.image.APICreateRootVolumeTemplateFromVolumeSnapshotEvent$Failure"); @@ -884,7 +1012,10 @@ public class SourceClassMap { put("org.zstack.sdk.DataVolumeBillingInventory", "org.zstack.billing.generator.volume.data.DataVolumeBillingInventory"); put("org.zstack.sdk.DataVolumeSpending", "org.zstack.billing.spendingcalculator.volume.data.DataVolumeSpending"); put("org.zstack.sdk.DataVolumeSpendingInventory", "org.zstack.billing.spendingcalculator.volume.data.DataVolumeSpendingInventory"); + put("org.zstack.sdk.DatasetInventory", "org.zstack.ai.entity.DatasetInventory"); put("org.zstack.sdk.DeleteSnapshotGroupResult", "org.zstack.header.storage.snapshot.group.DeleteSnapshotGroupResult"); + put("org.zstack.sdk.DeviceAddress", "org.zstack.header.vm.devices.DeviceAddress"); + put("org.zstack.sdk.DeviceTO", "org.zstack.storage.device.multipath.DeviceTO"); put("org.zstack.sdk.DirectoryInventory", "org.zstack.directory.DirectoryInventory"); put("org.zstack.sdk.DiskOfferingInventory", "org.zstack.header.configuration.DiskOfferingInventory"); put("org.zstack.sdk.ESXHostInventory", "org.zstack.vmware.ESXHostInventory"); @@ -907,6 +1038,7 @@ public class SourceClassMap { put("org.zstack.sdk.EthernetVfStatus", "org.zstack.header.sriov.EthernetVfStatus"); put("org.zstack.sdk.EventLogInventory", "org.zstack.core.eventlog.EventLogInventory"); put("org.zstack.sdk.ExponBlockVolumeInventory", "org.zstack.header.volume.block.ExponBlockVolumeInventory"); + put("org.zstack.sdk.ExtendedAttribute", "org.zstack.sso.header.ExtendedAttribute"); put("org.zstack.sdk.ExternalBackupInventory", "org.zstack.externalbackup.ExternalBackupInventory"); put("org.zstack.sdk.ExternalBackupState", "org.zstack.externalbackup.ExternalBackupState"); put("org.zstack.sdk.ExternalBackupStorageInventory", "org.zstack.header.storage.addon.backup.ExternalBackupStorageInventory"); @@ -915,6 +1047,7 @@ public class SourceClassMap { put("org.zstack.sdk.ExternalServiceCapabilitiesBuilder", "org.zstack.core.externalservice.ExternalServiceCapabilitiesBuilder"); put("org.zstack.sdk.ExternalServiceInventory", "org.zstack.header.core.external.service.ExternalServiceInventory"); put("org.zstack.sdk.FaultToleranceVmGroupInventory", "org.zstack.faulttolerance.entity.FaultToleranceVmGroupInventory"); + put("org.zstack.sdk.FcHbaDeviceInventory", "org.zstack.storage.device.hba.FcHbaDeviceInventory"); put("org.zstack.sdk.FiSecSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.fiSec.FiSecSecretResourcePoolInventory"); put("org.zstack.sdk.FiSecSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.fiSec.FiSecSecurityMachineInventory"); put("org.zstack.sdk.FiberChannelLunInventory", "org.zstack.storage.device.fibreChannel.FiberChannelLunInventory"); @@ -930,16 +1063,22 @@ public class SourceClassMap { put("org.zstack.sdk.GlobalConfigInventory", "org.zstack.core.config.GlobalConfigInventory"); put("org.zstack.sdk.GlobalConfigOptions", "org.zstack.core.config.GlobalConfigOptions"); put("org.zstack.sdk.GlobalConfigTemplateInventory", "org.zstack.templateConfig.GlobalConfigTemplateInventory"); + put("org.zstack.sdk.GpuAllocateStatus", "org.zstack.pciDevice.gpu.GpuAllocateStatus"); put("org.zstack.sdk.GpuDeviceInventory", "org.zstack.pciDevice.gpu.GpuDeviceInventory"); + put("org.zstack.sdk.GpuDeviceSpecInventory", "org.zstack.pciDevice.gpu.GpuDeviceSpecInventory"); + put("org.zstack.sdk.GpuVendor", "org.zstack.pciDevice.gpu.GpuVendor"); put("org.zstack.sdk.GuestOsCharacterInventory", "org.zstack.core.config.GuestOsCharacterInventory"); put("org.zstack.sdk.GuestToolsInventory", "org.zstack.guesttools.GuestToolsInventory"); put("org.zstack.sdk.GuestToolsStateInventory", "org.zstack.guesttools.GuestToolsStateInventory"); put("org.zstack.sdk.GuestVmScriptExecutedRecordDetailInventory", "org.zstack.guesttools.GuestVmScriptExecutedRecordDetailInventory"); put("org.zstack.sdk.GuestVmScriptExecutedRecordInventory", "org.zstack.guesttools.GuestVmScriptExecutedRecordInventory"); put("org.zstack.sdk.GuestVmScriptInventory", "org.zstack.guesttools.GuestVmScriptInventory"); + put("org.zstack.sdk.H3cSdnControllerTenantInventory", "org.zstack.sdnController.header.H3cSdnControllerTenantInventory"); put("org.zstack.sdk.HaStrategyConditionInventory", "org.zstack.ha.HaStrategyConditionInventory"); put("org.zstack.sdk.HaiTaiSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.haitai.HaiTaiSecretResourcePoolInventory"); + put("org.zstack.sdk.HardwareL2VxlanNetworkInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkInventory"); put("org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory"); + put("org.zstack.sdk.HbaDeviceInventory", "org.zstack.storage.device.hba.HbaDeviceInventory"); put("org.zstack.sdk.HostConnectedStatus", "org.zstack.zops.HostConnectedStatus"); put("org.zstack.sdk.HostDiskCapacity", "org.zstack.storage.primary.local.APIGetLocalStorageHostDiskCapacityReply$HostDiskCapacity"); put("org.zstack.sdk.HostInventory", "org.zstack.header.host.HostInventory"); @@ -954,7 +1093,7 @@ public class SourceClassMap { put("org.zstack.sdk.HostNetworkInterfaceLldpInventory", "org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpInventory"); put("org.zstack.sdk.HostNetworkInterfaceLldpRefInventory", "org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefInventory"); put("org.zstack.sdk.HostNetworkInterfaceServiceRefInventory", "org.zstack.header.host.HostNetworkInterfaceServiceRefInventory"); - put("org.zstack.sdk.HostNetworkInterfaceServiceType", "org.zstack.header.host.HostNetworkInterfaceServiceType"); + put("org.zstack.sdk.HostNetworkLabelInventory", "org.zstack.header.host.HostNetworkLabelInventory"); put("org.zstack.sdk.HostOsCategoryInventory", "org.zstack.kvm.hypervisor.datatype.HostOsCategoryInventory"); put("org.zstack.sdk.HostPhysicalMemoryInventory", "org.zstack.header.host.HostPhysicalMemoryInventory"); put("org.zstack.sdk.HostSchedulingRuleGroupInventory", "org.zstack.header.vmscheduling.HostSchedulingRuleGroupInventory"); @@ -972,6 +1111,8 @@ public class SourceClassMap { put("org.zstack.sdk.IdentityZoneProperty", "org.zstack.header.identityzone.IdentityZoneProperty"); put("org.zstack.sdk.ImageBackupStorageRefInventory", "org.zstack.header.image.ImageBackupStorageRefInventory"); put("org.zstack.sdk.ImageCacheInventory", "org.zstack.header.storage.primary.ImageCacheInventory"); + put("org.zstack.sdk.ImageGroupInventory", "org.zstack.header.image.ImageGroupInventory"); + put("org.zstack.sdk.ImageGroupRefInventory", "org.zstack.header.image.ImageGroupRefInventory"); put("org.zstack.sdk.ImageInventory", "org.zstack.header.image.ImageInventory"); put("org.zstack.sdk.ImagePackageInventory", "org.zstack.ovf.datatype.ImagePackageInventory"); put("org.zstack.sdk.ImagePackageState", "org.zstack.ovf.datatype.ImagePackageState"); @@ -982,8 +1123,11 @@ public class SourceClassMap { put("org.zstack.sdk.ImageStoreImageStruct", "org.zstack.storage.backup.imagestore.ImageStoreImageStruct"); put("org.zstack.sdk.InfoSecSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecretResourcePoolInventory"); put("org.zstack.sdk.InfoSecSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.infoSec.InfoSecSecurityMachineInventory"); + put("org.zstack.sdk.InputType", "org.zstack.abstraction.OptionType$InputType"); put("org.zstack.sdk.InstallPathRecycleInventory", "org.zstack.header.core.trash.InstallPathRecycleInventory"); put("org.zstack.sdk.InstanceOfferingInventory", "org.zstack.header.configuration.InstanceOfferingInventory"); + put("org.zstack.sdk.InvocationRecord", "org.zstack.guesttools.InvocationRecord"); + put("org.zstack.sdk.InvocationRecordDetail", "org.zstack.guesttools.InvocationRecordDetail"); put("org.zstack.sdk.IpCapacityData", "org.zstack.header.network.l3.datatypes.IpCapacityData"); put("org.zstack.sdk.IpRangeInventory", "org.zstack.header.network.l3.IpRangeInventory"); put("org.zstack.sdk.IpRangeType", "org.zstack.header.network.l3.IpRangeType"); @@ -993,12 +1137,17 @@ public class SourceClassMap { put("org.zstack.sdk.IscsiServerClusterRefInventory", "org.zstack.storage.device.iscsi.IscsiServerClusterRefInventory"); put("org.zstack.sdk.IscsiServerInventory", "org.zstack.storage.device.iscsi.IscsiServerInventory"); put("org.zstack.sdk.IscsiTargetInventory", "org.zstack.storage.device.iscsi.IscsiTargetInventory"); + put("org.zstack.sdk.IsoTO", "org.zstack.kvm.KVMAgentCommands$IsoTO"); put("org.zstack.sdk.ItemInventory", "org.zstack.monitoring.items.ItemInventory"); put("org.zstack.sdk.JitSecurityMachineInventory", "org.zstack.crypto.securitymachine.thirdparty.jit.JitSecurityMachineInventory"); put("org.zstack.sdk.JobDetails", "org.zstack.header.image.APIGetUploadImageJobDetailsReply$JobDetails"); put("org.zstack.sdk.JsonLabelInventory", "org.zstack.core.jsonlabel.JsonLabelInventory"); + put("org.zstack.sdk.KVMCephVolumeTO", "org.zstack.storage.ceph.primary.KVMCephVolumeTO"); put("org.zstack.sdk.KVMHostInventory", "org.zstack.kvm.KVMHostInventory"); put("org.zstack.sdk.KVMIsoTO", "org.zstack.kvm.KVMIsoTO"); + put("org.zstack.sdk.KoAlSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.koal.KoAlSecretResourcePoolInventory"); + put("org.zstack.sdk.KvmCephCdRomTO", "org.zstack.storage.ceph.primary.KvmCephCdRomTO"); + put("org.zstack.sdk.KvmCephIsoTO", "org.zstack.storage.ceph.primary.KvmCephIsoTO"); put("org.zstack.sdk.KvmHostHypervisorMetadataInventory", "org.zstack.kvm.hypervisor.datatype.KvmHostHypervisorMetadataInventory"); put("org.zstack.sdk.KvmHypervisorInfoInventory", "org.zstack.kvm.hypervisor.datatype.KvmHypervisorInfoInventory"); put("org.zstack.sdk.L2NetworkData", "org.zstack.header.network.l2.L2NetworkData"); @@ -1016,6 +1165,7 @@ public class SourceClassMap { put("org.zstack.sdk.LdapServerInventory", "org.zstack.ldap.LdapServerInventory"); put("org.zstack.sdk.LicenseAddOnInventory", "org.zstack.license.LicenseAddOnInventory"); 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"); put("org.zstack.sdk.LoadBalancerListenerACLRefInventory", "org.zstack.network.service.lb.LoadBalancerListenerACLRefInventory"); put("org.zstack.sdk.LoadBalancerListenerCertificateRefInventory", "org.zstack.network.service.lb.LoadBalancerListenerCertificateRefInventory"); @@ -1028,10 +1178,15 @@ 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.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"); put("org.zstack.sdk.LunInventory", "org.zstack.header.storageDevice.LunInventory"); + put("org.zstack.sdk.MaaSUsage", "org.zstack.ai.message.MaaSUsage"); put("org.zstack.sdk.ManagementNodeInventory", "org.zstack.header.managementnode.ManagementNodeInventory"); put("org.zstack.sdk.MdevDeviceChooser", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceChooser"); put("org.zstack.sdk.MdevDeviceInventory", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceInventory"); @@ -1041,6 +1196,7 @@ public class SourceClassMap { put("org.zstack.sdk.MdevDeviceStatus", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceStatus"); put("org.zstack.sdk.MdevDeviceType", "org.zstack.pciDevice.virtual.vfio_mdev.MdevDeviceType"); put("org.zstack.sdk.MediaInventory", "org.zstack.monitoring.media.MediaInventory"); + put("org.zstack.sdk.MetaServerService", "org.zstack.ai.message.ModelCenterServiceInventory$MetaServerService"); put("org.zstack.sdk.MiniCandidateHostStruct", "org.zstack.header.bootstrap.MiniCandidateHostStruct"); put("org.zstack.sdk.MiniHostInfo", "org.zstack.header.bootstrap.MiniHostInfo"); put("org.zstack.sdk.MiniNetworkConfigStruct", "org.zstack.header.bootstrap.MiniNetworkConfigStruct"); @@ -1049,6 +1205,25 @@ public class SourceClassMap { put("org.zstack.sdk.MiniStorageResourceReplicationInventory", "org.zstack.storage.primary.ministorage.MiniStorageResourceReplicationInventory"); put("org.zstack.sdk.MiniStorageType", "org.zstack.storage.primary.ministorage.MiniStorageType"); put("org.zstack.sdk.MirrorNetworkUsedIpInventory", "org.zstack.header.portMirror.MirrorNetworkUsedIpInventory"); + put("org.zstack.sdk.ModelCenterCapacityInventory", "org.zstack.ai.entity.ModelCenterCapacityInventory"); + put("org.zstack.sdk.ModelCenterInventory", "org.zstack.ai.entity.ModelCenterInventory"); + put("org.zstack.sdk.ModelCenterServiceInventory", "org.zstack.ai.message.ModelCenterServiceInventory"); + put("org.zstack.sdk.ModelEvalServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelEvalServiceInstanceGroupInventory"); + put("org.zstack.sdk.ModelEvaluationTaskInventory", "org.zstack.ai.entity.ModelEvaluationTaskInventory"); + put("org.zstack.sdk.ModelInventory", "org.zstack.ai.entity.ModelInventory"); + put("org.zstack.sdk.ModelService", "org.zstack.ai.message.ModelService"); + put("org.zstack.sdk.ModelServiceGroupDatasetRefInventory", "org.zstack.ai.entity.ModelServiceGroupDatasetRefInventory"); + put("org.zstack.sdk.ModelServiceInstanceGroupInventory", "org.zstack.ai.entity.ModelServiceInstanceGroupInventory"); + put("org.zstack.sdk.ModelServiceInstanceInventory", "org.zstack.ai.entity.ModelServiceInstanceInventory"); + put("org.zstack.sdk.ModelServiceInventory", "org.zstack.ai.entity.ModelServiceInventory"); + put("org.zstack.sdk.ModelServiceMatchEntry", "org.zstack.ai.message.ModelServiceMatchEntry"); + put("org.zstack.sdk.ModelServiceMatchEntryName", "org.zstack.ai.message.ModelServiceMatchEntryName"); + put("org.zstack.sdk.ModelServiceMatchStatus", "org.zstack.ai.message.ModelServiceMatchStatus"); + put("org.zstack.sdk.ModelServiceRefInventory", "org.zstack.ai.entity.ModelServiceRefInventory"); + put("org.zstack.sdk.ModelServiceTemplateInventory", "org.zstack.ai.entity.ModelServiceTemplateInventory"); + put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KVMCephVolumeTO$MonInfo"); + put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KvmCephCdRomTO$MonInfo"); + put("org.zstack.sdk.MonInfo", "org.zstack.storage.ceph.primary.KvmCephIsoTO$MonInfo"); put("org.zstack.sdk.MonitorTriggerActionInventory", "org.zstack.monitoring.actions.MonitorTriggerActionInventory"); put("org.zstack.sdk.MonitorTriggerInventory", "org.zstack.monitoring.MonitorTriggerInventory"); put("org.zstack.sdk.MttyDeviceInventory", "org.zstack.mttyDevice.MttyDeviceInventory"); @@ -1059,15 +1234,20 @@ public class SourceClassMap { put("org.zstack.sdk.MulticastRouterInventory", "org.zstack.multicast.router.header.MulticastRouterInventory"); put("org.zstack.sdk.MulticastRouterRendezvousPointInventory", "org.zstack.multicast.router.header.MulticastRouterRendezvousPointInventory"); put("org.zstack.sdk.MulticastRouterVpcVRouterRefInventory", "org.zstack.multicast.router.header.MulticastRouterVpcVRouterRefInventory"); + put("org.zstack.sdk.MultipathTopologyStruct", "org.zstack.storage.device.multipath.MultipathTopologyStruct"); put("org.zstack.sdk.NasFileSystemInventory", "org.zstack.nas.NasFileSystemInventory"); put("org.zstack.sdk.NasMountTargetInventory", "org.zstack.nas.NasMountTargetInventory"); put("org.zstack.sdk.NasProtocolType", "org.zstack.nas.NasProtocolType"); + put("org.zstack.sdk.NativeClusterInventory", "org.zstack.container.entity.NativeClusterInventory"); + put("org.zstack.sdk.NativeHostInventory", "org.zstack.container.entity.NativeHostInventory"); put("org.zstack.sdk.Neighbor", "org.zstack.header.protocol.Neighbor"); put("org.zstack.sdk.NetworkReachablePair", "org.zstack.zops.NetworkReachablePair"); put("org.zstack.sdk.NetworkRouterAreaRefInventory", "org.zstack.header.protocol.NetworkRouterAreaRefInventory"); put("org.zstack.sdk.NetworkRouterFlowMeterRefInventory", "org.zstack.header.flowMeter.NetworkRouterFlowMeterRefInventory"); put("org.zstack.sdk.NetworkServiceL3NetworkRefInventory", "org.zstack.header.network.service.NetworkServiceL3NetworkRefInventory"); put("org.zstack.sdk.NetworkServiceProviderInventory", "org.zstack.header.network.service.NetworkServiceProviderInventory"); + put("org.zstack.sdk.NginxRedirectRule", "org.zstack.ai.NginxRedirectRule"); + put("org.zstack.sdk.NicTO", "org.zstack.kvm.KVMAgentCommands$NicTO"); put("org.zstack.sdk.NormalIpRangeInventory", "org.zstack.header.network.l3.NormalIpRangeInventory"); put("org.zstack.sdk.NvmeLunHostRefInventory", "org.zstack.storage.device.nvme.NvmeLunHostRefInventory"); put("org.zstack.sdk.NvmeLunInventory", "org.zstack.storage.device.nvme.NvmeLunInventory"); @@ -1076,6 +1256,10 @@ public class SourceClassMap { put("org.zstack.sdk.NvmeTargetInventory", "org.zstack.storage.device.nvme.NvmeTargetInventory"); put("org.zstack.sdk.OAuth2ClientInventory", "org.zstack.sso.header.OAuth2ClientInventory"); put("org.zstack.sdk.OAuth2TokenInventory", "org.zstack.sso.header.OAuth2TokenInventory"); + put("org.zstack.sdk.ObservabilityServerOfferingInventory", "org.zstack.observabilityServer.ObservabilityServerOfferingInventory"); + put("org.zstack.sdk.ObservabilityServerServiceDataInventory", "org.zstack.observabilityServer.service.ObservabilityServerServiceDataInventory"); + put("org.zstack.sdk.ObservabilityServerVmInventory", "org.zstack.observabilityServer.ObservabilityServerVmInventory"); + put("org.zstack.sdk.OptionType", "org.zstack.abstraction.OptionType"); put("org.zstack.sdk.OssBucketInventory", "org.zstack.header.aliyun.oss.OssBucketInventory"); put("org.zstack.sdk.OssBucketProperty", "org.zstack.header.aliyun.oss.OssBucketProperty"); put("org.zstack.sdk.OvfCdDriverInfo", "org.zstack.ovf.datatype.OvfCdDriverInfo"); @@ -1088,6 +1272,8 @@ public class SourceClassMap { put("org.zstack.sdk.OvfOSInfo", "org.zstack.ovf.datatype.OvfOSInfo"); put("org.zstack.sdk.OvfSystemInfo", "org.zstack.ovf.datatype.OvfSystemInfo"); put("org.zstack.sdk.OvfVolumeInfo", "org.zstack.ovf.datatype.OvfVolumeInfo"); + put("org.zstack.sdk.OvnControllerVmInstanceInventory", "org.zstack.network.ovn.OvnControllerVmInstanceInventory"); + put("org.zstack.sdk.OvnControllerVmOfferingInventory", "org.zstack.network.ovn.OvnControllerVmOfferingInventory"); put("org.zstack.sdk.PacketsForwardType", "org.zstack.vpcfirewall.entity.PacketsForwardType"); put("org.zstack.sdk.Pagination", "org.zstack.billing.Pagination"); put("org.zstack.sdk.PciDeviceBillingInventory", "org.zstack.billing.generator.pcidevice.PciDeviceBillingInventory"); @@ -1111,6 +1297,11 @@ public class SourceClassMap { put("org.zstack.sdk.PciDeviceVirtStatus", "org.zstack.pciDevice.virtual.PciDeviceVirtStatus"); put("org.zstack.sdk.PendingTaskInfo", "org.zstack.header.core.progress.PendingTaskInfo"); put("org.zstack.sdk.PhysicalDriveSmartSelfTestHistoryInventory", "org.zstack.storage.device.localRaid.PhysicalDriveSmartSelfTestHistoryInventory"); + put("org.zstack.sdk.PhysicalSwitchInventory", "org.zstack.network.hostNetworkInterface.PhysicalSwitchInventory"); + put("org.zstack.sdk.PhysicalSwitchPortInventory", "org.zstack.network.hostNetworkInterface.PhysicalSwitchPortInventory"); + put("org.zstack.sdk.PluginDriverInventory", "org.zstack.header.core.external.plugin.PluginDriverInventory"); + put("org.zstack.sdk.PluginSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.plugin.PluginSecretResourcePoolInventory"); + put("org.zstack.sdk.PodInventory", "org.zstack.container.entity.PodInventory"); put("org.zstack.sdk.PolicyInventory", "org.zstack.header.identity.PolicyInventory"); put("org.zstack.sdk.PolicyRouteRuleInventory", "org.zstack.policyRoute.PolicyRouteRuleInventory"); put("org.zstack.sdk.PolicyRouteRuleProtocol", "org.zstack.policyRoute.PolicyRouteRuleProtocol"); @@ -1122,7 +1313,7 @@ public class SourceClassMap { put("org.zstack.sdk.PolicyRouteTableRouteEntryInventory", "org.zstack.policyRoute.PolicyRouteTableRouteEntryInventory"); put("org.zstack.sdk.PolicyRouteTableVRouterRefInventory", "org.zstack.policyRoute.PolicyRouteTableVRouterRefInventory"); put("org.zstack.sdk.PolicyStatement", "org.zstack.header.identity.PolicyStatement"); - put("org.zstack.sdk.PolicyStatementEffect", "org.zstack.header.identity.StatementEffect"); + put("org.zstack.sdk.PolicyStatementEffect", "org.zstack.header.identity.PolicyStatementEffect"); put("org.zstack.sdk.PortForwardingRuleInventory", "org.zstack.network.service.portforwarding.PortForwardingRuleInventory"); put("org.zstack.sdk.PortMirrorInventory", "org.zstack.header.portMirror.PortMirrorInventory"); put("org.zstack.sdk.PortMirrorSessionInventory", "org.zstack.header.portMirror.PortMirrorSessionInventory"); @@ -1138,6 +1329,7 @@ public class SourceClassMap { put("org.zstack.sdk.PrimaryStorageHostStatus", "org.zstack.header.storage.primary.PrimaryStorageHostStatus"); put("org.zstack.sdk.PrimaryStorageInventory", "org.zstack.header.storage.primary.PrimaryStorageInventory"); put("org.zstack.sdk.ProgressProperty", "org.zstack.header.aliyun.image.ProgressProperty"); + put("org.zstack.sdk.ProjectRepositoryInventory", "org.zstack.container.entity.ProjectRepositoryInventory"); put("org.zstack.sdk.ProtocolType", "org.zstack.vpcfirewall.entity.ProtocolType"); put("org.zstack.sdk.PubIpVipBandwidthInBillingInventory", "org.zstack.billing.generator.pubip.vip.PubIpVipBandwidthInBillingInventory"); put("org.zstack.sdk.PubIpVipBandwidthOutBillingInventory", "org.zstack.billing.generator.pubip.vip.PubIpVipBandwidthOutBillingInventory"); @@ -1175,8 +1367,12 @@ public class SourceClassMap { put("org.zstack.sdk.RootVolumeSpending", "org.zstack.billing.spendingcalculator.volume.root.RootVolumeSpending"); put("org.zstack.sdk.RootVolumeSpendingInventory", "org.zstack.billing.spendingcalculator.volume.root.RootVolumeSpendingInventory"); put("org.zstack.sdk.RouterAreaInventory", "org.zstack.header.protocol.RouterAreaInventory"); + put("org.zstack.sdk.RuleAttributeType", "org.zstack.sso.header.RuleAttributeType"); put("org.zstack.sdk.RunningState", "org.zstack.storage.device.localRaid.RunningState"); put("org.zstack.sdk.RunningTaskInfo", "org.zstack.header.core.progress.RunningTaskInfo"); + put("org.zstack.sdk.SAML2ClientInventory", "org.zstack.sso.header.SAML2ClientInventory"); + put("org.zstack.sdk.SAML2State", "org.zstack.sso.header.SAML2State"); + put("org.zstack.sdk.SSOClientAttributeInventory", "org.zstack.sso.header.SSOClientAttributeInventory"); put("org.zstack.sdk.SSOClientInventory", "org.zstack.sso.header.SSOClientInventory"); put("org.zstack.sdk.SSORedirectTemplateInventory", "org.zstack.sso.header.SSORedirectTemplateInventory"); put("org.zstack.sdk.SSOServerTokenInventory", "org.zstack.sso.header.SSOServerTokenInventory"); @@ -1194,13 +1390,16 @@ public class SourceClassMap { put("org.zstack.sdk.ScsiLunHostRefInventory", "org.zstack.header.storageDevice.ScsiLunHostRefInventory"); put("org.zstack.sdk.ScsiLunInventory", "org.zstack.header.storageDevice.ScsiLunInventory"); put("org.zstack.sdk.ScsiLunVmInstanceRefInventory", "org.zstack.header.storageDevice.ScsiLunVmInstanceRefInventory"); - put("org.zstack.sdk.SdnControllerInventory", "org.zstack.sdnController.header.SdnControllerInventory"); - put("org.zstack.sdk.SdnVniRange", "org.zstack.sdnController.header.SdnVniRange"); + put("org.zstack.sdk.SdnControllerHostRefInventory", "org.zstack.header.network.sdncontroller.SdnControllerHostRefInventory"); + put("org.zstack.sdk.SdnControllerInventory", "org.zstack.header.network.sdncontroller.SdnControllerInventory"); + put("org.zstack.sdk.SdnControllerStatus", "org.zstack.header.network.sdncontroller.SdnControllerStatus"); + put("org.zstack.sdk.SdnVlanRange", "org.zstack.sdnController.header.SdnVlanRange"); put("org.zstack.sdk.SecretResourcePoolInventory", "org.zstack.header.securitymachine.SecretResourcePoolInventory"); put("org.zstack.sdk.SecurityGroupIngressRuleTO", "org.zstack.network.securitygroup.SecurityGroupIngressRuleTO"); put("org.zstack.sdk.SecurityGroupInventory", "org.zstack.network.securitygroup.SecurityGroupInventory"); put("org.zstack.sdk.SecurityGroupRuleInventory", "org.zstack.network.securitygroup.SecurityGroupRuleInventory"); put("org.zstack.sdk.SecurityMachineInventory", "org.zstack.header.securitymachine.SecurityMachineInventory"); + put("org.zstack.sdk.ServiceStatus", "org.zstack.ai.message.ModelCenterServiceInventory$ServiceStatus"); put("org.zstack.sdk.ServiceTypeStatisticData", "org.zstack.header.host.ServiceTypeStatisticData"); put("org.zstack.sdk.SessionInventory", "org.zstack.header.identity.SessionInventory"); put("org.zstack.sdk.SessionStatus", "org.zstack.header.portMirror.SessionStatus"); @@ -1238,6 +1437,7 @@ public class SourceClassMap { put("org.zstack.sdk.SshPrivateKeyPairInventory", "org.zstack.header.sshkeypair.SshPrivateKeyPairInventory"); put("org.zstack.sdk.StackParameters", "org.zstack.header.cloudformation.StackParameters"); put("org.zstack.sdk.StackTemplateInventory", "org.zstack.header.cloudformation.StackTemplateInventory"); + put("org.zstack.sdk.StorageType", "org.zstack.header.zdfs.StorageType"); put("org.zstack.sdk.SupportedResourceStruct", "org.zstack.header.cloudformation.SupportedResourceStruct"); put("org.zstack.sdk.SyncBackupResult", "org.zstack.header.storage.backup.SyncBackupResult"); put("org.zstack.sdk.SystemTagInventory", "org.zstack.header.tag.SystemTagInventory"); @@ -1248,6 +1448,7 @@ public class SourceClassMap { put("org.zstack.sdk.TaskProgressInventory", "org.zstack.header.core.progress.TaskProgressInventory"); put("org.zstack.sdk.TemplateConfigInventory", "org.zstack.templateConfig.TemplateConfigInventory"); put("org.zstack.sdk.Threshold", "org.zstack.drs.api.Threshold"); + put("org.zstack.sdk.TrainedModelRecordInventory", "org.zstack.ai.entity.TrainedModelRecordInventory"); put("org.zstack.sdk.TrashCleanupResult", "org.zstack.header.core.trash.TrashCleanupResult"); put("org.zstack.sdk.TwoFactorAuthenticationInventory", "org.zstack.twoFactorAuthentication.TwoFactorAuthenticationInventory"); put("org.zstack.sdk.TwoFactorAuthenticationSecretInventory", "org.zstack.twoFactorAuthentication.TwoFactorAuthenticationSecretInventory"); @@ -1260,6 +1461,8 @@ public class SourceClassMap { put("org.zstack.sdk.UsedIpInventory", "org.zstack.header.network.l3.UsedIpInventory"); put("org.zstack.sdk.UserGroupInventory", "org.zstack.header.identity.UserGroupInventory"); put("org.zstack.sdk.UserInventory", "org.zstack.header.identity.UserInventory"); + put("org.zstack.sdk.UserProxyConfigInventory", "org.zstack.proxy.UserProxyConfigInventory"); + put("org.zstack.sdk.UserProxyConfigResourceRefInventory", "org.zstack.proxy.UserProxyConfigResourceRefInventory"); put("org.zstack.sdk.UserTagInventory", "org.zstack.header.tag.UserTagInventory"); put("org.zstack.sdk.V2VConversionHostInventory", "org.zstack.v2v.V2VConversionHostInventory"); put("org.zstack.sdk.VCenterBackupStorageInventory", "org.zstack.vmware.VCenterBackupStorageInventory"); @@ -1269,6 +1472,7 @@ public class SourceClassMap { put("org.zstack.sdk.VCenterPrimaryStorageInventory", "org.zstack.vmware.VCenterPrimaryStorageInventory"); put("org.zstack.sdk.VCenterResourcePoolInventory", "org.zstack.vmware.VCenterResourcePoolInventory"); put("org.zstack.sdk.VCenterResourcePoolUsageInventory", "org.zstack.vmware.VCenterResourcePoolUsageInventory"); + put("org.zstack.sdk.VHostAddOn", "org.zstack.kvm.KVMAgentCommands$VHostAddOn"); put("org.zstack.sdk.VRouterRouteEntryAO", "org.zstack.vrouterRoute.VRouterRouteEntryAO"); put("org.zstack.sdk.VRouterRouteEntryInventory", "org.zstack.vrouterRoute.VRouterRouteEntryInventory"); put("org.zstack.sdk.VRouterRouteEntryType", "org.zstack.vrouterRoute.VRouterRouteEntryType"); @@ -1315,6 +1519,7 @@ public class SourceClassMap { put("org.zstack.sdk.VniRangeInventory", "org.zstack.network.l2.vxlan.vxlanNetworkPool.VniRangeInventory"); put("org.zstack.sdk.VolumeBackupInventory", "org.zstack.header.storage.backup.VolumeBackupInventory"); put("org.zstack.sdk.VolumeBackupStorageRefInventory", "org.zstack.header.storage.backup.VolumeBackupStorageRefInventory"); + put("org.zstack.sdk.VolumeCbtBackupInfo", "org.zstack.header.cbt.VolumeCbtBackupInfo"); put("org.zstack.sdk.VolumeExternalBackupInfo", "org.zstack.externalbackup.VolumeExternalBackupInfo"); put("org.zstack.sdk.VolumeFormatReplyStruct", "org.zstack.header.volume.APIGetVolumeFormatReply$VolumeFormatReplyStruct"); put("org.zstack.sdk.VolumeInventory", "org.zstack.header.volume.VolumeInventory"); @@ -1325,6 +1530,7 @@ public class SourceClassMap { put("org.zstack.sdk.VolumeSnapshotInventory", "org.zstack.header.storage.snapshot.VolumeSnapshotInventory"); put("org.zstack.sdk.VolumeSnapshotReferenceTreeInventory", "org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeInventory"); put("org.zstack.sdk.VolumeSnapshotTreeInventory", "org.zstack.header.storage.snapshot.VolumeSnapshotTreeInventory"); + put("org.zstack.sdk.VolumeTO", "org.zstack.kvm.VolumeTO"); put("org.zstack.sdk.VpcFirewallInventory", "org.zstack.vpcfirewall.entity.VpcFirewallInventory"); put("org.zstack.sdk.VpcFirewallIpSetTemplateInventory", "org.zstack.vpcfirewall.entity.VpcFirewallIpSetTemplateInventory"); put("org.zstack.sdk.VpcFirewallRuleInventory", "org.zstack.vpcfirewall.entity.VpcFirewallRuleInventory"); @@ -1366,15 +1572,25 @@ public class SourceClassMap { put("org.zstack.sdk.ZBoxVmBackupInfo", "org.zstack.externalbackup.zbox.ZBoxVmBackupInfo"); put("org.zstack.sdk.ZBoxVolumeBackupInfo", "org.zstack.externalbackup.zbox.ZBoxVolumeBackupInfo"); put("org.zstack.sdk.ZQLQueryReturn", "org.zstack.zql.ZQLQueryReturn"); + put("org.zstack.sdk.ZakuImageInventory", "org.zstack.container.entity.ZakuImageInventory"); + put("org.zstack.sdk.ZdfsInventory", "org.zstack.header.zdfs.ZdfsInventory"); + put("org.zstack.sdk.ZdfsService", "org.zstack.ai.message.ModelCenterServiceInventory$ZdfsService"); + put("org.zstack.sdk.ZdfsStorageInventory", "org.zstack.header.zdfs.ZdfsStorageInventory"); put("org.zstack.sdk.ZoneInventory", "org.zstack.header.zone.ZoneInventory"); put("org.zstack.sdk.databasebackup.DatabaseBackupInventory", "org.zstack.header.storage.database.backup.DatabaseBackupInventory"); put("org.zstack.sdk.databasebackup.DatabaseBackupStorageRefInventory", "org.zstack.header.storage.database.backup.DatabaseBackupStorageRefInventory"); put("org.zstack.sdk.databasebackup.DatabaseBackupStruct", "org.zstack.header.storage.database.backup.DatabaseBackupStruct"); put("org.zstack.sdk.databasebackup.DatabaseType", "org.zstack.header.storage.database.backup.DatabaseType"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterFabricInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterFabricInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterSdnControllerInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterSdnControllerInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterTenantInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterTenantInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterVRouterInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterVRouterInventory"); + put("org.zstack.sdk.huawei.imaster.HuaweiIMasterVpcInventory", "org.zstack.network.huawei.imaster.HuaweiIMasterVpcInventory"); put("org.zstack.sdk.iam2.api.APIPermissionStruct", "org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionMsg$APIPermissionStruct"); put("org.zstack.sdk.iam2.api.Attribute", "org.zstack.iam2.api.Attribute"); put("org.zstack.sdk.iam2.api.ErrorResult", "org.zstack.iam2.api.ErrorResult"); put("org.zstack.sdk.iam2.api.Permission", "org.zstack.iam2.api.APIGetIAM2VirtualIDAPIPermissionReply$Permission"); + put("org.zstack.sdk.iam2.container.ContainerClusterInventory", "org.zstack.iam2.container.ContainerClusterInventory"); put("org.zstack.sdk.iam2.entity.AttributeType", "org.zstack.iam2.entity.AttributeType"); put("org.zstack.sdk.iam2.entity.IAM2AttributeInventory", "org.zstack.iam2.entity.IAM2AttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2OrganizationAttributeInventory", "org.zstack.iam2.entity.IAM2OrganizationAttributeInventory"); @@ -1385,13 +1601,13 @@ public class SourceClassMap { put("org.zstack.sdk.iam2.entity.IAM2ProjectInventory", "org.zstack.iam2.entity.IAM2ProjectInventory"); put("org.zstack.sdk.iam2.entity.IAM2ProjectRoleInventory", "org.zstack.iam2.entity.IAM2ProjectRoleInventory"); put("org.zstack.sdk.iam2.entity.IAM2ProjectTemplateInventory", "org.zstack.iam2.entity.IAM2ProjectTemplateInventory"); + put("org.zstack.sdk.iam2.entity.IAM2State", "org.zstack.iam2.entity.IAM2State"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDAttributeInventory", "org.zstack.iam2.entity.IAM2VirtualIDAttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupAttributeInventory", "org.zstack.iam2.entity.IAM2VirtualIDGroupAttributeInventory"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDGroupInventory", "org.zstack.iam2.entity.IAM2VirtualIDGroupInventory"); put("org.zstack.sdk.iam2.entity.IAM2VirtualIDInventory", "org.zstack.iam2.entity.IAM2VirtualIDInventory"); put("org.zstack.sdk.iam2.entity.OrganizationType", "org.zstack.iam2.entity.OrganizationType"); put("org.zstack.sdk.iam2.entity.ProjectState", "org.zstack.iam2.entity.ProjectState"); - put("org.zstack.sdk.iam2.entity.State", "org.zstack.iam2.entity.State"); put("org.zstack.sdk.iam2.entity.StateEvent", "org.zstack.iam2.entity.StateEvent"); put("org.zstack.sdk.iam2.project.template.Template", "org.zstack.iam2.project.template.Template"); put("org.zstack.sdk.identity.role.RoleInventory", "org.zstack.header.identity.role.RoleInventory"); @@ -1400,6 +1616,14 @@ public class SourceClassMap { put("org.zstack.sdk.identity.role.RoleState", "org.zstack.header.identity.role.RoleState"); put("org.zstack.sdk.identity.role.RoleStateEvent", "org.zstack.header.identity.role.RoleStateEvent"); put("org.zstack.sdk.identity.role.RoleType", "org.zstack.header.identity.role.RoleType"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityClientAddOnUsageView"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityClientUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityClientUsageView"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory", "org.zstack.license.header.server.LicenseAuthorizedCapacityInventory"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView", "org.zstack.license.header.server.LicenseAuthorizedCapacityServerUsageView"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityUsageDetailView", "org.zstack.license.header.server.LicenseAuthorizedCapacityUsageDetailView"); + put("org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory", "org.zstack.license.header.server.LicenseAuthorizedNodeInventory"); + put("org.zstack.sdk.license.header.server.LicenseUsageView", "org.zstack.license.header.server.LicenseUsageView"); + put("org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView", "org.zstack.license.header.server.TotalLicenseAuthorizedCapacityView"); put("org.zstack.sdk.sns.SNSAliyunSmsEndpointInventory", "org.zstack.sns.SNSAliyunSmsEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationEndpointInventory", "org.zstack.sns.SNSApplicationEndpointInventory"); put("org.zstack.sdk.sns.SNSApplicationPlatformInventory", "org.zstack.sns.SNSApplicationPlatformInventory"); @@ -1416,6 +1640,7 @@ public class SourceClassMap { put("org.zstack.sdk.sns.platform.feishu.SNSFeiShuEndpointInventory", "org.zstack.sns.platform.feishu.SNSFeiShuEndpointInventory"); put("org.zstack.sdk.sns.platform.http.SNSHttpEndpointInventory", "org.zstack.sns.platform.http.SNSHttpEndpointInventory"); put("org.zstack.sdk.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory", "org.zstack.sns.platform.microsoftteams.SNSMicrosoftTeamsEndpointInventory"); + put("org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory", "org.zstack.sns.platform.plugin.SNSPluginEndpointInventory"); put("org.zstack.sdk.sns.platform.snmp.SNSSnmpPlatformInventory", "org.zstack.sns.platform.snmp.SNSSnmpPlatformInventory"); put("org.zstack.sdk.sns.platform.universalsms.SNSUniversalSmsEndpointInventory", "org.zstack.sns.platform.universalsms.SNSUniversalSmsEndpointInventory"); put("org.zstack.sdk.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory", "org.zstack.sns.platform.universalsms.supplier.emay.SNSEmaySmsEndpointInventory"); @@ -1458,9 +1683,6 @@ public class SourceClassMap { put("org.zstack.sdk.zwatch.datatype.AlarmData", "org.zstack.zwatch.datatype.AlarmData"); put("org.zstack.sdk.zwatch.datatype.AlarmDataV1", "org.zstack.zwatch.datatype.AlarmDataV1"); put("org.zstack.sdk.zwatch.datatype.AlarmDataV2", "org.zstack.zwatch.datatype.AlarmDataV2"); - put("org.zstack.sdk.zwatch.datatype.AuditData", "org.zstack.zwatch.datatype.AuditData"); - put("org.zstack.sdk.zwatch.datatype.AuditDataV1", "org.zstack.zwatch.datatype.AuditDataV1"); - put("org.zstack.sdk.zwatch.datatype.AuditDataV2", "org.zstack.zwatch.datatype.AuditDataV2"); put("org.zstack.sdk.zwatch.datatype.AuditType", "org.zstack.zwatch.datatype.AuditType"); put("org.zstack.sdk.zwatch.datatype.Datapoint", "org.zstack.zwatch.datatype.Datapoint"); put("org.zstack.sdk.zwatch.datatype.EmergencyLevel", "org.zstack.zwatch.datatype.EmergencyLevel"); diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java new file mode 100644 index 00000000000..08e28d31657 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointAction.java @@ -0,0 +1,125 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddContainerManagementEndpointAction 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.AddContainerManagementEndpointResult 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 name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerAccessKeyId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerAccessKeySecret; + + @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.AddContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.AddContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.AddContainerManagementEndpointResult() : 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 = "/container/management/endpoint"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java new file mode 100644 index 00000000000..3169461d14b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddContainerManagementEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementEndpointInventory; + +public class AddContainerManagementEndpointResult { + public ContainerManagementEndpointInventory inventory; + public void setInventory(ContainerManagementEndpointInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementEndpointInventory getInventory() { + return this.inventory; + } + +} 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..f938f7534db --- /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, 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/AddModelAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java new file mode 100644 index 00000000000..a43fcee825b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelAction.java @@ -0,0 +1,146 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddModelAction 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.AddModelResult 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 name; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String token; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String logo; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String introduction; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long size; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String version; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceUuids; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recommendedGpuNum; + + @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuConstraintDescription; + + @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.AddModelResult value = res.getResult(org.zstack.sdk.AddModelResult.class); + ret.value = value == null ? new org.zstack.sdk.AddModelResult() : 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/models"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java new file mode 100644 index 00000000000..a702c54b525 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterAction.java @@ -0,0 +1,140 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddModelCenterAction 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.AddModelCenterResult 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 name; + + @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 zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String storageNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerRegistry; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerNetwork; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerStorageNetwork; + + @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.AddModelCenterResult value = res.getResult(org.zstack.sdk.AddModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.AddModelCenterResult() : 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-centers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java new file mode 100644 index 00000000000..864cbd4013b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelCenterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelCenterInventory; + +public class AddModelCenterResult { + public ModelCenterInventory inventory; + public void setInventory(ModelCenterInventory inventory) { + this.inventory = inventory; + } + public ModelCenterInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelResult.java b/sdk/src/main/java/org/zstack/sdk/AddModelResult.java new file mode 100644 index 00000000000..2529872515c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelInventory; + +public class AddModelResult { + public ModelInventory inventory; + public void setInventory(ModelInventory inventory) { + this.inventory = inventory; + } + public ModelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java new file mode 100644 index 00000000000..3062782ee51 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceAction.java @@ -0,0 +1,170 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddModelServiceAction 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.AddModelServiceResult 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 name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String yaml; + + @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.Integer requestCpu; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long requestMemory; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuComputeCapability; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean system; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerArgs; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pythonVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String condaVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, validValues = {"Endpoint","FineTune","ModelEval","App"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type = "Endpoint"; + + @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String source = "Other"; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List architectureImages; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean supportDistributed; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map vendorToSpecUuidsMap; + + @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.AddModelServiceResult value = res.getResult(org.zstack.sdk.AddModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.AddModelServiceResult() : 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"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java new file mode 100644 index 00000000000..497746b4cdd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class AddModelServiceResult { + 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/AddPreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java index 07f59d47055..65513ccadaa 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddPreconfigurationTemplateAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String distribution; - @Param(required = true, validValues = {"kickstart","preseed","autoyast"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"kickstart","preseed","autoyast","autoinstall"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, maxLength = 16777215, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java new file mode 100644 index 00000000000..81fe1172958 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddProxyToResourceAction 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.AddProxyToResourceResult 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 proxyUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String resourceUuid; + + @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.AddProxyToResourceResult value = res.getResult(org.zstack.sdk.AddProxyToResourceResult.class); + ret.value = value == null ? new org.zstack.sdk.AddProxyToResourceResult() : 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 = "/proxy/{proxyUuid}/resource/{resourceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java new file mode 100644 index 00000000000..f9953be3428 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddProxyToResourceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.UserProxyConfigResourceRefInventory; + +public class AddProxyToResourceResult { + public UserProxyConfigResourceRefInventory inventory; + public void setInventory(UserProxyConfigResourceRefInventory inventory) { + this.inventory = inventory; + } + public UserProxyConfigResourceRefInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java index dd215c32e2c..8a03256cd95 100644 --- a/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/AddSdnControllerAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vendorType; + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendorVersion; + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; @@ -37,10 +40,10 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String ip; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String userName; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ApiResult.java b/sdk/src/main/java/org/zstack/sdk/ApiResult.java index 4fc044da405..f41aefa474d 100755 --- a/sdk/src/main/java/org/zstack/sdk/ApiResult.java +++ b/sdk/src/main/java/org/zstack/sdk/ApiResult.java @@ -115,7 +115,7 @@ public T getResult(Class clz) { } Object bean = getProperty(ret, path); - if (bean.getClass().getName().equals(dst)) { + if (bean == null || bean.getClass().getName().equals(dst)) { // not an inherent object continue; } @@ -128,6 +128,7 @@ public T getResult(Class clz) { return ret; } catch (Exception e) { + logger.log(Level.WARNING, "Warning: Exception occurred. Details: %s, Stack trace: %s", new Object[]{e.getMessage(), e.getStackTrace()}); throw new ApiException(e); } } diff --git a/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java new file mode 100644 index 00000000000..2bf4b9169a5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ApplicationDevelopmentServiceInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class ApplicationDevelopmentServiceInventory extends org.zstack.sdk.ModelServiceInstanceGroupInventory { + + public java.lang.String deploymentStatus; + public void setDeploymentStatus(java.lang.String deploymentStatus) { + this.deploymentStatus = deploymentStatus; + } + public java.lang.String getDeploymentStatus() { + return this.deploymentStatus; + } + + public ModelServiceInventory service; + public void setService(ModelServiceInventory service) { + this.service = service; + } + public ModelServiceInventory getService() { + return this.service; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java new file mode 100644 index 00000000000..bcce51854c0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ArchitectureImageMapping.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ArchitectureImageMapping { + + public java.lang.String cpuArchitecture; + public void setCpuArchitecture(java.lang.String cpuArchitecture) { + this.cpuArchitecture = cpuArchitecture; + } + public java.lang.String getCpuArchitecture() { + return this.cpuArchitecture; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java new file mode 100644 index 00000000000..55aef430174 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AttachServiceToObservabilityServerAction 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.AttachServiceToObservabilityServerResult 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 observabilityServerUuid; + + @Param(required = true, validValues = {"loadBalancer"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceUuid; + + @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.AttachServiceToObservabilityServerResult value = res.getResult(org.zstack.sdk.AttachServiceToObservabilityServerResult.class); + ret.value = value == null ? new org.zstack.sdk.AttachServiceToObservabilityServerResult() : 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 = "/observability-server/{observabilityServerUuid}/service"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java new file mode 100644 index 00000000000..e44bb9be0bb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttachServiceToObservabilityServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ObservabilityServerVmInventory; + +public class AttachServiceToObservabilityServerResult { + public ObservabilityServerVmInventory inventory; + public void setInventory(ObservabilityServerVmInventory inventory) { + this.inventory = inventory; + } + public ObservabilityServerVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AttributePurpose.java b/sdk/src/main/java/org/zstack/sdk/AttributePurpose.java new file mode 100644 index 00000000000..a5a0c75c526 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AttributePurpose.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum AttributePurpose { + Mapping, + Configuration, + Customize, +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditData.java b/sdk/src/main/java/org/zstack/sdk/AuditData.java similarity index 98% rename from sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditData.java rename to sdk/src/main/java/org/zstack/sdk/AuditData.java index 645325fb9e8..a08244cb7bd 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditData.java +++ b/sdk/src/main/java/org/zstack/sdk/AuditData.java @@ -1,4 +1,4 @@ -package org.zstack.sdk.zwatch.datatype; +package org.zstack.sdk; diff --git a/sdk/src/main/java/org/zstack/sdk/AuditDataV1.java b/sdk/src/main/java/org/zstack/sdk/AuditDataV1.java new file mode 100644 index 00000000000..950866d5e1f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AuditDataV1.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + + + +public class AuditDataV1 extends org.zstack.sdk.AuditData { + + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV2.java b/sdk/src/main/java/org/zstack/sdk/AuditDataV2.java similarity index 64% rename from sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV2.java rename to sdk/src/main/java/org/zstack/sdk/AuditDataV2.java index 41261faed36..4da10e95e9c 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV2.java +++ b/sdk/src/main/java/org/zstack/sdk/AuditDataV2.java @@ -1,8 +1,8 @@ -package org.zstack.sdk.zwatch.datatype; +package org.zstack.sdk; -public class AuditDataV2 extends org.zstack.sdk.zwatch.datatype.AuditData { +public class AuditDataV2 extends org.zstack.sdk.AuditData { public java.lang.String success; public void setSuccess(java.lang.String success) { diff --git a/sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java b/sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java new file mode 100644 index 00000000000..1b31a7c50d1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BaseVirtualDeviceTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + +import org.zstack.sdk.DeviceAddress; + +public class BaseVirtualDeviceTO { + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public DeviceAddress deviceAddress; + public void setDeviceAddress(DeviceAddress deviceAddress) { + this.deviceAddress = deviceAddress; + } + public DeviceAddress getDeviceAddress() { + return this.deviceAddress; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java new file mode 100644 index 00000000000..bead77e8f0a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class BindModelToServiceAction 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.BindModelToServiceResult 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 modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelServiceUuid; + + @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.BindModelToServiceResult value = res.getResult(org.zstack.sdk.BindModelToServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.BindModelToServiceResult() : 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/models/{modelUuid}/model-services/{modelServiceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java new file mode 100644 index 00000000000..7f317c25703 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/BindModelToServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class BindModelToServiceResult { + 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/CbtTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/CbtTaskInventory.java new file mode 100644 index 00000000000..6450fb1c861 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CbtTaskInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + +import org.zstack.sdk.CbtTaskStatus; + +public class CbtTaskInventory { + + 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 CbtTaskStatus status; + public void setStatus(CbtTaskStatus status) { + this.status = status; + } + public CbtTaskStatus getStatus() { + return this.status; + } + + 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; + } + + public java.util.List resourceRefs; + public void setResourceRefs(java.util.List resourceRefs) { + this.resourceRefs = resourceRefs; + } + public java.util.List getResourceRefs() { + return this.resourceRefs; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java new file mode 100644 index 00000000000..dd136193a56 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CbtTaskResourceRefInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class CbtTaskResourceRefInventory { + + public long id; + public void setId(long id) { + this.id = id; + } + public long getId() { + return this.id; + } + + public java.lang.String taskUuid; + public void setTaskUuid(java.lang.String taskUuid) { + this.taskUuid = taskUuid; + } + public java.lang.String getTaskUuid() { + return this.taskUuid; + } + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public java.lang.String resourceType; + public void setResourceType(java.lang.String resourceType) { + this.resourceType = resourceType; + } + public java.lang.String getResourceType() { + return this.resourceType; + } + + 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/CbtTaskStatus.java b/sdk/src/main/java/org/zstack/sdk/CbtTaskStatus.java new file mode 100644 index 00000000000..429d3017da9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CbtTaskStatus.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + +public enum CbtTaskStatus { + Created, + Running, + Stopped, + Failed, +} diff --git a/sdk/src/main/java/org/zstack/sdk/CdRomTO.java b/sdk/src/main/java/org/zstack/sdk/CdRomTO.java new file mode 100644 index 00000000000..f1bbe4b664e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CdRomTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class CdRomTO extends org.zstack.sdk.IsoTO { + + public boolean isEmpty; + public void setIsEmpty(boolean isEmpty) { + this.isEmpty = isEmpty; + } + public boolean getIsEmpty() { + return this.isEmpty; + } + + public int bootOrder; + public void setBootOrder(int bootOrder) { + this.bootOrder = bootOrder; + } + public int getBootOrder() { + return this.bootOrder; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java index 5e361df9267..4c88a13d4e4 100644 --- a/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ChangeLoadBalancerListenerAction.java @@ -70,7 +70,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,64L}, noTrim = false) public java.lang.Integer nbprocess; - @Param(required = false, validValues = {"http-keep-alive","http-server-close","http-tunnel","httpclose","forceclose"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"http-keep-alive","http-server-close","httpclose"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String httpMode; @Param(required = false, validValues = {"disable","iphash","insert","rewrite"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java new file mode 100644 index 00000000000..39edbc03474 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ChangeSdnControllerAction 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.ChangeSdnControllerResult 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 userName; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String password; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List vlanRanges; + + @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.ChangeSdnControllerResult value = res.getResult(org.zstack.sdk.ChangeSdnControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.ChangeSdnControllerResult() : 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 = "/sdn-controllers/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "changeSdnController"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java new file mode 100644 index 00000000000..543289e2381 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeSdnControllerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class ChangeSdnControllerResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java b/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java new file mode 100644 index 00000000000..a4020c83ca8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneImageAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CloneImageAction 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.CloneImageResult 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 imageUuid; + + @Param(required = false, validValues = {"DatabaseOnly"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String strategy = "DatabaseOnly"; + + @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.CloneImageResult value = res.getResult(org.zstack.sdk.CloneImageResult.class); + ret.value = value == null ? new org.zstack.sdk.CloneImageResult() : 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 = "/image/clone/{imageUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CloneImageResult.java b/sdk/src/main/java/org/zstack/sdk/CloneImageResult.java new file mode 100644 index 00000000000..32205ed5a0c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneImageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageInventory; + +public class CloneImageResult { + public ImageInventory inventory; + public void setInventory(ImageInventory inventory) { + this.inventory = inventory; + } + public ImageInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java new file mode 100644 index 00000000000..d8a876b518c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceAction.java @@ -0,0 +1,173 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CloneModelServiceAction 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.CloneModelServiceResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String readme; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public long size = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuComputeCapability; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerArgs; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pythonVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String condaVersion; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean system = false; + + @Param(required = false, validValues = {"Endpoint","FineTune","App","ModelEval"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String yaml; + + @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String source; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer requestCpu; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long requestMemory; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List cpuArchitectures; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List architectureImages; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean supportDistributed; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map vendorToSpecUuidsMap; + + @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.CloneModelServiceResult value = res.getResult(org.zstack.sdk.CloneModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.CloneModelServiceResult() : 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/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java new file mode 100644 index 00000000000..9a2f2b0692c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CloneModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class CloneModelServiceResult { + 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/ContainerBackupStorageInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerBackupStorageInventory.java new file mode 100644 index 00000000000..cfeacef4bae --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerBackupStorageInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ContainerBackupStorageInventory extends org.zstack.sdk.BackupStorageInventory { + + public java.lang.String endpointUuid; + public void setEndpointUuid(java.lang.String endpointUuid) { + this.endpointUuid = endpointUuid; + } + public java.lang.String getEndpointUuid() { + return this.endpointUuid; + } + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java new file mode 100644 index 00000000000..7e21e79ccfb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerImageInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ContainerImageInventory extends org.zstack.sdk.ImageInventory { + + public java.lang.String endpointUuid; + public void setEndpointUuid(java.lang.String endpointUuid) { + this.endpointUuid = endpointUuid; + } + public java.lang.String getEndpointUuid() { + return this.endpointUuid; + } + + public java.lang.String imageTag; + public void setImageTag(java.lang.String imageTag) { + this.imageTag = imageTag; + } + public java.lang.String getImageTag() { + return this.imageTag; + } + + public java.lang.String registryUrl; + public void setRegistryUrl(java.lang.String registryUrl) { + this.registryUrl = registryUrl; + } + public java.lang.String getRegistryUrl() { + return this.registryUrl; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerImageTagInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerImageTagInventory.java new file mode 100644 index 00000000000..33e02e08b4b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerImageTagInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class ContainerImageTagInventory { + + 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.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.lang.String sizeStr; + public void setSizeStr(java.lang.String sizeStr) { + this.sizeStr = sizeStr; + } + public java.lang.String getSizeStr() { + return this.sizeStr; + } + + public java.lang.String digest; + public void setDigest(java.lang.String digest) { + this.digest = digest; + } + public java.lang.String getDigest() { + return this.digest; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.String address; + public void setAddress(java.lang.String address) { + this.address = address; + } + public java.lang.String getAddress() { + return this.address; + } + + public java.lang.String pullCommand; + public void setPullCommand(java.lang.String pullCommand) { + this.pullCommand = pullCommand; + } + public java.lang.String getPullCommand() { + return this.pullCommand; + } + + public java.lang.String architectures; + public void setArchitectures(java.lang.String architectures) { + this.architectures = architectures; + } + public java.lang.String getArchitectures() { + return this.architectures; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ContainerManagementEndpointInventory.java b/sdk/src/main/java/org/zstack/sdk/ContainerManagementEndpointInventory.java new file mode 100644 index 00000000000..b28bc973dfb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerManagementEndpointInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + + + +public class ContainerManagementEndpointInventory { + + 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 java.lang.String accessKeyId; + public void setAccessKeyId(java.lang.String accessKeyId) { + this.accessKeyId = accessKeyId; + } + public java.lang.String getAccessKeyId() { + return this.accessKeyId; + } + + public java.lang.String managementIp; + public void setManagementIp(java.lang.String managementIp) { + this.managementIp = managementIp; + } + public java.lang.String getManagementIp() { + return this.managementIp; + } + + public java.lang.Integer managementPort; + public void setManagementPort(java.lang.Integer managementPort) { + this.managementPort = managementPort; + } + public java.lang.Integer getManagementPort() { + return this.managementPort; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + 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/ContainerUsage.java b/sdk/src/main/java/org/zstack/sdk/ContainerUsage.java new file mode 100644 index 00000000000..6bc567e2af8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ContainerUsage.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ContainerUsage { + + 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.Long value; + public void setValue(java.lang.Long value) { + this.value = value; + } + public java.lang.Long getValue() { + return this.value; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java b/sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java new file mode 100644 index 00000000000..63f24dc20de --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CpuArchitecture.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + +public enum CpuArchitecture { + x86_64, + aarch64, + mips64el, + loongarch64, +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java index 328f1f8c467..e6003930447 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAccountAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; - @Param(required = false, validValues = {"SystemAdmin","Normal"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"SystemAdmin","Normal","ThirdParty"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) @@ -110,6 +110,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java index 4c7a76b7c13..ddbea965e89 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateAiSiNoSecretResourcePoolAction.java @@ -58,7 +58,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java index 7c199b0d15e..9e35e8f2243 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCSPSecretResourcePoolAction.java @@ -55,7 +55,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java index 7984cf2897a..6dd4d9b91f8 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateCasClientAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String urlTemplate; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List attributes; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java new file mode 100644 index 00000000000..c9249b92997 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateCbtTaskAction 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.CreateCbtTaskResult 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, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @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.CreateCbtTaskResult value = res.getResult(org.zstack.sdk.CreateCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateCbtTaskResult() : 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 = "/cbt-task/create"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java new file mode 100644 index 00000000000..875cd38aec7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateCbtTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.CbtTaskInventory; + +public class CreateCbtTaskResult { + public CbtTaskInventory inventory; + public void setInventory(CbtTaskInventory inventory) { + this.inventory = inventory; + } + public CbtTaskInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java new file mode 100644 index 00000000000..25f3d108230 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateDatasetAction 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.CreateDatasetResult 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, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String token; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean system; + + @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.CreateDatasetResult value = res.getResult(org.zstack.sdk.CreateDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateDatasetResult() : 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/datasets"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java new file mode 100644 index 00000000000..c7606e63f59 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateDatasetResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.DatasetInventory; + +public class CreateDatasetResult { + public DatasetInventory inventory; + public void setInventory(DatasetInventory inventory) { + this.inventory = inventory; + } + public DatasetInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java index a8a51c5fd42..c9b526ce64b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFiSecSecretResourcePoolAction.java @@ -37,7 +37,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java index bbda5175ef9..32fea8d96e5 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateFlkSecSecretResourcePoolAction.java @@ -49,7 +49,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java index 399308a004a..fbc8c74c75e 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateGuestVmScriptAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 256, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = true, validValues = {"Base64","PlainText"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encodingType = "Base64"; + @Param(required = true, maxLength = 65536, minLength = 1, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java index 441bd4c8829..328f7318e51 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateHaiTaiSecretResourcePoolAction.java @@ -43,7 +43,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java new file mode 100644 index 00000000000..83211eb4a06 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateHostNetworkServiceTypeAction 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.CreateHostNetworkServiceTypeResult 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 = 128, nonempty = true, nullElements = false, emptyString = true, noTrim = true) + public java.lang.String serviceType; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public boolean system = false; + + @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.CreateHostNetworkServiceTypeResult value = res.getResult(org.zstack.sdk.CreateHostNetworkServiceTypeResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateHostNetworkServiceTypeResult() : 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 = "/hosts/service-types"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java new file mode 100644 index 00000000000..eb7ea596c98 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateHostNetworkServiceTypeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.HostNetworkLabelInventory; + +public class CreateHostNetworkServiceTypeResult { + public HostNetworkLabelInventory inventory; + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + public HostNetworkLabelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java new file mode 100644 index 00000000000..36958dbf1ee --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateImageGroupFromImageAction 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.CreateImageGroupFromImageResult 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 = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeTemplateUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeTemplateUuids; + + @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.CreateImageGroupFromImageResult value = res.getResult(org.zstack.sdk.CreateImageGroupFromImageResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateImageGroupFromImageResult() : 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 = "/imagegroup/from/image/{rootVolumeTemplateUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java new file mode 100644 index 00000000000..f3f294f5b35 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromImageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageGroupInventory; + +public class CreateImageGroupFromImageResult { + public ImageGroupInventory inventory; + public void setInventory(ImageGroupInventory inventory) { + this.inventory = inventory; + } + public ImageGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java new file mode 100644 index 00000000000..35f84d7b83e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateImageGroupFromSnapshotAction 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.CreateImageGroupFromSnapshotResult 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 = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeSnapshotUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeSnapshotUuids; + + @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.CreateImageGroupFromSnapshotResult value = res.getResult(org.zstack.sdk.CreateImageGroupFromSnapshotResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateImageGroupFromSnapshotResult() : 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 = "/imagegroup/from/snapshot/{rootVolumeSnapshotUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java new file mode 100644 index 00000000000..99afb167f15 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromSnapshotResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageGroupInventory; + +public class CreateImageGroupFromSnapshotResult { + public ImageGroupInventory inventory; + public void setInventory(ImageGroupInventory inventory) { + this.inventory = inventory; + } + public ImageGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java new file mode 100644 index 00000000000..8c68c3496fd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateImageGroupFromVmInstanceAction 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.CreateImageGroupFromVmInstanceResult 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 vmInstanceUuid; + + @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 = 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.CreateImageGroupFromVmInstanceResult value = res.getResult(org.zstack.sdk.CreateImageGroupFromVmInstanceResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateImageGroupFromVmInstanceResult() : 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 = "/images/groups/from/vm-instance"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java new file mode 100644 index 00000000000..5c9b0cc0e8b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateImageGroupFromVmInstanceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ImageGroupInventory; + +public class CreateImageGroupFromVmInstanceResult { + public ImageGroupInventory inventory; + public void setInventory(ImageGroupInventory inventory) { + this.inventory = inventory; + } + public ImageGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java index 3d5c96a2717..fc2c435101a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateInfoSecSecretResourcePoolAction.java @@ -37,7 +37,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java index 3a1c1c5e01c..75a4e95b3b3 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateJitSecretResourcePoolAction.java @@ -34,7 +34,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java new file mode 100644 index 00000000000..2a9614a5347 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateKoAlSecretResourcePoolAction.java @@ -0,0 +1,134 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateKoAlSecretResourcePoolAction 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.CreateSecretResourcePoolResult 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 = false) + public java.lang.String managementIp; + + @Param(required = false) + public java.lang.Integer port; + + @Param(required = false) + public java.lang.String secretKey; + + @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 = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @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.CreateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.CreateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateSecretResourcePoolResult() : 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 = "/secret-resource-pool/koal"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java index 603d3506380..7b6b891307a 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkAction.java @@ -31,6 +31,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String poolUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String h3cTenantUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,4095L}, noTrim = false) + public java.lang.Integer vlan; + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; @@ -46,7 +52,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java index 269c0b19dde..0f7fa343e3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2HardwareVxlanNetworkPoolAction.java @@ -43,7 +43,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java index 355c0cfd0d9..2ac4abbb515 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2NoVlanNetworkAction.java @@ -34,13 +34,13 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; - @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String physicalInterface; @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java index 981ee60bd47..981e1585b7d 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2PortGroupAction.java @@ -52,7 +52,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java index 3af1ada4724..7a6c60d0147 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2TfNetworkAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java index 3a0451b2d81..9bf1c6db389 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VirtualSwitchAction.java @@ -43,7 +43,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java index e98b837f6ce..76d3bed2ec6 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VlanNetworkAction.java @@ -37,13 +37,13 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String zoneUuid; - @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String physicalInterface; @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java index 31f561ad2eb..638c8256942 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkAction.java @@ -46,7 +46,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java index 3fe9b6746ec..b6af5df6ebc 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateL2VxlanNetworkPoolAction.java @@ -40,7 +40,7 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String type; - @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"LinuxBridge","OvsDpdk","MacVlan","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String vSwitchType = "LinuxBridge"; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java index 078e6ec60c3..95d00dc0678 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOAuthClientAction.java @@ -61,6 +61,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String identityProvider; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pluginUuid; + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String urlTemplate; @@ -70,6 +73,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List scopeList; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List attributes; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java new file mode 100644 index 00000000000..1718256febd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerAction.java @@ -0,0 +1,128 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateObservabilityServerAction 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.CreateObservabilityServerResult 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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String observabilityServerOfferingUuid; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + + @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.CreateObservabilityServerResult value = res.getResult(org.zstack.sdk.CreateObservabilityServerResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateObservabilityServerResult() : 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 = "/observability-servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java new file mode 100644 index 00000000000..4c8ac995430 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerOfferingAction.java @@ -0,0 +1,143 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateObservabilityServerOfferingAction 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.CreateInstanceOfferingResult 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 zoneUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementNetworkUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String publicNetworkUuid; + + @Param(required = false) + public java.lang.Boolean isDefault; + + @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, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,1024L}, noTrim = false) + public int cpuNum = 0; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long memorySize = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long reservedMemorySize = 0L; + + @Param(required = false) + public java.lang.String allocatorStrategy; + + @Param(required = false) + public int sortKey = 0; + + @Param(required = false) + public java.lang.String type; + + @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.CreateInstanceOfferingResult value = res.getResult(org.zstack.sdk.CreateInstanceOfferingResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateInstanceOfferingResult() : 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 = "/instance-offerings/observability-servers"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java new file mode 100644 index 00000000000..f222f70a45e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateObservabilityServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmInstanceInventory; + +public class CreateObservabilityServerResult { + public VmInstanceInventory inventory; + public void setInventory(VmInstanceInventory inventory) { + this.inventory = inventory; + } + public VmInstanceInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java new file mode 100644 index 00000000000..2df361d1b18 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerOfferingAction.java @@ -0,0 +1,137 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateOvnControllerOfferingAction 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.CreateInstanceOfferingResult 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 zoneUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementNetworkUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageUuid; + + @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, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,1024L}, noTrim = false) + public int cpuNum = 0; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long memorySize = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, numberRangeUnit = {"byte", "bytes"}, noTrim = false) + public long reservedMemorySize = 0L; + + @Param(required = false) + public java.lang.String allocatorStrategy; + + @Param(required = false) + public int sortKey = 0; + + @Param(required = false) + public java.lang.String type; + + @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.CreateInstanceOfferingResult value = res.getResult(org.zstack.sdk.CreateInstanceOfferingResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateInstanceOfferingResult() : 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 = "/instance-offerings/ovn"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java new file mode 100644 index 00000000000..a7980599395 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java @@ -0,0 +1,191 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateOvnControllerVmAction 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.CreateOvnControllerVmResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String instanceOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, noTrim = false) + public java.lang.Long reservedMemorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String imageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmNicParams; + + @Param(required = false, validValues = {"UserVm","ApplianceVm"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataDiskSizes; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataDiskOfferingUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuidForRootVolume; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false) + public java.lang.String defaultL3NetworkUuid; + + @Param(required = false, validValues = {"InstantStart","JustCreate","CreateStopped"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String strategy = "InstantStart"; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List rootVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeSystemTags; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map dataVolumeSystemTagsOnIndex; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List sshKeyPairUuids; + + @Param(required = false, validValues = {"Linux","Windows","Other","Paravirtualization","WindowsVirtio"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String platform; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String guestOsType; + + @Param(required = false, validValues = {"x86_64","aarch64","mips64el","loongarch64"}, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String architecture; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean virtio; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List diskAOs; + + @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.CreateOvnControllerVmResult value = res.getResult(org.zstack.sdk.CreateOvnControllerVmResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateOvnControllerVmResult() : 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 = "/ovn/instances"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java new file mode 100644 index 00000000000..0626381448e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ApplianceVmInventory; + +public class CreateOvnControllerVmResult { + public ApplianceVmInventory inventory; + public void setInventory(ApplianceVmInventory inventory) { + this.inventory = inventory; + } + public ApplianceVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java new file mode 100644 index 00000000000..1f16a69d019 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreatePluginSecretResourcePoolAction.java @@ -0,0 +1,131 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreatePluginSecretResourcePoolAction 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.CreateSecretResourcePoolResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map properties; + + @Param(required = false, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pluginDriverUuid; + + @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 = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @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.CreateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.CreateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateSecretResourcePoolResult() : 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 = "/secret-resource-pool/plugin"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java index 63f337152f5..93e3698cd11 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreatePolicyAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java new file mode 100644 index 00000000000..1198122f6a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientAction.java @@ -0,0 +1,125 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateSAML2ClientAction 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.CreateSAML2ClientResult 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 name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String idpMetadataBase64; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String redirectUrl; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String loginType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String urlTemplate; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List attributes; + + @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.CreateSAML2ClientResult value = res.getResult(org.zstack.sdk.CreateSAML2ClientResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateSAML2ClientResult() : 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 = "/create/saml2/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java new file mode 100644 index 00000000000..aa742483a44 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateSAML2ClientResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SAML2ClientInventory; + +public class CreateSAML2ClientResult { + public SAML2ClientInventory inventory; + public void setInventory(SAML2ClientInventory inventory) { + this.inventory = inventory; + } + public SAML2ClientInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java index c670de70dd4..6ccfbcdd68c 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSanSecSecretResourcePoolAction.java @@ -55,7 +55,10 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String model; - @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"All","DataCrypto","Auth"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String ability; + + @Param(required = true, validValues = {"CloudSecurityMachine","OrdinarySecurityMachine","CloudSecurityResourceService","SecureSignVerifyService","Plugin"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java b/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java index 717beaac61f..44282d9e374 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateSecurityGroupAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = false, validValues = {"4","6"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer ipVersion; + @Param(required = false, validValues = {"LinuxBridge","OvnDpdk"}, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "LinuxBridge"; + @Param(required = false) public java.lang.String resourceUuid; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java new file mode 100644 index 00000000000..bdebdbba383 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigAction.java @@ -0,0 +1,131 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateUserProxyConfigAction 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.CreateUserProxyConfigResult 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 proxyType; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyHost; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer proxyPort; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyUsername; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyPassword; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean isEnabled; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyProtocolVersion; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean useSsl; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String noProxy; + + @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.CreateUserProxyConfigResult value = res.getResult(org.zstack.sdk.CreateUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateUserProxyConfigResult() : 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 = "/user-proxy-configs"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java new file mode 100644 index 00000000000..2ca36748694 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateUserProxyConfigResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.UserProxyConfigInventory; + +public class CreateUserProxyConfigResult { + public UserProxyConfigInventory inventory; + public void setInventory(UserProxyConfigInventory inventory) { + this.inventory = inventory; + } + public UserProxyConfigInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java b/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java new file mode 100644 index 00000000000..69706e35dad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DatasetInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class DatasetInventory { + + 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 java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String modelCenterUuid; + public void setModelCenterUuid(java.lang.String modelCenterUuid) { + this.modelCenterUuid = modelCenterUuid; + } + public java.lang.String getModelCenterUuid() { + return this.modelCenterUuid; + } + + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.lang.Boolean system; + public void setSystem(java.lang.Boolean system) { + this.system = system; + } + public java.lang.Boolean getSystem() { + return this.system; + } + + 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/DeleteAccountAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java index 61df036b45f..613571787f4 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteAccountAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java new file mode 100644 index 00000000000..d0c3b70c57b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteCbtTaskAction 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.DeleteCbtTaskResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean force = false; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.DeleteCbtTaskResult value = res.getResult(org.zstack.sdk.DeleteCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteCbtTaskResult() : 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 = "/cbt-task/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java new file mode 100644 index 00000000000..78337efbde6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteCbtTaskResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteCbtTaskResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java new file mode 100644 index 00000000000..1029c2aae8b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteContainerManagementEndpointAction 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.DeleteContainerManagementEndpointResult 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.lang.String deleteMode = "Permissive"; + + @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.DeleteContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.DeleteContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteContainerManagementEndpointResult() : 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 = "/container/management/endpoint/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java new file mode 100644 index 00000000000..b3efa9b8344 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementEndpointResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteContainerManagementEndpointResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java new file mode 100644 index 00000000000..cc985b4de56 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerManagementVmResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteContainerManagementVmResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java new file mode 100644 index 00000000000..c1ec0b8112e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteContainerResourceFromEndpointAction 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.DeleteContainerResourceFromEndpointResult 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.DeleteContainerResourceFromEndpointResult value = res.getResult(org.zstack.sdk.DeleteContainerResourceFromEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteContainerResourceFromEndpointResult() : 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 = "/container/management/endpoint/{uuid}/resources/delete"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java new file mode 100644 index 00000000000..fbbbde268be --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteContainerResourceFromEndpointResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteContainerResourceFromEndpointResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java new file mode 100644 index 00000000000..e7882d00fbf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteDatasetAction 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.DeleteDatasetResult 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.DeleteDatasetResult value = res.getResult(org.zstack.sdk.DeleteDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteDatasetResult() : 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 = "/ai/datasets/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java new file mode 100644 index 00000000000..7fe3e10efb2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteDatasetResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java new file mode 100644 index 00000000000..f17d73b43a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteDatasetsAction 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.DeleteDatasetsResult 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.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.DeleteDatasetsResult value = res.getResult(org.zstack.sdk.DeleteDatasetsResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteDatasetsResult() : 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 = "/ai/datasets"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java new file mode 100644 index 00000000000..5220fc742ba --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteDatasetsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteDatasetsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java new file mode 100644 index 00000000000..63244fb2abf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHostNetworkServiceTypeAction 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.DeleteHostNetworkServiceTypeResult 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.lang.String deleteMode = "Permissive"; + + @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.DeleteHostNetworkServiceTypeResult value = res.getResult(org.zstack.sdk.DeleteHostNetworkServiceTypeResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteHostNetworkServiceTypeResult() : 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 = "/hosts/service-types/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java new file mode 100644 index 00000000000..5261696a940 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteHostNetworkServiceTypeResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteHostNetworkServiceTypeResult { + +} 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/DeleteModelAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java new file mode 100644 index 00000000000..1780cbfbd32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelAction 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.DeleteModelResult 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.lang.String deleteMode = "Permissive"; + + @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.DeleteModelResult value = res.getResult(org.zstack.sdk.DeleteModelResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelResult() : 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 = "/ai/models/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java new file mode 100644 index 00000000000..32701153611 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelCenterAction 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.DeleteModelCenterResult 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.lang.String deleteMode = "Permissive"; + + @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.DeleteModelCenterResult value = res.getResult(org.zstack.sdk.DeleteModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelCenterResult() : 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 = "/ai/model-centers/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java new file mode 100644 index 00000000000..8cbcde8746d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelCenterResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelCenterResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java new file mode 100644 index 00000000000..bc292a0fbce --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelEvaluationTaskAction 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.DeleteModelEvaluationTaskResult 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.DeleteModelEvaluationTaskResult value = res.getResult(org.zstack.sdk.DeleteModelEvaluationTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelEvaluationTaskResult() : 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 = "/model-evaluation-tasks/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java new file mode 100644 index 00000000000..8f3eac1a71a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTaskResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelEvaluationTaskResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java new file mode 100644 index 00000000000..37deb38410a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelEvaluationTasksAction 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.DeleteModelEvaluationTasksResult 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.util.List uuids; + + @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.DeleteModelEvaluationTasksResult value = res.getResult(org.zstack.sdk.DeleteModelEvaluationTasksResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelEvaluationTasksResult() : 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 = "/model-evaluation-tasks"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java new file mode 100644 index 00000000000..9da05d4467e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelEvaluationTasksResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelEvaluationTasksResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java new file mode 100644 index 00000000000..6c11a38d71f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java new file mode 100644 index 00000000000..1126bcc2fad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServiceAction 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.DeleteModelServiceResult 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.lang.String deleteMode = "Permissive"; + + @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.DeleteModelServiceResult value = res.getResult(org.zstack.sdk.DeleteModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServiceResult() : 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 = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java new file mode 100644 index 00000000000..91655983c29 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServiceInstanceGroupAction 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.DeleteModelServiceInstanceGroupResult 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.lang.String deleteMode = "Permissive"; + + @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.DeleteModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.DeleteModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServiceInstanceGroupResult() : 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 = "/ai/model-services/instances/groups/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java new file mode 100644 index 00000000000..cc1cd6e757d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelServiceInstanceGroupResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java new file mode 100644 index 00000000000..ffaf6fb2630 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServiceInstanceGroupsAction 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.DeleteModelServiceInstanceGroupsResult 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.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.DeleteModelServiceInstanceGroupsResult value = res.getResult(org.zstack.sdk.DeleteModelServiceInstanceGroupsResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServiceInstanceGroupsResult() : 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 = "/ai/model-services/instances/groups"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java new file mode 100644 index 00000000000..0c3800e5a4e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceInstanceGroupsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelServiceInstanceGroupsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java new file mode 100644 index 00000000000..cff27f53825 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServiceResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteModelServiceResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java new file mode 100644 index 00000000000..d8097c94c08 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelServicesAction 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.DeleteModelServicesResult 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.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.DeleteModelServicesResult value = res.getResult(org.zstack.sdk.DeleteModelServicesResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelServicesResult() : 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 = "/ai/model-services/"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java new file mode 100644 index 00000000000..5cf3f58417c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelServicesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelServicesResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java new file mode 100644 index 00000000000..7a97a4c55ee --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelsAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteModelsAction 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.DeleteModelsResult 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.util.List uuids; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.DeleteModelsResult value = res.getResult(org.zstack.sdk.DeleteModelsResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteModelsResult() : 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 = "/ai/models"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java new file mode 100644 index 00000000000..dda7c271701 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteModelsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class DeleteModelsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java new file mode 100644 index 00000000000..82c84c6b842 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeletePluginDriversAction 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.DeletePluginDriversResult 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.lang.String deleteMode = "Permissive"; + + @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.DeletePluginDriversResult value = res.getResult(org.zstack.sdk.DeletePluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.DeletePluginDriversResult() : 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 = "/external/plugins/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java new file mode 100644 index 00000000000..c7038dbde86 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeletePluginDriversResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeletePluginDriversResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java index 3ffa27d047b..8082295e2dd 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeletePolicyAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java new file mode 100644 index 00000000000..1d3f4d29657 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteUserProxyConfigAction 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.DeleteUserProxyConfigResult 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.DeleteUserProxyConfigResult value = res.getResult(org.zstack.sdk.DeleteUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteUserProxyConfigResult() : 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 = "/user-proxy-configs/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java new file mode 100644 index 00000000000..3408c80b6df --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteUserProxyConfigResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteUserProxyConfigResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java index 4d2808cf2e0..f582c762165 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotAction.java @@ -28,6 +28,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false, validValues = {"pull","commit","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String direction = "auto"; + + @Param(required = false, validValues = {"single","chain","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String scope = "chain"; + @Param(required = false) public java.lang.String deleteMode = "Permissive"; diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java index 9d76314eef5..e4a183f38b0 100644 --- a/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVolumeSnapshotGroupAction.java @@ -28,6 +28,12 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; + @Param(required = false, validValues = {"pull","commit","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String direction = "auto"; + + @Param(required = false, validValues = {"single","chain","auto"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String scope = "chain"; + @Param(required = false) public java.lang.String deleteMode = "Permissive"; diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java new file mode 100644 index 00000000000..2ab7e2b846e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceAction.java @@ -0,0 +1,170 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployAppDevelopmentServiceAction 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.DeployAppDevelopmentServiceResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @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.DeployAppDevelopmentServiceResult value = res.getResult(org.zstack.sdk.DeployAppDevelopmentServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployAppDevelopmentServiceResult() : 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 = "/ai/model-services/app/"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployAppDevelopmentService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java new file mode 100644 index 00000000000..6ca470937a2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployAppDevelopmentServiceResult.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; +import org.zstack.sdk.ApplicationDevelopmentServiceInventory; + +public class DeployAppDevelopmentServiceResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + + public ApplicationDevelopmentServiceInventory app; + public void setApp(ApplicationDevelopmentServiceInventory app) { + this.app = app; + } + public ApplicationDevelopmentServiceInventory getApp() { + return this.app; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java new file mode 100644 index 00000000000..82c263bde6d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployDistributedModelServiceAction 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.DeployDistributedModelServiceResult 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 = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServices; + + @Param(required = true, validValues = {"parallel","sequential"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceCreationStrategy; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @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.DeployDistributedModelServiceResult value = res.getResult(org.zstack.sdk.DeployDistributedModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployDistributedModelServiceResult() : 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 = "/ai/model-services"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployDistributedModelService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java new file mode 100644 index 00000000000..cbfea19a3f5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployDistributedModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; + +public class DeployDistributedModelServiceResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java new file mode 100644 index 00000000000..bf4c6abc18b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceAction.java @@ -0,0 +1,221 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployModelEvalServiceAction 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.DeployModelEvalServiceResult 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, validValues = {"Performance","Capability"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String taskType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer limits; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float temperature; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer topK; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float topP; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer maxNewTokens; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Float repetitionPenalty; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {128L,128000L}, noTrim = false) + public java.lang.Integer maxLength; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String prompt; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,1024L}, noTrim = false) + public java.lang.Integer parallel; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {5L,300L}, noTrim = false) + public java.lang.Integer logEveryQuery; + + @Param(required = false, validValues = {"openai","dashscope"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String api; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map requestHeaders; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {5L,120L}, noTrim = false) + public java.lang.Integer connectTimeout; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {5L,120L}, noTrim = false) + public java.lang.Integer readTimeout; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @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.DeployModelEvalServiceResult value = res.getResult(org.zstack.sdk.DeployModelEvalServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployModelEvalServiceResult() : 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 = "/ai/model-services/eval/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployModelEvalService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java new file mode 100644 index 00000000000..501486c9f89 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelEvalServiceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelEvalServiceInstanceGroupInventory; + +public class DeployModelEvalServiceResult { + public ModelEvalServiceInstanceGroupInventory inventory; + public void setInventory(ModelEvalServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelEvalServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + + public java.util.List tasks; + public void setTasks(java.util.List tasks) { + this.tasks = tasks; + } + public java.util.List getTasks() { + return this.tasks; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java new file mode 100644 index 00000000000..61ee4158818 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceAction.java @@ -0,0 +1,170 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeployModelServiceAction 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.DeployModelServiceResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @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.DeployModelServiceResult value = res.getResult(org.zstack.sdk.DeployModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.DeployModelServiceResult() : 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 = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "deployModelService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java new file mode 100644 index 00000000000..732adf29722 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeployModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; + +public class DeployModelServiceResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java b/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java index d7416c51428..4279f0a6b6a 100644 --- a/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/DetachPriceTableFromAccountAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java new file mode 100644 index 00000000000..7e4761f8d5e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DetachServiceFromObservabilityServerAction 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.DetachServiceFromObservabilityServerResult 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 observabilityServerUuid; + + @Param(required = true, validValues = {"loadBalancer"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceUuid; + + @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.DetachServiceFromObservabilityServerResult value = res.getResult(org.zstack.sdk.DetachServiceFromObservabilityServerResult.class); + ret.value = value == null ? new org.zstack.sdk.DetachServiceFromObservabilityServerResult() : 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 = "/observability-server/{observabilityServerUuid}/service"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java new file mode 100644 index 00000000000..81d7ee6a439 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DetachServiceFromObservabilityServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ObservabilityServerVmInventory; + +public class DetachServiceFromObservabilityServerResult { + public ObservabilityServerVmInventory inventory; + public void setInventory(ObservabilityServerVmInventory inventory) { + this.inventory = inventory; + } + public ObservabilityServerVmInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeviceAddress.java b/sdk/src/main/java/org/zstack/sdk/DeviceAddress.java new file mode 100644 index 00000000000..f4e9fa74e0d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeviceAddress.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class DeviceAddress { + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String bus; + public void setBus(java.lang.String bus) { + this.bus = bus; + } + public java.lang.String getBus() { + return this.bus; + } + + public java.lang.String domain; + public void setDomain(java.lang.String domain) { + this.domain = domain; + } + public java.lang.String getDomain() { + return this.domain; + } + + public java.lang.String slot; + public void setSlot(java.lang.String slot) { + this.slot = slot; + } + public java.lang.String getSlot() { + return this.slot; + } + + public java.lang.String function; + public void setFunction(java.lang.String function) { + this.function = function; + } + public java.lang.String getFunction() { + return this.function; + } + + public java.lang.String controller; + public void setController(java.lang.String controller) { + this.controller = controller; + } + public java.lang.String getController() { + return this.controller; + } + + public java.lang.String target; + public void setTarget(java.lang.String target) { + this.target = target; + } + public java.lang.String getTarget() { + return this.target; + } + + public java.lang.String unit; + public void setUnit(java.lang.String unit) { + this.unit = unit; + } + public java.lang.String getUnit() { + return this.unit; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeviceTO.java b/sdk/src/main/java/org/zstack/sdk/DeviceTO.java new file mode 100644 index 00000000000..47f7908474f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeviceTO.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class DeviceTO { + + public java.lang.String disk; + public void setDisk(java.lang.String disk) { + this.disk = disk; + } + public java.lang.String getDisk() { + return this.disk; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.String target; + public void setTarget(java.lang.String target) { + this.target = target; + } + public java.lang.String getTarget() { + return this.target; + } + + public java.lang.String targetType; + public void setTargetType(java.lang.String targetType) { + this.targetType = targetType; + } + public java.lang.String getTargetType() { + return this.targetType; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java new file mode 100644 index 00000000000..dd9ed92dddc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DisableCbtTaskAction 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.DisableCbtTaskResult 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 = false, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean force = false; + + @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.DisableCbtTaskResult value = res.getResult(org.zstack.sdk.DisableCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.DisableCbtTaskResult() : 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 = "/cbt-task/disable/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java new file mode 100644 index 00000000000..2f8c8826ee3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DisableCbtTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.CbtTaskInventory; + +public class DisableCbtTaskResult { + public CbtTaskInventory inventory; + public void setInventory(CbtTaskInventory inventory) { + this.inventory = inventory; + } + public CbtTaskInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java new file mode 100644 index 00000000000..c49c3fc39b8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class EnableCbtTaskAction 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.EnableCbtTaskResult 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 = false, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String bitmapName; + + @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.EnableCbtTaskResult value = res.getResult(org.zstack.sdk.EnableCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.EnableCbtTaskResult() : 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 = "/cbt-task/enable/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java new file mode 100644 index 00000000000..5a892823bc5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/EnableCbtTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class EnableCbtTaskResult { + public java.util.List volumeCbtBackupInfos; + public void setVolumeCbtBackupInfos(java.util.List volumeCbtBackupInfos) { + this.volumeCbtBackupInfos = volumeCbtBackupInfos; + } + public java.util.List getVolumeCbtBackupInfos() { + return this.volumeCbtBackupInfos; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java index 27d371c75f7..0902980b9b1 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExecuteGuestVmScriptAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String logPath; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recordUuid; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java new file mode 100644 index 00000000000..271065e4312 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ExportNbdVolumesAction 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.ExportNbdVolumesResult 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.util.List volumeUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean force = false; + + @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.ExportNbdVolumesResult value = res.getResult(org.zstack.sdk.ExportNbdVolumesResult.class); + ret.value = value == null ? new org.zstack.sdk.ExportNbdVolumesResult() : 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 = "/cbt-task/exportvolume"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java new file mode 100644 index 00000000000..fb21b7f2645 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExportNbdVolumesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class ExportNbdVolumesResult { + public java.util.List volumeInfos; + public void setVolumeInfos(java.util.List volumeInfos) { + this.volumeInfos = volumeInfos; + } + public java.util.List getVolumeInfos() { + return this.volumeInfos; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java new file mode 100644 index 00000000000..721a4fd529a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ExpungeImageGroupAction 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.ExpungeImageGroupResult 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.ExpungeImageGroupResult value = res.getResult(org.zstack.sdk.ExpungeImageGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.ExpungeImageGroupResult() : 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 = "/imagegroups/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "expungeImageGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java new file mode 100644 index 00000000000..34c7d779469 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeImageGroupResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class ExpungeImageGroupResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java b/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java index c18da4275cc..43903c96df6 100644 --- a/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ExpungeVmUserDefinedXmlHookScriptAction.java @@ -91,7 +91,7 @@ protected Map getNonAPIParameterMap() { protected RestInfo getRestInfo() { RestInfo info = new RestInfo(); info.httpMethod = "DELETE"; - info.path = "/vm-instances/xml-hook-script"; + info.path = "/vm-instances/xml-hook-script/{uuid}"; info.needSession = true; info.needPoll = true; info.parameterName = ""; diff --git a/sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java b/sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java new file mode 100644 index 00000000000..11de0363683 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExtendedAttribute.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ExtendedAttribute extends org.zstack.sdk.iam2.api.Attribute { + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String purpose; + public void setPurpose(java.lang.String purpose) { + this.purpose = purpose; + } + public java.lang.String getPurpose() { + return this.purpose; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java new file mode 100644 index 00000000000..2f67d57b3f8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/FcHbaDeviceInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class FcHbaDeviceInventory extends org.zstack.sdk.HbaDeviceInventory { + + public java.lang.String portName; + public void setPortName(java.lang.String portName) { + this.portName = portName; + } + public java.lang.String getPortName() { + return this.portName; + } + + public java.lang.String portState; + public void setPortState(java.lang.String portState) { + this.portState = portState; + } + public java.lang.String getPortState() { + return this.portState; + } + + public java.lang.String speed; + public void setSpeed(java.lang.String speed) { + this.speed = speed; + } + public java.lang.String getSpeed() { + return this.speed; + } + + public java.lang.String supportedSpeeds; + public void setSupportedSpeeds(java.lang.String supportedSpeeds) { + this.supportedSpeeds = supportedSpeeds; + } + public java.lang.String getSupportedSpeeds() { + return this.supportedSpeeds; + } + + public java.lang.String symbolicName; + public void setSymbolicName(java.lang.String symbolicName) { + this.symbolicName = symbolicName; + } + public java.lang.String getSymbolicName() { + return this.symbolicName; + } + + public java.lang.String supportedClasses; + public void setSupportedClasses(java.lang.String supportedClasses) { + this.supportedClasses = supportedClasses; + } + public java.lang.String getSupportedClasses() { + return this.supportedClasses; + } + + public java.lang.String nodeName; + public void setNodeName(java.lang.String nodeName) { + this.nodeName = nodeName; + } + public java.lang.String getNodeName() { + return this.nodeName; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java new file mode 100644 index 00000000000..435e738b095 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GenerateModelMetadataAction 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.GenerateModelMetadataResult 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 modelCenterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelUuids; + + @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.GenerateModelMetadataResult value = res.getResult(org.zstack.sdk.GenerateModelMetadataResult.class); + ret.value = value == null ? new org.zstack.sdk.GenerateModelMetadataResult() : 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 = "/ai/model/metadata/generate"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "generateModelMetadata"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java new file mode 100644 index 00000000000..0bcbe7c9600 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GenerateModelMetadataResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class GenerateModelMetadataResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java new file mode 100644 index 00000000000..a4cfdf4ba2b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetAvailableVpcL3NetworkAction 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.GetAvailableVpcL3NetworkResult 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 zoneUuid; + + @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.GetAvailableVpcL3NetworkResult value = res.getResult(org.zstack.sdk.GetAvailableVpcL3NetworkResult.class); + ret.value = value == null ? new org.zstack.sdk.GetAvailableVpcL3NetworkResult() : 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 = "/vpc/virtual-routers/available-vpc-l3s"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java new file mode 100644 index 00000000000..7520b896114 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetAvailableVpcL3NetworkResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetAvailableVpcL3NetworkResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java b/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java index b24aecb3c21..086394f1989 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/GetCandidatePrimaryStoragesForCreatingVmAction.java @@ -52,6 +52,9 @@ public Result throwExceptionIfError() { @Param(required = false) public java.lang.String defaultL3NetworkUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String instanceOfferingUuid; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java new file mode 100644 index 00000000000..e5bfe629b9b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetContainerUsageAction 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.GetContainerUsageResult 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 = 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.GetContainerUsageResult value = res.getResult(org.zstack.sdk.GetContainerUsageResult.class); + ret.value = value == null ? new org.zstack.sdk.GetContainerUsageResult() : 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 = "/container/usage"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java new file mode 100644 index 00000000000..6652d332003 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetContainerUsageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetContainerUsageResult { + public java.util.List usages; + public void setUsages(java.util.List usages) { + this.usages = usages; + } + public java.util.List getUsages() { + return this.usages; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java new file mode 100644 index 00000000000..382a27fd969 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetGpuDeviceSpecCandidatesAction 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.GetGpuDeviceSpecCandidatesResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List clusterUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List vmInstanceUuids; + + @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.GetGpuDeviceSpecCandidatesResult value = res.getResult(org.zstack.sdk.GetGpuDeviceSpecCandidatesResult.class); + ret.value = value == null ? new org.zstack.sdk.GetGpuDeviceSpecCandidatesResult() : 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 = "/gpu-device-specs/candidates"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java new file mode 100644 index 00000000000..d4ff0e09993 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetGpuDeviceSpecCandidatesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetGpuDeviceSpecCandidatesResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java new file mode 100644 index 00000000000..f4dbe5bbe3a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetHostMultipathTopologyAction 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.GetHostMultipathTopologyResult 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 hostUuid; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List diskUuids; + + @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.GetHostMultipathTopologyResult value = res.getResult(org.zstack.sdk.GetHostMultipathTopologyResult.class); + ret.value = value == null ? new org.zstack.sdk.GetHostMultipathTopologyResult() : 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 = "/storage-devices/multipath/topology"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java new file mode 100644 index 00000000000..f9e53a6b39e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetHostMultipathTopologyResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetHostMultipathTopologyResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java new file mode 100644 index 00000000000..750279d5f0d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetInvocationRecordsAction 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.GetInvocationRecordsResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recordUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean includeOutput = false; + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @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.GetInvocationRecordsResult value = res.getResult(org.zstack.sdk.GetInvocationRecordsResult.class); + ret.value = value == null ? new org.zstack.sdk.GetInvocationRecordsResult() : 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 = "/scripts/aliyun-invocations"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsResult.java b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsResult.java new file mode 100644 index 00000000000..40a347bba53 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetInvocationRecordsResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class GetInvocationRecordsResult { + 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/org/zstack/sdk/GetMaaSUsageAction.java b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java new file mode 100644 index 00000000000..013282deab6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetMaaSUsageAction 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.GetMaaSUsageResult 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 = 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.GetMaaSUsageResult value = res.getResult(org.zstack.sdk.GetMaaSUsageResult.class); + ret.value = value == null ? new org.zstack.sdk.GetMaaSUsageResult() : 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 = "/maas/usage"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java new file mode 100644 index 00000000000..66e2ddd381d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetMaaSUsageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetMaaSUsageResult { + public java.util.List usages; + public void setUsages(java.util.List usages) { + this.usages = usages; + } + public java.util.List getUsages() { + return this.usages; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java new file mode 100644 index 00000000000..8b187275870 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetModelCenterServicesAction 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.GetModelCenterServicesResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelCenterUuids; + + @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.GetModelCenterServicesResult value = res.getResult(org.zstack.sdk.GetModelCenterServicesResult.class); + ret.value = value == null ? new org.zstack.sdk.GetModelCenterServicesResult() : 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-centers/services"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java new file mode 100644 index 00000000000..1825a61f696 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetModelCenterServicesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetModelCenterServicesResult { + public java.util.List services; + public void setServices(java.util.List services) { + this.services = services; + } + public java.util.List getServices() { + return this.services; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java index 5f04dea83ad..e11cd917eb5 100644 --- a/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java +++ b/sdk/src/main/java/org/zstack/sdk/GetOAuth2TokenResult.java @@ -20,4 +20,12 @@ public SSOServerTokenInventory getServerTokenInventory() { return this.serverTokenInventory; } + public java.util.Map additionalTokenInventory; + public void setAdditionalTokenInventory(java.util.Map additionalTokenInventory) { + this.additionalTokenInventory = additionalTokenInventory; + } + public java.util.Map getAdditionalTokenInventory() { + return this.additionalTokenInventory; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java new file mode 100644 index 00000000000..78366a1748e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetObservabilityServerServiceDataAction 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.GetObservabilityServerServiceDataResult 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 observabilityServerUuid; + + @Param(required = true, validValues = {"loadBalancer"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,1000L}, noTrim = false) + public java.lang.Integer limit; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String endTime; + + @Param(required = false, validValues = {"asc","desc"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String sortDirection = "desc"; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map labelFilters; + + @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.GetObservabilityServerServiceDataResult value = res.getResult(org.zstack.sdk.GetObservabilityServerServiceDataResult.class); + ret.value = value == null ? new org.zstack.sdk.GetObservabilityServerServiceDataResult() : 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 = "/observability-server/{observabilityServerUuid}/service-data"; + info.needSession = true; + info.needPoll = false; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java new file mode 100644 index 00000000000..d846432322c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetObservabilityServerServiceDataResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class GetObservabilityServerServiceDataResult { + 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.Integer total; + public void setTotal(java.lang.Integer total) { + this.total = total; + } + public java.lang.Integer getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java new file mode 100644 index 00000000000..1425944c4a4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkAction.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetVfPciDeviceAvailableInL2NetworkAction 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.GetVfPciDeviceAvailableInL2NetworkResult 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 = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l2NetworkUuids; + + @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.GetVfPciDeviceAvailableInL2NetworkResult value = res.getResult(org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkResult.class); + ret.value = value == null ? new org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkResult() : 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 = "/l2-networks/vf-pci-devices-available"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java new file mode 100644 index 00000000000..bab64b886fe --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetVfPciDeviceAvailableInL2NetworkResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetVfPciDeviceAvailableInL2NetworkResult { + public java.util.Map l2VfAvailableClusters; + public void setL2VfAvailableClusters(java.util.Map l2VfAvailableClusters) { + this.l2VfAvailableClusters = l2VfAvailableClusters; + } + public java.util.Map getL2VfAvailableClusters() { + return this.l2VfAvailableClusters; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java b/sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java new file mode 100644 index 00000000000..8ee453e7f55 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GpuAllocateStatus.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum GpuAllocateStatus { + Unallocated, + Allocated, +} diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java index fdeb1c7996e..587c9cbeae3 100644 --- a/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.GpuAllocateStatus; public class GpuDeviceInventory extends org.zstack.sdk.PciDeviceInventory { @@ -36,4 +36,28 @@ public java.lang.Boolean getIsDriverLoaded() { return this.isDriverLoaded; } + public java.lang.String gpuType; + public void setGpuType(java.lang.String gpuType) { + this.gpuType = gpuType; + } + public java.lang.String getGpuType() { + return this.gpuType; + } + + public java.lang.String gpuStatus; + public void setGpuStatus(java.lang.String gpuStatus) { + this.gpuStatus = gpuStatus; + } + public java.lang.String getGpuStatus() { + return this.gpuStatus; + } + + public GpuAllocateStatus allocateStatus; + public void setAllocateStatus(GpuAllocateStatus allocateStatus) { + this.allocateStatus = allocateStatus; + } + public GpuAllocateStatus getAllocateStatus() { + return this.allocateStatus; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java new file mode 100644 index 00000000000..e043f206e5b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GpuDeviceSpecInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class GpuDeviceSpecInventory extends org.zstack.sdk.PciDeviceSpecInventory { + + public java.lang.Long memory; + public void setMemory(java.lang.Long memory) { + this.memory = memory; + } + public java.lang.Long getMemory() { + return this.memory; + } + + public java.lang.String gpuType; + public void setGpuType(java.lang.String gpuType) { + this.gpuType = gpuType; + } + public java.lang.String getGpuType() { + return this.gpuType; + } + + public java.lang.Boolean isolated; + public void setIsolated(java.lang.Boolean isolated) { + this.isolated = isolated; + } + public java.lang.Boolean getIsolated() { + return this.isolated; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GpuVendor.java b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java new file mode 100644 index 00000000000..d5f4842085e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GpuVendor.java @@ -0,0 +1,11 @@ +package org.zstack.sdk; + +public enum GpuVendor { + Intel, + AMD, + NVIDIA, + Haiguang, + Huawei, + TianShu, + Other, +} diff --git a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java index 50fca0eac79..53aff8d7a1d 100644 --- a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptExecutedRecordInventory.java @@ -68,6 +68,14 @@ public java.lang.Integer getVersion() { return this.version; } + public java.lang.String encodingType; + public void setEncodingType(java.lang.String encodingType) { + this.encodingType = encodingType; + } + public java.lang.String getEncodingType() { + return this.encodingType; + } + public java.lang.String scriptContent; public void setScriptContent(java.lang.String scriptContent) { this.scriptContent = scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java index 8d46aba4587..b1ca010f860 100644 --- a/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/GuestVmScriptInventory.java @@ -28,6 +28,14 @@ public java.lang.String getDescription() { return this.description; } + public java.lang.String encodingType; + public void setEncodingType(java.lang.String encodingType) { + this.encodingType = encodingType; + } + public java.lang.String getEncodingType() { + return this.encodingType; + } + public java.lang.String scriptContent; public void setScriptContent(java.lang.String scriptContent) { this.scriptContent = scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java b/sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java new file mode 100644 index 00000000000..55a399e501f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/H3cSdnControllerTenantInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class H3cSdnControllerTenantInventory { + + 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 sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String tenantUuid; + public void setTenantUuid(java.lang.String tenantUuid) { + this.tenantUuid = tenantUuid; + } + public java.lang.String getTenantUuid() { + return this.tenantUuid; + } + + public java.lang.String vdsUuid; + public void setVdsUuid(java.lang.String vdsUuid) { + this.vdsUuid = vdsUuid; + } + public java.lang.String getVdsUuid() { + return this.vdsUuid; + } + + public java.lang.String tenantName; + public void setTenantName(java.lang.String tenantName) { + this.tenantName = tenantName; + } + public java.lang.String getTenantName() { + return this.tenantName; + } + + public java.lang.String vdsName; + public void setVdsName(java.lang.String vdsName) { + this.vdsName = vdsName; + } + public java.lang.String getVdsName() { + return this.vdsName; + } + + public java.lang.String cloudDomainName; + public void setCloudDomainName(java.lang.String cloudDomainName) { + this.cloudDomainName = cloudDomainName; + } + public java.lang.String getCloudDomainName() { + return this.cloudDomainName; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + 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/HardwareL2VxlanNetworkInventory.java b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkInventory.java new file mode 100644 index 00000000000..b1343c5e5d6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class HardwareL2VxlanNetworkInventory extends org.zstack.sdk.L2VxlanNetworkInventory { + + public java.lang.Integer vlan; + public void setVlan(java.lang.Integer vlan) { + this.vlan = vlan; + } + public java.lang.Integer getVlan() { + return this.vlan; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java index d4497f7e0be..d33ab4af273 100644 --- a/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HardwareL2VxlanNetworkPoolInventory.java @@ -12,4 +12,20 @@ public java.lang.String getSdnControllerUuid() { return this.sdnControllerUuid; } + public java.lang.Integer startVlan; + public void setStartVlan(java.lang.Integer startVlan) { + this.startVlan = startVlan; + } + public java.lang.Integer getStartVlan() { + return this.startVlan; + } + + public java.lang.Integer endVlan; + public void setEndVlan(java.lang.Integer endVlan) { + this.endVlan = endVlan; + } + public java.lang.Integer getEndVlan() { + return this.endVlan; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java b/sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java new file mode 100644 index 00000000000..8eb7142775a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HbaDeviceInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class HbaDeviceInventory { + + 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 hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String hbaType; + public void setHbaType(java.lang.String hbaType) { + this.hbaType = hbaType; + } + public java.lang.String getHbaType() { + return this.hbaType; + } + + public java.lang.String createDate; + public void setCreateDate(java.lang.String createDate) { + this.createDate = createDate; + } + public java.lang.String getCreateDate() { + return this.createDate; + } + + public java.lang.String lastOpDate; + public void setLastOpDate(java.lang.String lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.lang.String getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java index 7944ebf3018..2849c11e6d0 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkBondingServiceRefInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; -import org.zstack.sdk.HostNetworkInterfaceServiceType; + public class HostNetworkBondingServiceRefInventory { @@ -20,11 +20,11 @@ public java.lang.Integer getVlanId() { return this.vlanId; } - public HostNetworkInterfaceServiceType serviceType; - public void setServiceType(HostNetworkInterfaceServiceType serviceType) { + public java.lang.String serviceType; + public void setServiceType(java.lang.String serviceType) { this.serviceType = serviceType; } - public HostNetworkInterfaceServiceType getServiceType() { + public java.lang.String getServiceType() { return this.serviceType; } diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java index 4b03e11912f..67af57c5a75 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceInventory.java @@ -148,6 +148,14 @@ public java.lang.String getPciDeviceAddress() { return this.pciDeviceAddress; } + public java.lang.String driverType; + public void setDriverType(java.lang.String driverType) { + this.driverType = driverType; + } + public java.lang.String getDriverType() { + return this.driverType; + } + public java.lang.String offloadStatus; public void setOffloadStatus(java.lang.String offloadStatus) { this.offloadStatus = offloadStatus; diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java index 8a3264bb43d..aec8183adcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceRefInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; -import org.zstack.sdk.HostNetworkInterfaceServiceType; + public class HostNetworkInterfaceServiceRefInventory { @@ -20,11 +20,11 @@ public java.lang.Integer getVlanId() { return this.vlanId; } - public HostNetworkInterfaceServiceType serviceType; - public void setServiceType(HostNetworkInterfaceServiceType serviceType) { + public java.lang.String serviceType; + public void setServiceType(java.lang.String serviceType) { this.serviceType = serviceType; } - public HostNetworkInterfaceServiceType getServiceType() { + public java.lang.String getServiceType() { return this.serviceType; } diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java deleted file mode 100644 index 6acd83e4257..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/HostNetworkInterfaceServiceType.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.zstack.sdk; - -public enum HostNetworkInterfaceServiceType { - ManagementNetwork, - TenantNetwork, - StorageNetwork, - BackupNetwork, - MigrationNetwork, -} diff --git a/sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java b/sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java new file mode 100644 index 00000000000..d722925e8ee --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HostNetworkLabelInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class HostNetworkLabelInventory { + + 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 serviceType; + public void setServiceType(java.lang.String serviceType) { + this.serviceType = serviceType; + } + public java.lang.String getServiceType() { + return this.serviceType; + } + + public java.lang.Boolean system; + public void setSystem(java.lang.Boolean system) { + this.system = system; + } + public java.lang.Boolean getSystem() { + return this.system; + } + + 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/ImageGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ImageGroupInventory.java new file mode 100644 index 00000000000..0bfb4c3b0d6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImageGroupInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ImageGroupInventory { + + public java.lang.Integer imageCount; + public void setImageCount(java.lang.Integer imageCount) { + this.imageCount = imageCount; + } + public java.lang.Integer getImageCount() { + return this.imageCount; + } + + 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 java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + 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; + } + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java b/sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java new file mode 100644 index 00000000000..9bc2bdac3dd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ImageGroupRefInventory.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + + + +public class ImageGroupRefInventory { + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + + public java.lang.String imageGroupUuid; + public void setImageGroupUuid(java.lang.String imageGroupUuid) { + this.imageGroupUuid = imageGroupUuid; + } + public java.lang.String getImageGroupUuid() { + return this.imageGroupUuid; + } + + 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/InputType.java b/sdk/src/main/java/org/zstack/sdk/InputType.java new file mode 100644 index 00000000000..ab1f0d2b570 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/InputType.java @@ -0,0 +1,17 @@ +package org.zstack.sdk; + +public enum InputType { + TEXT, + PASSWORD, + NUMBER, + TEXTAREA, + SELECT, + MULTI_SELECT, + CHECKBOX, + RADIO, + CREDENTIAL, + TYPEAHEAD, + MULTI_TYPEAHEAD, + CODE_EDITOR, + HIDDEN, +} diff --git a/sdk/src/main/java/org/zstack/sdk/InvocationRecord.java b/sdk/src/main/java/org/zstack/sdk/InvocationRecord.java new file mode 100644 index 00000000000..9b760c04bd5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/InvocationRecord.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class InvocationRecord { + + public java.sql.Timestamp startTime; + public void setStartTime(java.sql.Timestamp startTime) { + this.startTime = startTime; + } + public java.sql.Timestamp getStartTime() { + return this.startTime; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String scriptUuid; + public void setScriptUuid(java.lang.String scriptUuid) { + this.scriptUuid = scriptUuid; + } + public java.lang.String getScriptUuid() { + return this.scriptUuid; + } + + public java.lang.String scriptType; + public void setScriptType(java.lang.String scriptType) { + this.scriptType = scriptType; + } + public java.lang.String getScriptType() { + return this.scriptType; + } + + public java.lang.String scriptContent; + public void setScriptContent(java.lang.String scriptContent) { + this.scriptContent = scriptContent; + } + public java.lang.String getScriptContent() { + return this.scriptContent; + } + + public java.lang.String scriptName; + public void setScriptName(java.lang.String scriptName) { + this.scriptName = scriptName; + } + public java.lang.String getScriptName() { + return this.scriptName; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String recordUuid; + public void setRecordUuid(java.lang.String recordUuid) { + this.recordUuid = recordUuid; + } + public java.lang.String getRecordUuid() { + return this.recordUuid; + } + + public java.lang.String timeout; + public void setTimeout(java.lang.String timeout) { + this.timeout = timeout; + } + public java.lang.String getTimeout() { + return this.timeout; + } + + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java b/sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java new file mode 100644 index 00000000000..665b3015aa6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/InvocationRecordDetail.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class InvocationRecordDetail { + + public java.lang.String instanceId; + public void setInstanceId(java.lang.String instanceId) { + this.instanceId = instanceId; + } + public java.lang.String getInstanceId() { + return this.instanceId; + } + + public java.lang.String invocationStatus; + public void setInvocationStatus(java.lang.String invocationStatus) { + this.invocationStatus = invocationStatus; + } + public java.lang.String getInvocationStatus() { + return this.invocationStatus; + } + + public java.sql.Timestamp creationTime; + public void setCreationTime(java.sql.Timestamp creationTime) { + this.creationTime = creationTime; + } + public java.sql.Timestamp getCreationTime() { + return this.creationTime; + } + + public java.sql.Timestamp finishTime; + public void setFinishTime(java.sql.Timestamp finishTime) { + this.finishTime = finishTime; + } + public java.sql.Timestamp getFinishTime() { + return this.finishTime; + } + + public java.lang.String output; + public void setOutput(java.lang.String output) { + this.output = output; + } + public java.lang.String getOutput() { + return this.output; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/IsoTO.java b/sdk/src/main/java/org/zstack/sdk/IsoTO.java new file mode 100644 index 00000000000..5ab3afc3d50 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/IsoTO.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class IsoTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String path; + public void setPath(java.lang.String path) { + this.path = path; + } + public java.lang.String getPath() { + return this.path; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + + public java.lang.String primaryStorageUuid; + public void setPrimaryStorageUuid(java.lang.String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + public java.lang.String getPrimaryStorageUuid() { + return this.primaryStorageUuid; + } + + public java.lang.String protocol; + public void setProtocol(java.lang.String protocol) { + this.protocol = protocol; + } + public java.lang.String getProtocol() { + return this.protocol; + } + + public int deviceId; + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + public int getDeviceId() { + return this.deviceId; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java b/sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java new file mode 100644 index 00000000000..9a805a4eda9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KVMCephVolumeTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class KVMCephVolumeTO extends org.zstack.sdk.VolumeTO { + + public java.util.List monInfo; + public void setMonInfo(java.util.List monInfo) { + this.monInfo = monInfo; + } + public java.util.List getMonInfo() { + return this.monInfo; + } + + public java.lang.String secretUuid; + public void setSecretUuid(java.lang.String secretUuid) { + this.secretUuid = secretUuid; + } + public java.lang.String getSecretUuid() { + return this.secretUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java b/sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java new file mode 100644 index 00000000000..41385108a1d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KoAlSecretResourcePoolInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class KoAlSecretResourcePoolInventory extends org.zstack.sdk.SecretResourcePoolInventory { + + public java.lang.String managementIp; + public void setManagementIp(java.lang.String managementIp) { + this.managementIp = managementIp; + } + public java.lang.String getManagementIp() { + return this.managementIp; + } + + public java.lang.Integer port; + public void setPort(java.lang.Integer port) { + this.port = port; + } + public java.lang.Integer getPort() { + return this.port; + } + + public java.lang.String secretKey; + public void setSecretKey(java.lang.String secretKey) { + this.secretKey = secretKey; + } + public java.lang.String getSecretKey() { + return this.secretKey; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java b/sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java new file mode 100644 index 00000000000..2882ede1b3f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KvmCephCdRomTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class KvmCephCdRomTO extends org.zstack.sdk.CdRomTO { + + public java.util.List monInfo; + public void setMonInfo(java.util.List monInfo) { + this.monInfo = monInfo; + } + public java.util.List getMonInfo() { + return this.monInfo; + } + + public java.lang.String secretUuid; + public void setSecretUuid(java.lang.String secretUuid) { + this.secretUuid = secretUuid; + } + public java.lang.String getSecretUuid() { + return this.secretUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java b/sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java new file mode 100644 index 00000000000..4cde4e84989 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/KvmCephIsoTO.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class KvmCephIsoTO extends org.zstack.sdk.IsoTO { + + public java.util.List monInfo; + public void setMonInfo(java.util.List monInfo) { + this.monInfo = monInfo; + } + public java.util.List getMonInfo() { + return this.monInfo; + } + + public java.lang.String secretUuid; + public void setSecretUuid(java.lang.String secretUuid) { + this.secretUuid = secretUuid; + } + public java.lang.String getSecretUuid() { + return this.secretUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java b/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java index efdf3b27278..3a6a49902a6 100644 --- a/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/L3NetworkInventory.java @@ -20,6 +20,14 @@ public java.lang.String getName() { return this.name; } + public java.lang.Integer internalId; + public void setInternalId(java.lang.Integer internalId) { + this.internalId = internalId; + } + public java.lang.Integer getInternalId() { + return this.internalId; + } + public java.lang.String description; public void setDescription(java.lang.String description) { this.description = description; diff --git a/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java b/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java index 730e79abb59..d4217d9b607 100644 --- a/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/LicenseInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.license.header.server.LicenseUsageView; public class LicenseInventory { @@ -68,6 +68,14 @@ 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 java.lang.String expiredDate; public void setExpiredDate(java.lang.String expiredDate) { this.expiredDate = expiredDate; @@ -156,4 +164,12 @@ public java.lang.Integer getAvailableVmNum() { return this.availableVmNum; } + public LicenseUsageView usage; + public void setUsage(LicenseUsageView usage) { + this.usage = usage; + } + public LicenseUsageView getUsage() { + return this.usage; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java b/sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java new file mode 100644 index 00000000000..a8fc46e337b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LoadBalancerDataInventory.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + + + +public class LoadBalancerDataInventory extends org.zstack.sdk.ObservabilityServerServiceDataInventory { + + public java.lang.String listenerUuid; + public void setListenerUuid(java.lang.String listenerUuid) { + this.listenerUuid = listenerUuid; + } + public java.lang.String getListenerUuid() { + return this.listenerUuid; + } + + public java.lang.String clientIp; + public void setClientIp(java.lang.String clientIp) { + this.clientIp = clientIp; + } + public java.lang.String getClientIp() { + return this.clientIp; + } + + public java.lang.String frontendIp; + public void setFrontendIp(java.lang.String frontendIp) { + this.frontendIp = frontendIp; + } + public java.lang.String getFrontendIp() { + return this.frontendIp; + } + + public java.lang.String backendIp; + public void setBackendIp(java.lang.String backendIp) { + this.backendIp = backendIp; + } + public java.lang.String getBackendIp() { + return this.backendIp; + } + + public java.lang.String statusCode; + public void setStatusCode(java.lang.String statusCode) { + this.statusCode = statusCode; + } + public java.lang.String getStatusCode() { + return this.statusCode; + } + + public java.lang.String inBytes; + public void setInBytes(java.lang.String inBytes) { + this.inBytes = inBytes; + } + public java.lang.String getInBytes() { + return this.inBytes; + } + + public java.lang.String outBytes; + public void setOutBytes(java.lang.String outBytes) { + this.outBytes = outBytes; + } + public java.lang.String getOutBytes() { + return this.outBytes; + } + + public java.lang.String activeConnections; + public void setActiveConnections(java.lang.String activeConnections) { + this.activeConnections = activeConnections; + } + public java.lang.String getActiveConnections() { + return this.activeConnections; + } + + public java.lang.String backendConnections; + public void setBackendConnections(java.lang.String backendConnections) { + this.backendConnections = backendConnections; + } + public java.lang.String getBackendConnections() { + return this.backendConnections; + } + + public java.lang.String httpTime; + public void setHttpTime(java.lang.String httpTime) { + this.httpTime = httpTime; + } + public java.lang.String getHttpTime() { + return this.httpTime; + } + + public java.lang.String retriesCount; + public void setRetriesCount(java.lang.String retriesCount) { + this.retriesCount = retriesCount; + } + public java.lang.String getRetriesCount() { + return this.retriesCount; + } + + public java.lang.String serviceName; + public void setServiceName(java.lang.String serviceName) { + this.serviceName = serviceName; + } + public java.lang.String getServiceName() { + return this.serviceName; + } + + public java.lang.String logTimestamp; + public void setLogTimestamp(java.lang.String logTimestamp) { + this.logTimestamp = logTimestamp; + } + public java.lang.String getLogTimestamp() { + return this.logTimestamp; + } + + public java.lang.String logCount; + public void setLogCount(java.lang.String logCount) { + this.logCount = logCount; + } + public java.lang.String getLogCount() { + return this.logCount; + } + +} 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..99f5280c8a9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/LogServerInventory.java @@ -0,0 +1,81 @@ +package org.zstack.sdk; + +import org.zstack.sdk.LogCategory; +import org.zstack.sdk.LogType; +import org.zstack.sdk.LogLevel; + +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 java.lang.String configuration; + public void setConfiguration(java.lang.String configuration) { + this.configuration = configuration; + } + public java.lang.String getConfiguration() { + return this.configuration; + } + + 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/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/LoginIAM2VirtualIDWithLdapAction.java b/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java index ac779e23bc9..26c37563989 100644 --- a/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java +++ b/sdk/src/main/java/org/zstack/sdk/LoginIAM2VirtualIDWithLdapAction.java @@ -37,6 +37,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String captchaUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map clientInfo; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/MaaSUsage.java b/sdk/src/main/java/org/zstack/sdk/MaaSUsage.java new file mode 100644 index 00000000000..b01e7c89a92 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MaaSUsage.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class MaaSUsage { + + 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.Long value; + public void setValue(java.lang.Long value) { + this.value = value; + } + public java.lang.Long getValue() { + return this.value; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java new file mode 100644 index 00000000000..be243bba4d3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelAction.java @@ -0,0 +1,179 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class MatchModelServiceTemplateWithModelAction 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.MatchModelServiceTemplateWithModelResult 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.util.List modelUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer instanceNumber; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmImageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String primaryStorageUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List datasetUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelServiceGroupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dockerImage; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer cpuNum; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + + @Param(required = true, validValues = {"VirtualMachine","Container"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clusterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long memorySize; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List l3NetworkUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootUptime; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootDiskOfferingUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long rootDiskSize; + + @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.MatchModelServiceTemplateWithModelResult value = res.getResult(org.zstack.sdk.MatchModelServiceTemplateWithModelResult.class); + ret.value = value == null ? new org.zstack.sdk.MatchModelServiceTemplateWithModelResult() : 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/templates"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java new file mode 100644 index 00000000000..f63996f0f1f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MatchModelServiceTemplateWithModelResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class MatchModelServiceTemplateWithModelResult { + public java.util.Map result; + public void setResult(java.util.Map result) { + this.result = result; + } + public java.util.Map getResult() { + return this.result; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java index 0360c59dbd0..c3b2fc5b0ea 100644 --- a/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/MdevDeviceSpecInventory.java @@ -77,4 +77,12 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public java.lang.Integer maxAvailableDevicesPerHost; + public void setMaxAvailableDevicesPerHost(java.lang.Integer maxAvailableDevicesPerHost) { + this.maxAvailableDevicesPerHost = maxAvailableDevicesPerHost; + } + public java.lang.Integer getMaxAvailableDevicesPerHost() { + return this.maxAvailableDevicesPerHost; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java b/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java index 466b4e4eac8..a2ff1befcc4 100644 --- a/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java +++ b/sdk/src/main/java/org/zstack/sdk/MdevDeviceType.java @@ -4,5 +4,6 @@ public enum MdevDeviceType { SE_Controller, GPU_Video_Controller, GPU_Processing_Accelerators, + GPU_Co_Processor, GPU_3D_Controller, } diff --git a/sdk/src/main/java/org/zstack/sdk/MetaServerService.java b/sdk/src/main/java/org/zstack/sdk/MetaServerService.java new file mode 100644 index 00000000000..096d55f08da --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MetaServerService.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + + + +public class MetaServerService { + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public boolean up; + public void setUp(boolean up) { + this.up = up; + } + public boolean getUp() { + return this.up; + } + + public java.lang.String role; + public void setRole(java.lang.String role) { + this.role = role; + } + public java.lang.String getRole() { + return this.role; + } + + public long usedMemoryInBytes; + public void setUsedMemoryInBytes(long usedMemoryInBytes) { + this.usedMemoryInBytes = usedMemoryInBytes; + } + public long getUsedMemoryInBytes() { + return this.usedMemoryInBytes; + } + + public long systemMemoryInBytes; + public void setSystemMemoryInBytes(long systemMemoryInBytes) { + this.systemMemoryInBytes = systemMemoryInBytes; + } + public long getSystemMemoryInBytes() { + return this.systemMemoryInBytes; + } + + public long maxMemoryInBytes; + public void setMaxMemoryInBytes(long maxMemoryInBytes) { + this.maxMemoryInBytes = maxMemoryInBytes; + } + public long getMaxMemoryInBytes() { + return this.maxMemoryInBytes; + } + + public long connectedClients; + public void setConnectedClients(long connectedClients) { + this.connectedClients = connectedClients; + } + public long getConnectedClients() { + return this.connectedClients; + } + + public long maxClients; + public void setMaxClients(long maxClients) { + this.maxClients = maxClients; + } + public long getMaxClients() { + return this.maxClients; + } + + public boolean syncInProgress; + public void setSyncInProgress(boolean syncInProgress) { + this.syncInProgress = syncInProgress; + } + public boolean getSyncInProgress() { + return this.syncInProgress; + } + + public long replLagBytes; + public void setReplLagBytes(long replLagBytes) { + this.replLagBytes = replLagBytes; + } + public long getReplLagBytes() { + return this.replLagBytes; + } + + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java index 268bdffb7e7..dac09c8977f 100644 --- a/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/MigrateVmAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean allowUnknown = false; - @Param(required = false, validValues = {"auto-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"auto-converge","no-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String strategy; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java new file mode 100644 index 00000000000..92430b6daca --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterCapacityInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class ModelCenterCapacityInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public long modelUsedCapacity; + public void setModelUsedCapacity(long modelUsedCapacity) { + this.modelUsedCapacity = modelUsedCapacity; + } + public long getModelUsedCapacity() { + return this.modelUsedCapacity; + } + + public long modelServiceUsedCapacity; + public void setModelServiceUsedCapacity(long modelServiceUsedCapacity) { + this.modelServiceUsedCapacity = modelServiceUsedCapacity; + } + public long getModelServiceUsedCapacity() { + return this.modelServiceUsedCapacity; + } + + public long datasetUsedCapacity; + public void setDatasetUsedCapacity(long datasetUsedCapacity) { + this.datasetUsedCapacity = datasetUsedCapacity; + } + public long getDatasetUsedCapacity() { + return this.datasetUsedCapacity; + } + + public long fineTuneUsedCapacity; + public void setFineTuneUsedCapacity(long fineTuneUsedCapacity) { + this.fineTuneUsedCapacity = fineTuneUsedCapacity; + } + public long getFineTuneUsedCapacity() { + return this.fineTuneUsedCapacity; + } + + public long modelEvaluationUsedCapacity; + public void setModelEvaluationUsedCapacity(long modelEvaluationUsedCapacity) { + this.modelEvaluationUsedCapacity = modelEvaluationUsedCapacity; + } + public long getModelEvaluationUsedCapacity() { + return this.modelEvaluationUsedCapacity; + } + + public long temporaryUsedCapacity; + public void setTemporaryUsedCapacity(long temporaryUsedCapacity) { + this.temporaryUsedCapacity = temporaryUsedCapacity; + } + public long getTemporaryUsedCapacity() { + return this.temporaryUsedCapacity; + } + + public long cacheUsedCapacity; + public void setCacheUsedCapacity(long cacheUsedCapacity) { + this.cacheUsedCapacity = cacheUsedCapacity; + } + public long getCacheUsedCapacity() { + return this.cacheUsedCapacity; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java new file mode 100644 index 00000000000..ec8bf2e9471 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterInventory.java @@ -0,0 +1,144 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelCenterCapacityInventory; +import org.zstack.sdk.ZdfsInventory; + +public class ModelCenterInventory { + + 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 java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String parameters; + public void setParameters(java.lang.String parameters) { + this.parameters = parameters; + } + public java.lang.String getParameters() { + return this.parameters; + } + + public java.lang.String managementIp; + public void setManagementIp(java.lang.String managementIp) { + this.managementIp = managementIp; + } + public java.lang.String getManagementIp() { + return this.managementIp; + } + + public int managementPort; + public void setManagementPort(int managementPort) { + this.managementPort = managementPort; + } + public int getManagementPort() { + return this.managementPort; + } + + public java.lang.String storageNetworkUuid; + public void setStorageNetworkUuid(java.lang.String storageNetworkUuid) { + this.storageNetworkUuid = storageNetworkUuid; + } + public java.lang.String getStorageNetworkUuid() { + return this.storageNetworkUuid; + } + + public java.lang.String serviceNetworkUuid; + public void setServiceNetworkUuid(java.lang.String serviceNetworkUuid) { + this.serviceNetworkUuid = serviceNetworkUuid; + } + public java.lang.String getServiceNetworkUuid() { + return this.serviceNetworkUuid; + } + + public java.lang.String containerRegistry; + public void setContainerRegistry(java.lang.String containerRegistry) { + this.containerRegistry = containerRegistry; + } + public java.lang.String getContainerRegistry() { + return this.containerRegistry; + } + + public java.lang.String containerStorageNetwork; + public void setContainerStorageNetwork(java.lang.String containerStorageNetwork) { + this.containerStorageNetwork = containerStorageNetwork; + } + public java.lang.String getContainerStorageNetwork() { + return this.containerStorageNetwork; + } + + public java.lang.String containerNetwork; + public void setContainerNetwork(java.lang.String containerNetwork) { + this.containerNetwork = containerNetwork; + } + public java.lang.String getContainerNetwork() { + return this.containerNetwork; + } + + public ModelCenterCapacityInventory capacity; + public void setCapacity(ModelCenterCapacityInventory capacity) { + this.capacity = capacity; + } + public ModelCenterCapacityInventory getCapacity() { + return this.capacity; + } + + public ZdfsInventory zdfs; + public void setZdfs(ZdfsInventory zdfs) { + this.zdfs = zdfs; + } + public ZdfsInventory getZdfs() { + return this.zdfs; + } + + 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/ModelCenterServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java new file mode 100644 index 00000000000..954ae70836d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelCenterServiceInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ZdfsService; + +public class ModelCenterServiceInventory { + + 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.util.List serviceStatuses; + public void setServiceStatuses(java.util.List serviceStatuses) { + this.serviceStatuses = serviceStatuses; + } + public java.util.List getServiceStatuses() { + return this.serviceStatuses; + } + + public ZdfsService zdfs; + public void setZdfs(ZdfsService zdfs) { + this.zdfs = zdfs; + } + public ZdfsService getZdfs() { + return this.zdfs; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java new file mode 100644 index 00000000000..1ac865f4c6e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvalServiceInstanceGroupInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ModelEvalServiceInstanceGroupInventory extends org.zstack.sdk.ModelServiceInstanceGroupInventory { + + public java.lang.Integer limits; + public void setLimits(java.lang.Integer limits) { + this.limits = limits; + } + public java.lang.Integer getLimits() { + return this.limits; + } + + public java.lang.Float temperature; + public void setTemperature(java.lang.Float temperature) { + this.temperature = temperature; + } + public java.lang.Float getTemperature() { + return this.temperature; + } + + public java.lang.Integer topK; + public void setTopK(java.lang.Integer topK) { + this.topK = topK; + } + public java.lang.Integer getTopK() { + return this.topK; + } + + public java.lang.Float topP; + public void setTopP(java.lang.Float topP) { + this.topP = topP; + } + public java.lang.Float getTopP() { + return this.topP; + } + + public java.lang.Integer maxLength; + public void setMaxLength(java.lang.Integer maxLength) { + this.maxLength = maxLength; + } + public java.lang.Integer getMaxLength() { + return this.maxLength; + } + + public java.lang.Integer maxNewTokens; + public void setMaxNewTokens(java.lang.Integer maxNewTokens) { + this.maxNewTokens = maxNewTokens; + } + public java.lang.Integer getMaxNewTokens() { + return this.maxNewTokens; + } + + public java.lang.Float repetitionPenalty; + public void setRepetitionPenalty(java.lang.Float repetitionPenalty) { + this.repetitionPenalty = repetitionPenalty; + } + public java.lang.Float getRepetitionPenalty() { + return this.repetitionPenalty; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java new file mode 100644 index 00000000000..7695a4c3ace --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelEvaluationTaskInventory.java @@ -0,0 +1,231 @@ +package org.zstack.sdk; + + + +public class ModelEvaluationTaskInventory { + + 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 type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public int percentage; + public void setPercentage(int percentage) { + this.percentage = percentage; + } + public int getPercentage() { + return this.percentage; + } + + public java.lang.String opaque; + public void setOpaque(java.lang.String opaque) { + this.opaque = opaque; + } + public java.lang.String getOpaque() { + return this.opaque; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String modelServiceGroupUuid; + public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { + this.modelServiceGroupUuid = modelServiceGroupUuid; + } + public java.lang.String getModelServiceGroupUuid() { + return this.modelServiceGroupUuid; + } + + public java.lang.String evaluatedServiceGroupUuid; + public void setEvaluatedServiceGroupUuid(java.lang.String evaluatedServiceGroupUuid) { + this.evaluatedServiceGroupUuid = evaluatedServiceGroupUuid; + } + public java.lang.String getEvaluatedServiceGroupUuid() { + return this.evaluatedServiceGroupUuid; + } + + public java.lang.String datasetUuid; + public void setDatasetUuid(java.lang.String datasetUuid) { + this.datasetUuid = datasetUuid; + } + public java.lang.String getDatasetUuid() { + return this.datasetUuid; + } + + public java.lang.Integer limits; + public void setLimits(java.lang.Integer limits) { + this.limits = limits; + } + public java.lang.Integer getLimits() { + return this.limits; + } + + 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; + } + + public java.lang.Integer maxNewTokens; + public void setMaxNewTokens(java.lang.Integer maxNewTokens) { + this.maxNewTokens = maxNewTokens; + } + public java.lang.Integer getMaxNewTokens() { + return this.maxNewTokens; + } + + public java.lang.Integer topK; + public void setTopK(java.lang.Integer topK) { + this.topK = topK; + } + public java.lang.Integer getTopK() { + return this.topK; + } + + public java.lang.Float temperature; + public void setTemperature(java.lang.Float temperature) { + this.temperature = temperature; + } + public java.lang.Float getTemperature() { + return this.temperature; + } + + public java.lang.Float topP; + public void setTopP(java.lang.Float topP) { + this.topP = topP; + } + public java.lang.Float getTopP() { + return this.topP; + } + + public java.lang.String prompt; + public void setPrompt(java.lang.String prompt) { + this.prompt = prompt; + } + public java.lang.String getPrompt() { + return this.prompt; + } + + public java.lang.Float repetitionPenalty; + public void setRepetitionPenalty(java.lang.Float repetitionPenalty) { + this.repetitionPenalty = repetitionPenalty; + } + public java.lang.Float getRepetitionPenalty() { + return this.repetitionPenalty; + } + + public java.lang.Integer maxLength; + public void setMaxLength(java.lang.Integer maxLength) { + this.maxLength = maxLength; + } + public java.lang.Integer getMaxLength() { + return this.maxLength; + } + + public java.lang.String model; + public void setModel(java.lang.String model) { + this.model = model; + } + public java.lang.String getModel() { + return this.model; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.Integer parallel; + public void setParallel(java.lang.Integer parallel) { + this.parallel = parallel; + } + public java.lang.Integer getParallel() { + return this.parallel; + } + + public java.lang.Integer logEveryQuery; + public void setLogEveryQuery(java.lang.Integer logEveryQuery) { + this.logEveryQuery = logEveryQuery; + } + public java.lang.Integer getLogEveryQuery() { + return this.logEveryQuery; + } + + public java.lang.String api; + public void setApi(java.lang.String api) { + this.api = api; + } + public java.lang.String getApi() { + return this.api; + } + + public java.util.Map requestHeaders; + public void setRequestHeaders(java.util.Map requestHeaders) { + this.requestHeaders = requestHeaders; + } + public java.util.Map getRequestHeaders() { + return this.requestHeaders; + } + + public java.lang.Integer connectTimeout; + public void setConnectTimeout(java.lang.Integer connectTimeout) { + this.connectTimeout = connectTimeout; + } + public java.lang.Integer getConnectTimeout() { + return this.connectTimeout; + } + + public java.lang.Integer readTimeout; + public void setReadTimeout(java.lang.Integer readTimeout) { + this.readTimeout = readTimeout; + } + public java.lang.Integer getReadTimeout() { + return this.readTimeout; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java new file mode 100644 index 00000000000..ec46d527eec --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelInventory.java @@ -0,0 +1,215 @@ +package org.zstack.sdk; + + + +public class ModelInventory { + + 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 java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String parameters; + public void setParameters(java.lang.String parameters) { + this.parameters = parameters; + } + public java.lang.String getParameters() { + return this.parameters; + } + + public java.lang.String modelCenterUuid; + public void setModelCenterUuid(java.lang.String modelCenterUuid) { + this.modelCenterUuid = modelCenterUuid; + } + public java.lang.String getModelCenterUuid() { + return this.modelCenterUuid; + } + + public java.lang.String logo; + public void setLogo(java.lang.String logo) { + this.logo = logo; + } + public java.lang.String getLogo() { + return this.logo; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String modelId; + public void setModelId(java.lang.String modelId) { + this.modelId = modelId; + } + public java.lang.String getModelId() { + return this.modelId; + } + + public java.lang.String introduction; + public void setIntroduction(java.lang.String introduction) { + this.introduction = introduction; + } + public java.lang.String getIntroduction() { + return this.introduction; + } + + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + 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 type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.Long minGpuMemory; + public void setMinGpuMemory(java.lang.Long minGpuMemory) { + this.minGpuMemory = minGpuMemory; + } + public java.lang.Long getMinGpuMemory() { + return this.minGpuMemory; + } + + public java.util.List recommendedGpuNum; + public void setRecommendedGpuNum(java.util.List recommendedGpuNum) { + this.recommendedGpuNum = recommendedGpuNum; + } + public java.util.List getRecommendedGpuNum() { + return this.recommendedGpuNum; + } + + public java.lang.String gpuConstraintDescription; + public void setGpuConstraintDescription(java.lang.String gpuConstraintDescription) { + this.gpuConstraintDescription = gpuConstraintDescription; + } + public java.lang.String getGpuConstraintDescription() { + return this.gpuConstraintDescription; + } + + public java.lang.String versionSemver; + public void setVersionSemver(java.lang.String versionSemver) { + this.versionSemver = versionSemver; + } + public java.lang.String getVersionSemver() { + return this.versionSemver; + } + + public java.lang.Boolean isLatestVersion; + public void setIsLatestVersion(java.lang.Boolean isLatestVersion) { + this.isLatestVersion = isLatestVersion; + } + public java.lang.Boolean getIsLatestVersion() { + return this.isLatestVersion; + } + + public java.lang.String artifactChecksum; + public void setArtifactChecksum(java.lang.String artifactChecksum) { + this.artifactChecksum = artifactChecksum; + } + public java.lang.String getArtifactChecksum() { + return this.artifactChecksum; + } + + public java.lang.Long artifactSizeBytes; + public void setArtifactSizeBytes(java.lang.Long artifactSizeBytes) { + this.artifactSizeBytes = artifactSizeBytes; + } + public java.lang.Long getArtifactSizeBytes() { + return this.artifactSizeBytes; + } + + public java.lang.String architectureType; + public void setArchitectureType(java.lang.String architectureType) { + this.architectureType = architectureType; + } + public java.lang.String getArchitectureType() { + return this.architectureType; + } + + public java.lang.String frameworkVersion; + public void setFrameworkVersion(java.lang.String frameworkVersion) { + this.frameworkVersion = frameworkVersion; + } + public java.lang.String getFrameworkVersion() { + return this.frameworkVersion; + } + + public java.lang.String requiredAccelerator; + public void setRequiredAccelerator(java.lang.String requiredAccelerator) { + this.requiredAccelerator = requiredAccelerator; + } + public java.lang.String getRequiredAccelerator() { + return this.requiredAccelerator; + } + + public java.util.List modelServiceRefs; + public void setModelServiceRefs(java.util.List modelServiceRefs) { + this.modelServiceRefs = modelServiceRefs; + } + public java.util.List getModelServiceRefs() { + return this.modelServiceRefs; + } + + 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/ModelService.java b/sdk/src/main/java/org/zstack/sdk/ModelService.java new file mode 100644 index 00000000000..cc765e67495 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelService.java @@ -0,0 +1,231 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SessionInventory; + +public class ModelService { + + public java.lang.Integer nodeRank; + public void setNodeRank(java.lang.Integer nodeRank) { + this.nodeRank = nodeRank; + } + public java.lang.Integer getNodeRank() { + return this.nodeRank; + } + + public java.lang.Integer tensorParallelSize; + public void setTensorParallelSize(java.lang.Integer tensorParallelSize) { + this.tensorParallelSize = tensorParallelSize; + } + public java.lang.Integer getTensorParallelSize() { + return this.tensorParallelSize; + } + + public boolean isInitialNode; + public void setIsInitialNode(boolean isInitialNode) { + this.isInitialNode = isInitialNode; + } + public boolean getIsInitialNode() { + return this.isInitialNode; + } + + 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 description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String primaryStorageUuid; + public void setPrimaryStorageUuid(java.lang.String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + public java.lang.String getPrimaryStorageUuid() { + return this.primaryStorageUuid; + } + + public java.util.List datasetUuids; + public void setDatasetUuids(java.util.List datasetUuids) { + this.datasetUuids = datasetUuids; + } + public java.util.List getDatasetUuids() { + return this.datasetUuids; + } + + public java.util.List modelServiceGroupUuids; + public void setModelServiceGroupUuids(java.util.List modelServiceGroupUuids) { + this.modelServiceGroupUuids = modelServiceGroupUuids; + } + public java.util.List getModelServiceGroupUuids() { + return this.modelServiceGroupUuids; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + + public java.lang.Integer cpuNum; + public void setCpuNum(java.lang.Integer cpuNum) { + this.cpuNum = cpuNum; + } + public java.lang.Integer getCpuNum() { + return this.cpuNum; + } + + 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.util.Map environmentVariables; + public void setEnvironmentVariables(java.util.Map environmentVariables) { + this.environmentVariables = environmentVariables; + } + public java.util.Map getEnvironmentVariables() { + return this.environmentVariables; + } + + public java.util.Map startupParameters; + public void setStartupParameters(java.util.Map startupParameters) { + this.startupParameters = startupParameters; + } + public java.util.Map getStartupParameters() { + return this.startupParameters; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String clusterUuid; + public void setClusterUuid(java.lang.String clusterUuid) { + this.clusterUuid = clusterUuid; + } + public java.lang.String getClusterUuid() { + return this.clusterUuid; + } + + public java.lang.Long memorySize; + public void setMemorySize(java.lang.Long memorySize) { + this.memorySize = memorySize; + } + public java.lang.Long getMemorySize() { + return this.memorySize; + } + + public java.util.List l3NetworkUuids; + public void setL3NetworkUuids(java.util.List l3NetworkUuids) { + this.l3NetworkUuids = l3NetworkUuids; + } + public java.util.List getL3NetworkUuids() { + return this.l3NetworkUuids; + } + + public java.lang.Integer serviceBootUptime; + public void setServiceBootUptime(java.lang.Integer serviceBootUptime) { + this.serviceBootUptime = serviceBootUptime; + } + public java.lang.Integer getServiceBootUptime() { + return this.serviceBootUptime; + } + + public java.lang.String serviceLivez; + public void setServiceLivez(java.lang.String serviceLivez) { + this.serviceLivez = serviceLivez; + } + public java.lang.String getServiceLivez() { + return this.serviceLivez; + } + + public java.lang.String serviceReadyz; + public void setServiceReadyz(java.lang.String serviceReadyz) { + this.serviceReadyz = serviceReadyz; + } + public java.lang.String getServiceReadyz() { + return this.serviceReadyz; + } + + public java.lang.String rootDiskOfferingUuid; + public void setRootDiskOfferingUuid(java.lang.String rootDiskOfferingUuid) { + this.rootDiskOfferingUuid = rootDiskOfferingUuid; + } + public java.lang.String getRootDiskOfferingUuid() { + return this.rootDiskOfferingUuid; + } + + public java.lang.Long rootDiskSize; + public void setRootDiskSize(java.lang.Long rootDiskSize) { + this.rootDiskSize = rootDiskSize; + } + public java.lang.Long getRootDiskSize() { + return this.rootDiskSize; + } + + public SessionInventory session; + public void setSession(SessionInventory session) { + this.session = session; + } + public SessionInventory getSession() { + return this.session; + } + + public java.util.List systemTags; + public void setSystemTags(java.util.List systemTags) { + this.systemTags = systemTags; + } + public java.util.List getSystemTags() { + return this.systemTags; + } + + public long timeout; + public void setTimeout(long timeout) { + this.timeout = timeout; + } + public long getTimeout() { + return this.timeout; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java new file mode 100644 index 00000000000..aeb4b907767 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceGroupDatasetRefInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ModelServiceGroupDatasetRefInventory { + + 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 datasetUuid; + public void setDatasetUuid(java.lang.String datasetUuid) { + this.datasetUuid = datasetUuid; + } + public java.lang.String getDatasetUuid() { + return this.datasetUuid; + } + + public java.lang.String modelServiceInstanceGroupUuid; + public void setModelServiceInstanceGroupUuid(java.lang.String modelServiceInstanceGroupUuid) { + this.modelServiceInstanceGroupUuid = modelServiceInstanceGroupUuid; + } + public java.lang.String getModelServiceInstanceGroupUuid() { + return this.modelServiceInstanceGroupUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java new file mode 100644 index 00000000000..25ad17e970d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceGroupInventory.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + + + +public class ModelServiceInstanceGroupInventory { + + 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 modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + + public java.lang.String modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.util.List instances; + public void setInstances(java.util.List instances) { + this.instances = instances; + } + public java.util.List getInstances() { + return this.instances; + } + + public java.util.List datasetRefInventories; + public void setDatasetRefInventories(java.util.List datasetRefInventories) { + this.datasetRefInventories = datasetRefInventories; + } + public java.util.List getDatasetRefInventories() { + return this.datasetRefInventories; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String modelServiceType; + public void setModelServiceType(java.lang.String modelServiceType) { + this.modelServiceType = modelServiceType; + } + public java.lang.String getModelServiceType() { + return this.modelServiceType; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + 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 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; + } + + public java.lang.String yaml; + public void setYaml(java.lang.String yaml) { + this.yaml = yaml; + } + public java.lang.String getYaml() { + return this.yaml; + } + + public java.util.List supportMetrics; + public void setSupportMetrics(java.util.List supportMetrics) { + this.supportMetrics = supportMetrics; + } + public java.util.List getSupportMetrics() { + return this.supportMetrics; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java new file mode 100644 index 00000000000..13cf707f507 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInstanceInventory.java @@ -0,0 +1,135 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmInstanceInventory; + +public class ModelServiceInstanceInventory { + + 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 modelServiceGroupUuid; + public void setModelServiceGroupUuid(java.lang.String modelServiceGroupUuid) { + this.modelServiceGroupUuid = modelServiceGroupUuid; + } + public java.lang.String getModelServiceGroupUuid() { + return this.modelServiceGroupUuid; + } + + public java.lang.String yaml; + public void setYaml(java.lang.String yaml) { + this.yaml = yaml; + } + public java.lang.String getYaml() { + return this.yaml; + } + + public java.lang.String k8sResourceYaml; + public void setK8sResourceYaml(java.lang.String k8sResourceYaml) { + this.k8sResourceYaml = k8sResourceYaml; + } + public java.lang.String getK8sResourceYaml() { + return this.k8sResourceYaml; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.util.Map urlMaps; + public void setUrlMaps(java.util.Map urlMaps) { + this.urlMaps = urlMaps; + } + public java.util.Map getUrlMaps() { + return this.urlMaps; + } + + public java.lang.String internalUrl; + public void setInternalUrl(java.lang.String internalUrl) { + this.internalUrl = internalUrl; + } + public java.lang.String getInternalUrl() { + return this.internalUrl; + } + + public java.lang.String jupyterUrl; + public void setJupyterUrl(java.lang.String jupyterUrl) { + this.jupyterUrl = jupyterUrl; + } + public java.lang.String getJupyterUrl() { + return this.jupyterUrl; + } + + public java.lang.String vmInstanceUuid; + public void setVmInstanceUuid(java.lang.String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + public java.lang.String getVmInstanceUuid() { + return this.vmInstanceUuid; + } + + public java.lang.Integer nodeRank; + public void setNodeRank(java.lang.Integer nodeRank) { + this.nodeRank = nodeRank; + } + public java.lang.Integer getNodeRank() { + return this.nodeRank; + } + + public java.lang.String accountUuid; + public void setAccountUuid(java.lang.String accountUuid) { + this.accountUuid = accountUuid; + } + public java.lang.String getAccountUuid() { + return this.accountUuid; + } + + public VmInstanceInventory vm; + public void setVm(VmInstanceInventory vm) { + this.vm = vm; + } + public VmInstanceInventory getVm() { + return this.vm; + } + + 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/ModelServiceInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java new file mode 100644 index 00000000000..3b0d6495722 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceInventory.java @@ -0,0 +1,223 @@ +package org.zstack.sdk; + + + +public class ModelServiceInventory { + + 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 java.lang.String readme; + public void setReadme(java.lang.String readme) { + this.readme = readme; + } + public java.lang.String getReadme() { + return this.readme; + } + + public java.lang.String yaml; + public void setYaml(java.lang.String yaml) { + this.yaml = yaml; + } + public java.lang.String getYaml() { + return this.yaml; + } + + public java.lang.Integer requestCpu; + public void setRequestCpu(java.lang.Integer requestCpu) { + this.requestCpu = requestCpu; + } + public java.lang.Integer getRequestCpu() { + return this.requestCpu; + } + + public java.lang.Long requestMemory; + public void setRequestMemory(java.lang.Long requestMemory) { + this.requestMemory = requestMemory; + } + public java.lang.Long getRequestMemory() { + return this.requestMemory; + } + + public java.lang.String modelCenterUuid; + public void setModelCenterUuid(java.lang.String modelCenterUuid) { + this.modelCenterUuid = modelCenterUuid; + } + public java.lang.String getModelCenterUuid() { + return this.modelCenterUuid; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String framework; + public void setFramework(java.lang.String framework) { + this.framework = framework; + } + public java.lang.String getFramework() { + return this.framework; + } + + 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.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.lang.Boolean system; + public void setSystem(java.lang.Boolean system) { + this.system = system; + } + public java.lang.Boolean getSystem() { + return this.system; + } + + public java.lang.String gpuComputeCapability; + public void setGpuComputeCapability(java.lang.String gpuComputeCapability) { + this.gpuComputeCapability = gpuComputeCapability; + } + public java.lang.String getGpuComputeCapability() { + return this.gpuComputeCapability; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String pythonVersion; + public void setPythonVersion(java.lang.String pythonVersion) { + this.pythonVersion = pythonVersion; + } + public java.lang.String getPythonVersion() { + return this.pythonVersion; + } + + public java.lang.String condaVersion; + public void setCondaVersion(java.lang.String condaVersion) { + this.condaVersion = condaVersion; + } + public java.lang.String getCondaVersion() { + return this.condaVersion; + } + + public java.lang.String startCommand; + public void setStartCommand(java.lang.String startCommand) { + this.startCommand = startCommand; + } + public java.lang.String getStartCommand() { + return this.startCommand; + } + + public java.lang.String containerCommand; + public void setContainerCommand(java.lang.String containerCommand) { + this.containerCommand = containerCommand; + } + public java.lang.String getContainerCommand() { + return this.containerCommand; + } + + public java.lang.String containerArgs; + public void setContainerArgs(java.lang.String containerArgs) { + this.containerArgs = containerArgs; + } + public java.lang.String getContainerArgs() { + return this.containerArgs; + } + + public boolean supportDistributed; + public void setSupportDistributed(boolean supportDistributed) { + this.supportDistributed = supportDistributed; + } + public boolean getSupportDistributed() { + return this.supportDistributed; + } + + public java.util.List cpuArchitectures; + public void setCpuArchitectures(java.util.List cpuArchitectures) { + this.cpuArchitectures = cpuArchitectures; + } + public java.util.List getCpuArchitectures() { + return this.cpuArchitectures; + } + + public java.util.Map vendorToSpecUuidsMap; + public void setVendorToSpecUuidsMap(java.util.Map vendorToSpecUuidsMap) { + this.vendorToSpecUuidsMap = vendorToSpecUuidsMap; + } + public java.util.Map getVendorToSpecUuidsMap() { + return this.vendorToSpecUuidsMap; + } + + public java.util.List modelServiceRefs; + public void setModelServiceRefs(java.util.List modelServiceRefs) { + this.modelServiceRefs = modelServiceRefs; + } + public java.util.List getModelServiceRefs() { + return this.modelServiceRefs; + } + + public java.util.List modelServiceImages; + public void setModelServiceImages(java.util.List modelServiceImages) { + this.modelServiceImages = modelServiceImages; + } + public java.util.List getModelServiceImages() { + return this.modelServiceImages; + } + + 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/ModelServiceMatchEntry.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntry.java new file mode 100644 index 00000000000..98f2675fc50 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntry.java @@ -0,0 +1,48 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceMatchStatus; +import org.zstack.sdk.ModelServiceMatchEntryName; + +public class ModelServiceMatchEntry { + + public ModelServiceMatchStatus status; + public void setStatus(ModelServiceMatchStatus status) { + this.status = status; + } + public ModelServiceMatchStatus getStatus() { + return this.status; + } + + public ModelServiceMatchEntryName name; + public void setName(ModelServiceMatchEntryName name) { + this.name = name; + } + public ModelServiceMatchEntryName getName() { + return this.name; + } + + public java.lang.String fieldName; + public void setFieldName(java.lang.String fieldName) { + this.fieldName = fieldName; + } + public java.lang.String getFieldName() { + return this.fieldName; + } + + public java.lang.String fieldValue; + public void setFieldValue(java.lang.String fieldValue) { + this.fieldValue = fieldValue; + } + public java.lang.String getFieldValue() { + return this.fieldValue; + } + + public java.lang.String comments; + public void setComments(java.lang.String comments) { + this.comments = comments; + } + public java.lang.String getComments() { + return this.comments; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java new file mode 100644 index 00000000000..da8c6a273c3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchEntryName.java @@ -0,0 +1,11 @@ +package org.zstack.sdk; + +public enum ModelServiceMatchEntryName { + GpuVendorCompatibility, + AcceleratorCompatibility, + GpuPrecisionCompatibility, + TemplateExistence, + ScalingCapability, + ArchitectureCompatibility, + QuantizationCompatibility, +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java new file mode 100644 index 00000000000..46c3426ae8b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceMatchStatus.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum ModelServiceMatchStatus { + Passed, + Failed, + Skipped, +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java new file mode 100644 index 00000000000..93f3f18ea78 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceRefInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class ModelServiceRefInventory { + + 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 modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java b/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java new file mode 100644 index 00000000000..04278cd76d4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ModelServiceTemplateInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class ModelServiceTemplateInventory { + + 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 modelServiceUuid; + public void setModelServiceUuid(java.lang.String modelServiceUuid) { + this.modelServiceUuid = modelServiceUuid; + } + public java.lang.String getModelServiceUuid() { + return this.modelServiceUuid; + } + + public java.lang.String cpuArchitecture; + public void setCpuArchitecture(java.lang.String cpuArchitecture) { + this.cpuArchitecture = cpuArchitecture; + } + public java.lang.String getCpuArchitecture() { + return this.cpuArchitecture; + } + + public java.lang.String vmImageUuid; + public void setVmImageUuid(java.lang.String vmImageUuid) { + this.vmImageUuid = vmImageUuid; + } + public java.lang.String getVmImageUuid() { + return this.vmImageUuid; + } + + public java.lang.String dockerImage; + public void setDockerImage(java.lang.String dockerImage) { + this.dockerImage = dockerImage; + } + public java.lang.String getDockerImage() { + return this.dockerImage; + } + + 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/MonInfo.java b/sdk/src/main/java/org/zstack/sdk/MonInfo.java new file mode 100644 index 00000000000..7daeec71f88 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MonInfo.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class MonInfo { + + public java.lang.String hostname; + public void setHostname(java.lang.String hostname) { + this.hostname = hostname; + } + public java.lang.String getHostname() { + return this.hostname; + } + + public int port; + public void setPort(int port) { + this.port = port; + } + public int getPort() { + return this.port; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java b/sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java new file mode 100644 index 00000000000..18b8bb8977b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/MultipathTopologyStruct.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class MultipathTopologyStruct { + + public java.lang.String diskUuid; + public void setDiskUuid(java.lang.String diskUuid) { + this.diskUuid = diskUuid; + } + public java.lang.String getDiskUuid() { + return this.diskUuid; + } + + public java.util.List devices; + public void setDevices(java.util.List devices) { + this.devices = devices; + } + public java.util.List getDevices() { + return this.devices; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java b/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java new file mode 100644 index 00000000000..150665bdb35 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NativeClusterInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + + + +public class NativeClusterInventory extends org.zstack.sdk.ClusterInventory { + + public java.lang.String bizUrl; + public void setBizUrl(java.lang.String bizUrl) { + this.bizUrl = bizUrl; + } + public java.lang.String getBizUrl() { + return this.bizUrl; + } + + public java.lang.String masterUrl; + public void setMasterUrl(java.lang.String masterUrl) { + this.masterUrl = masterUrl; + } + public java.lang.String getMasterUrl() { + return this.masterUrl; + } + + public java.lang.String kubeConfig; + public void setKubeConfig(java.lang.String kubeConfig) { + this.kubeConfig = kubeConfig; + } + public java.lang.String getKubeConfig() { + return this.kubeConfig; + } + + public java.lang.String prometheusURL; + public void setPrometheusURL(java.lang.String prometheusURL) { + this.prometheusURL = prometheusURL; + } + public java.lang.String getPrometheusURL() { + return this.prometheusURL; + } + + 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.Integer nodeCount; + public void setNodeCount(java.lang.Integer nodeCount) { + this.nodeCount = nodeCount; + } + public java.lang.Integer getNodeCount() { + return this.nodeCount; + } + + public java.lang.String createType; + public void setCreateType(java.lang.String createType) { + this.createType = createType; + } + public java.lang.String getCreateType() { + return this.createType; + } + + 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/NativeHostInventory.java b/sdk/src/main/java/org/zstack/sdk/NativeHostInventory.java new file mode 100644 index 00000000000..243e1d9dc92 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NativeHostInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class NativeHostInventory extends org.zstack.sdk.HostInventory { + + public java.lang.String endpointUuid; + public void setEndpointUuid(java.lang.String endpointUuid) { + this.endpointUuid = endpointUuid; + } + public java.lang.String getEndpointUuid() { + return this.endpointUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java new file mode 100644 index 00000000000..fe062e43956 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NginxRedirectRule.java @@ -0,0 +1,55 @@ +package org.zstack.sdk; + + + +public class NginxRedirectRule { + + public java.lang.String destUrl; + public void setDestUrl(java.lang.String destUrl) { + this.destUrl = destUrl; + } + public java.lang.String getDestUrl() { + return this.destUrl; + } + + 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 jupyterUrl; + public void setJupyterUrl(java.lang.String jupyterUrl) { + this.jupyterUrl = jupyterUrl; + } + public java.lang.String getJupyterUrl() { + return this.jupyterUrl; + } + + public java.lang.String currentUrl; + public void setCurrentUrl(java.lang.String currentUrl) { + this.currentUrl = currentUrl; + } + public java.lang.String getCurrentUrl() { + return this.currentUrl; + } + + public java.lang.String currentJupyterUrl; + public void setCurrentJupyterUrl(java.lang.String currentJupyterUrl) { + this.currentJupyterUrl = currentJupyterUrl; + } + public java.lang.String getCurrentJupyterUrl() { + return this.currentJupyterUrl; + } + + public java.lang.String overriddenUuid; + public void setOverriddenUuid(java.lang.String overriddenUuid) { + this.overriddenUuid = overriddenUuid; + } + public java.lang.String getOverriddenUuid() { + return this.overriddenUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/NicTO.java b/sdk/src/main/java/org/zstack/sdk/NicTO.java new file mode 100644 index 00000000000..2dc95ea8529 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/NicTO.java @@ -0,0 +1,192 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VHostAddOn; +import org.zstack.sdk.DeviceAddress; + +public class NicTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String mac; + public void setMac(java.lang.String mac) { + this.mac = mac; + } + public java.lang.String getMac() { + return this.mac; + } + + public java.util.List ips; + public void setIps(java.util.List ips) { + this.ips = ips; + } + public java.util.List getIps() { + return this.ips; + } + + public java.lang.String bridgeName; + public void setBridgeName(java.lang.String bridgeName) { + this.bridgeName = bridgeName; + } + public java.lang.String getBridgeName() { + return this.bridgeName; + } + + public java.lang.String physicalInterface; + public void setPhysicalInterface(java.lang.String physicalInterface) { + this.physicalInterface = physicalInterface; + } + public java.lang.String getPhysicalInterface() { + return this.physicalInterface; + } + + 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 nicInternalName; + public void setNicInternalName(java.lang.String nicInternalName) { + this.nicInternalName = nicInternalName; + } + public java.lang.String getNicInternalName() { + return this.nicInternalName; + } + + public int deviceId; + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + public int getDeviceId() { + return this.deviceId; + } + + public java.lang.String metaData; + public void setMetaData(java.lang.String metaData) { + this.metaData = metaData; + } + public java.lang.String getMetaData() { + return this.metaData; + } + + public java.lang.Boolean useVirtio; + public void setUseVirtio(java.lang.Boolean useVirtio) { + this.useVirtio = useVirtio; + } + public java.lang.Boolean getUseVirtio() { + return this.useVirtio; + } + + public int bootOrder; + public void setBootOrder(int bootOrder) { + this.bootOrder = bootOrder; + } + public int getBootOrder() { + return this.bootOrder; + } + + public java.lang.Integer mtu; + public void setMtu(java.lang.Integer mtu) { + this.mtu = mtu; + } + public java.lang.Integer getMtu() { + return this.mtu; + } + + public java.lang.String driverType; + public void setDriverType(java.lang.String driverType) { + this.driverType = driverType; + } + public java.lang.String getDriverType() { + return this.driverType; + } + + public VHostAddOn vHostAddOn; + public void setVHostAddOn(VHostAddOn vHostAddOn) { + this.vHostAddOn = vHostAddOn; + } + public VHostAddOn getVHostAddOn() { + return this.vHostAddOn; + } + + public DeviceAddress pci; + public void setPci(DeviceAddress pci) { + this.pci = pci; + } + public DeviceAddress getPci() { + return this.pci; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.String vlanId; + public void setVlanId(java.lang.String vlanId) { + this.vlanId = vlanId; + } + public java.lang.String getVlanId() { + return this.vlanId; + } + + public java.lang.String pciDeviceAddress; + public void setPciDeviceAddress(java.lang.String pciDeviceAddress) { + this.pciDeviceAddress = pciDeviceAddress; + } + public java.lang.String getPciDeviceAddress() { + return this.pciDeviceAddress; + } + + public java.lang.String ipForTf; + public void setIpForTf(java.lang.String ipForTf) { + this.ipForTf = ipForTf; + } + public java.lang.String getIpForTf() { + return this.ipForTf; + } + + public java.lang.String l2NetworkUuid; + public void setL2NetworkUuid(java.lang.String l2NetworkUuid) { + this.l2NetworkUuid = l2NetworkUuid; + } + public java.lang.String getL2NetworkUuid() { + return this.l2NetworkUuid; + } + + public java.lang.String srcPath; + public void setSrcPath(java.lang.String srcPath) { + this.srcPath = srcPath; + } + public java.lang.String getSrcPath() { + return this.srcPath; + } + + public java.lang.Boolean cleanTraffic; + public void setCleanTraffic(java.lang.Boolean cleanTraffic) { + this.cleanTraffic = cleanTraffic; + } + public java.lang.Boolean getCleanTraffic() { + return this.cleanTraffic; + } + + public java.lang.Boolean isolated; + public void setIsolated(java.lang.Boolean isolated) { + this.isolated = isolated; + } + public java.lang.Boolean getIsolated() { + return this.isolated; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java b/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java index 3b32a96a2c8..8e96ac05b94 100644 --- a/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/OAuth2ClientInventory.java @@ -60,6 +60,14 @@ public java.lang.String getIdentityProvider() { return this.identityProvider; } + public java.lang.String pluginUuid; + public void setPluginUuid(java.lang.String pluginUuid) { + this.pluginUuid = pluginUuid; + } + public java.lang.String getPluginUuid() { + return this.pluginUuid; + } + public java.lang.String logoutUrl; public void setLogoutUrl(java.lang.String logoutUrl) { this.logoutUrl = logoutUrl; diff --git a/sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java new file mode 100644 index 00000000000..5bbc2517b70 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerOfferingInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ObservabilityServerOfferingInventory extends org.zstack.sdk.InstanceOfferingInventory { + + public java.lang.String managementNetworkUuid; + public void setManagementNetworkUuid(java.lang.String managementNetworkUuid) { + this.managementNetworkUuid = managementNetworkUuid; + } + public java.lang.String getManagementNetworkUuid() { + return this.managementNetworkUuid; + } + + public java.lang.String publicNetworkUuid; + public void setPublicNetworkUuid(java.lang.String publicNetworkUuid) { + this.publicNetworkUuid = publicNetworkUuid; + } + public java.lang.String getPublicNetworkUuid() { + return this.publicNetworkUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.Boolean isDefault; + public void setIsDefault(java.lang.Boolean isDefault) { + this.isDefault = isDefault; + } + public java.lang.Boolean getIsDefault() { + return this.isDefault; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java new file mode 100644 index 00000000000..be26a28052e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerServiceDataInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ObservabilityServerServiceDataInventory { + + public java.lang.String job; + public void setJob(java.lang.String job) { + this.job = job; + } + public java.lang.String getJob() { + return this.job; + } + + public java.lang.String fileName; + public void setFileName(java.lang.String fileName) { + this.fileName = fileName; + } + public java.lang.String getFileName() { + return this.fileName; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java new file mode 100644 index 00000000000..a21959e5ed1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ObservabilityServerVmInventory.java @@ -0,0 +1,15 @@ +package org.zstack.sdk; + + + +public class ObservabilityServerVmInventory extends org.zstack.sdk.ApplianceVmInventory { + + public java.lang.String publicNetworkUuid; + public void setPublicNetworkUuid(java.lang.String publicNetworkUuid) { + this.publicNetworkUuid = publicNetworkUuid; + } + public java.lang.String getPublicNetworkUuid() { + return this.publicNetworkUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OptionType.java b/sdk/src/main/java/org/zstack/sdk/OptionType.java new file mode 100644 index 00000000000..c3650c82054 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OptionType.java @@ -0,0 +1,311 @@ +package org.zstack.sdk; + +import org.zstack.sdk.InputType; + +public class OptionType { + + 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 code; + public void setCode(java.lang.String code) { + this.code = code; + } + public java.lang.String getCode() { + return this.code; + } + + public java.lang.String category; + public void setCategory(java.lang.String category) { + this.category = category; + } + public java.lang.String getCategory() { + return this.category; + } + + public java.lang.Boolean required; + public void setRequired(java.lang.Boolean required) { + this.required = required; + } + public java.lang.Boolean getRequired() { + return this.required; + } + + public java.lang.Boolean editable; + public void setEditable(java.lang.Boolean editable) { + this.editable = editable; + } + public java.lang.Boolean getEditable() { + return this.editable; + } + + public java.lang.Boolean enabled; + public void setEnabled(java.lang.Boolean enabled) { + this.enabled = enabled; + } + public java.lang.Boolean getEnabled() { + return this.enabled; + } + + public java.lang.Integer displayOrder; + public void setDisplayOrder(java.lang.Integer displayOrder) { + this.displayOrder = displayOrder; + } + public java.lang.Integer getDisplayOrder() { + return this.displayOrder; + } + + public InputType inputType; + public void setInputType(InputType inputType) { + this.inputType = inputType; + } + public InputType getInputType() { + return this.inputType; + } + + public java.lang.String placeHolderText; + public void setPlaceHolderText(java.lang.String placeHolderText) { + this.placeHolderText = placeHolderText; + } + public java.lang.String getPlaceHolderText() { + return this.placeHolderText; + } + + public java.lang.String defaultValue; + public void setDefaultValue(java.lang.String defaultValue) { + this.defaultValue = defaultValue; + } + public java.lang.String getDefaultValue() { + return this.defaultValue; + } + + public java.lang.String noSelection; + public void setNoSelection(java.lang.String noSelection) { + this.noSelection = noSelection; + } + public java.lang.String getNoSelection() { + return this.noSelection; + } + + public java.lang.Boolean noBlank; + public void setNoBlank(java.lang.Boolean noBlank) { + this.noBlank = noBlank; + } + public java.lang.Boolean getNoBlank() { + return this.noBlank; + } + + public java.lang.Boolean secretField; + public void setSecretField(java.lang.Boolean secretField) { + this.secretField = secretField; + } + public java.lang.Boolean getSecretField() { + return this.secretField; + } + + public java.lang.Long minVal; + public void setMinVal(java.lang.Long minVal) { + this.minVal = minVal; + } + public java.lang.Long getMinVal() { + return this.minVal; + } + + public java.lang.Long maxVal; + public void setMaxVal(java.lang.Long maxVal) { + this.maxVal = maxVal; + } + public java.lang.Long getMaxVal() { + return this.maxVal; + } + + public java.lang.Long minLength; + public void setMinLength(java.lang.Long minLength) { + this.minLength = minLength; + } + public java.lang.Long getMinLength() { + return this.minLength; + } + + public java.lang.Long maxLength; + public void setMaxLength(java.lang.Long maxLength) { + this.maxLength = maxLength; + } + public java.lang.Long getMaxLength() { + return this.maxLength; + } + + public java.lang.String fieldContext; + public void setFieldContext(java.lang.String fieldContext) { + this.fieldContext = fieldContext; + } + public java.lang.String getFieldContext() { + return this.fieldContext; + } + + public java.lang.String fieldClass; + public void setFieldClass(java.lang.String fieldClass) { + this.fieldClass = fieldClass; + } + public java.lang.String getFieldClass() { + return this.fieldClass; + } + + public java.lang.String fieldLabel; + public void setFieldLabel(java.lang.String fieldLabel) { + this.fieldLabel = fieldLabel; + } + public java.lang.String getFieldLabel() { + return this.fieldLabel; + } + + public java.lang.String fieldCode; + public void setFieldCode(java.lang.String fieldCode) { + this.fieldCode = fieldCode; + } + public java.lang.String getFieldCode() { + return this.fieldCode; + } + + public java.lang.String fieldName; + public void setFieldName(java.lang.String fieldName) { + this.fieldName = fieldName; + } + public java.lang.String getFieldName() { + return this.fieldName; + } + + public java.lang.String fieldGetName; + public void setFieldGetName(java.lang.String fieldGetName) { + this.fieldGetName = fieldGetName; + } + public java.lang.String getFieldGetName() { + return this.fieldGetName; + } + + public java.lang.String fieldSetName; + public void setFieldSetName(java.lang.String fieldSetName) { + this.fieldSetName = fieldSetName; + } + public java.lang.String getFieldSetName() { + return this.fieldSetName; + } + + public java.lang.String fieldGetContext; + public void setFieldGetContext(java.lang.String fieldGetContext) { + this.fieldGetContext = fieldGetContext; + } + public java.lang.String getFieldGetContext() { + return this.fieldGetContext; + } + + public java.lang.String fieldSetContext; + public void setFieldSetContext(java.lang.String fieldSetContext) { + this.fieldSetContext = fieldSetContext; + } + public java.lang.String getFieldSetContext() { + return this.fieldSetContext; + } + + public java.lang.String fieldGroup; + public void setFieldGroup(java.lang.String fieldGroup) { + this.fieldGroup = fieldGroup; + } + public java.lang.String getFieldGroup() { + return this.fieldGroup; + } + + public java.lang.String fieldGroupI18nCode; + public void setFieldGroupI18nCode(java.lang.String fieldGroupI18nCode) { + this.fieldGroupI18nCode = fieldGroupI18nCode; + } + public java.lang.String getFieldGroupI18nCode() { + return this.fieldGroupI18nCode; + } + + public java.lang.String helpText; + public void setHelpText(java.lang.String helpText) { + this.helpText = helpText; + } + public java.lang.String getHelpText() { + return this.helpText; + } + + public java.lang.String helpTextI18nCode; + public void setHelpTextI18nCode(java.lang.String helpTextI18nCode) { + this.helpTextI18nCode = helpTextI18nCode; + } + public java.lang.String getHelpTextI18nCode() { + return this.helpTextI18nCode; + } + + public java.lang.String optionSourceType; + public void setOptionSourceType(java.lang.String optionSourceType) { + this.optionSourceType = optionSourceType; + } + public java.lang.String getOptionSourceType() { + return this.optionSourceType; + } + + public java.lang.String optionSource; + public void setOptionSource(java.lang.String optionSource) { + this.optionSource = optionSource; + } + public java.lang.String getOptionSource() { + return this.optionSource; + } + + public java.lang.String dependsOn; + public void setDependsOn(java.lang.String dependsOn) { + this.dependsOn = dependsOn; + } + public java.lang.String getDependsOn() { + return this.dependsOn; + } + + public java.lang.Boolean showOnEdit; + public void setShowOnEdit(java.lang.Boolean showOnEdit) { + this.showOnEdit = showOnEdit; + } + public java.lang.Boolean getShowOnEdit() { + return this.showOnEdit; + } + + public java.lang.Boolean displayValueOnDetails; + public void setDisplayValueOnDetails(java.lang.Boolean displayValueOnDetails) { + this.displayValueOnDetails = displayValueOnDetails; + } + public java.lang.Boolean getDisplayValueOnDetails() { + return this.displayValueOnDetails; + } + + public java.lang.Boolean showOnCreate; + public void setShowOnCreate(java.lang.Boolean showOnCreate) { + this.showOnCreate = showOnCreate; + } + public java.lang.Boolean getShowOnCreate() { + return this.showOnCreate; + } + + public java.lang.String verifyPattern; + public void setVerifyPattern(java.lang.String verifyPattern) { + this.verifyPattern = verifyPattern; + } + public java.lang.String getVerifyPattern() { + return this.verifyPattern; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java new file mode 100644 index 00000000000..3a68e782b29 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmInstanceInventory.java @@ -0,0 +1,8 @@ +package org.zstack.sdk; + + + +public class OvnControllerVmInstanceInventory extends org.zstack.sdk.ApplianceVmInventory { + + +} diff --git a/sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java new file mode 100644 index 00000000000..49e6a80e53b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/OvnControllerVmOfferingInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class OvnControllerVmOfferingInventory extends org.zstack.sdk.InstanceOfferingInventory { + + public java.lang.String managementNetworkUuid; + public void setManagementNetworkUuid(java.lang.String managementNetworkUuid) { + this.managementNetworkUuid = managementNetworkUuid; + } + public java.lang.String getManagementNetworkUuid() { + return this.managementNetworkUuid; + } + + public java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String imageUuid; + public void setImageUuid(java.lang.String imageUuid) { + this.imageUuid = imageUuid; + } + public java.lang.String getImageUuid() { + return this.imageUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java index 0619513ab97..6bead4ce0d9 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceSpecInventory.java @@ -117,6 +117,14 @@ public java.lang.Boolean getIsVirtual() { return this.isVirtual; } + public boolean allowResourceConfigWithMultipleDevices; + public void setAllowResourceConfigWithMultipleDevices(boolean allowResourceConfigWithMultipleDevices) { + this.allowResourceConfigWithMultipleDevices = allowResourceConfigWithMultipleDevices; + } + public boolean getAllowResourceConfigWithMultipleDevices() { + return this.allowResourceConfigWithMultipleDevices; + } + public java.lang.String romVersion; public void setRomVersion(java.lang.String romVersion) { this.romVersion = romVersion; @@ -149,4 +157,12 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public java.lang.Integer maxAvailableDevicesPerHost; + public void setMaxAvailableDevicesPerHost(java.lang.Integer maxAvailableDevicesPerHost) { + this.maxAvailableDevicesPerHost = maxAvailableDevicesPerHost; + } + public java.lang.Integer getMaxAvailableDevicesPerHost() { + return this.maxAvailableDevicesPerHost; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java index 4143a18f8b8..2d6cc7a4bac 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceType.java @@ -7,6 +7,7 @@ public enum PciDeviceType { GPU_Serial_Controller, GPU_3D_Controller, GPU_Processing_Accelerators, + GPU_Co_Processor, Ethernet_Controller, Audio_Controller, USB_Controller, diff --git a/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java b/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java index cc97f300b50..e59f4237d25 100644 --- a/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java +++ b/sdk/src/main/java/org/zstack/sdk/PciDeviceVirtStatus.java @@ -8,5 +8,6 @@ public enum PciDeviceVirtStatus { VFIO_MDEV_VIRTUALIZED, SRIOV_VIRTUAL, VIRTUALIZED_BYPASS_ZSTACK, + HAMI_VIRTUALIZED, UNKNOWN, } diff --git a/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java new file mode 100644 index 00000000000..b2ad514a15f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchInventory.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + + + +public class PhysicalSwitchInventory { + + 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 java.lang.String ip; + public void setIp(java.lang.String ip) { + this.ip = ip; + } + public java.lang.String getIp() { + return this.ip; + } + + public java.lang.String mac; + public void setMac(java.lang.String mac) { + this.mac = mac; + } + public java.lang.String getMac() { + return this.mac; + } + + public java.lang.String mode; + public void setMode(java.lang.String mode) { + this.mode = mode; + } + public java.lang.String getMode() { + return this.mode; + } + + public java.lang.String softwareVersion; + public void setSoftwareVersion(java.lang.String softwareVersion) { + this.softwareVersion = softwareVersion; + } + public java.lang.String getSoftwareVersion() { + return this.softwareVersion; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + 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; + } + + public java.util.List ports; + public void setPorts(java.util.List ports) { + this.ports = ports; + } + public java.util.List getPorts() { + return this.ports; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java new file mode 100644 index 00000000000..f9ecabfa199 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PhysicalSwitchPortInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk; + + + +public class PhysicalSwitchPortInventory { + + 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 java.lang.String ethTrunkName; + public void setEthTrunkName(java.lang.String ethTrunkName) { + this.ethTrunkName = ethTrunkName; + } + public java.lang.String getEthTrunkName() { + return this.ethTrunkName; + } + + public java.lang.String portType; + public void setPortType(java.lang.String portType) { + this.portType = portType; + } + public java.lang.String getPortType() { + return this.portType; + } + + public java.lang.String peerInterfaceUuid; + public void setPeerInterfaceUuid(java.lang.String peerInterfaceUuid) { + this.peerInterfaceUuid = peerInterfaceUuid; + } + public java.lang.String getPeerInterfaceUuid() { + return this.peerInterfaceUuid; + } + + public java.lang.String switchUuid; + public void setSwitchUuid(java.lang.String switchUuid) { + this.switchUuid = switchUuid; + } + public java.lang.String getSwitchUuid() { + return this.switchUuid; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + 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/PluginDriverInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java new file mode 100644 index 00000000000..f3a2b687134 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PluginDriverInventory.java @@ -0,0 +1,103 @@ +package org.zstack.sdk; + + + +public class PluginDriverInventory { + + 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 type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String features; + public void setFeatures(java.lang.String features) { + this.features = features; + } + public java.lang.String getFeatures() { + return this.features; + } + + public java.util.Collection optionTypes; + public void setOptionTypes(java.util.Collection optionTypes) { + this.optionTypes = optionTypes; + } + public java.util.Collection getOptionTypes() { + return this.optionTypes; + } + + public boolean deleted; + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + public boolean getDeleted() { + return this.deleted; + } + + public java.lang.String license; + public void setLicense(java.lang.String license) { + this.license = license; + } + public java.lang.String getLicense() { + return this.license; + } + + 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 description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + 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/PluginSecretResourcePoolInventory.java b/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java new file mode 100644 index 00000000000..a8a5cd8feb1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PluginSecretResourcePoolInventory.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class PluginSecretResourcePoolInventory extends org.zstack.sdk.SecretResourcePoolInventory { + + public java.lang.String properties; + public void setProperties(java.lang.String properties) { + this.properties = properties; + } + public java.lang.String getProperties() { + return this.properties; + } + + public java.lang.String pluginDriverUuid; + public void setPluginDriverUuid(java.lang.String pluginDriverUuid) { + this.pluginDriverUuid = pluginDriverUuid; + } + public java.lang.String getPluginDriverUuid() { + return this.pluginDriverUuid; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PodInventory.java b/sdk/src/main/java/org/zstack/sdk/PodInventory.java new file mode 100644 index 00000000000..1e7db6ae39f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PodInventory.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class PodInventory extends org.zstack.sdk.VmInstanceInventory { + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String namespace; + public void setNamespace(java.lang.String namespace) { + this.namespace = namespace; + } + public java.lang.String getNamespace() { + return this.namespace; + } + + public java.lang.Long clusterId; + public void setClusterId(java.lang.Long clusterId) { + this.clusterId = clusterId; + } + public java.lang.Long getClusterId() { + return this.clusterId; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java index 1d1884789aa..60e8edc1025 100644 --- a/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/PrimaryStorageMigrateVmAction.java @@ -37,13 +37,16 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean withDataVolumes = true; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List dataVolumeUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean withSnapshots = true; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Integer downTime; - @Param(required = false, validValues = {"auto-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"auto-converge","no-converge"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String strategy; @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/ProjectRepositoryInventory.java b/sdk/src/main/java/org/zstack/sdk/ProjectRepositoryInventory.java new file mode 100644 index 00000000000..8ea1651d122 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ProjectRepositoryInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + + + +public class ProjectRepositoryInventory { + + public java.lang.Integer zeProjectID; + public void setZeProjectID(java.lang.Integer zeProjectID) { + this.zeProjectID = zeProjectID; + } + public java.lang.Integer getZeProjectID() { + return this.zeProjectID; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.Boolean readonly; + public void setReadonly(java.lang.Boolean readonly) { + this.readonly = readonly; + } + public java.lang.Boolean getReadonly() { + return this.readonly; + } + + 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.Integer imageCount; + public void setImageCount(java.lang.Integer imageCount) { + this.imageCount = imageCount; + } + public java.lang.Integer getImageCount() { + return this.imageCount; + } + + public java.lang.Long ID; + public void setID(java.lang.Long ID) { + this.ID = ID; + } + public java.lang.Long getID() { + return this.ID; + } + + public java.lang.String desc; + public void setDesc(java.lang.String desc) { + this.desc = desc; + } + public java.lang.String getDesc() { + return this.desc; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.Integer chartCount; + public void setChartCount(java.lang.Integer chartCount) { + this.chartCount = chartCount; + } + public java.lang.Integer getChartCount() { + return this.chartCount; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java new file mode 100644 index 00000000000..615aeedd813 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class PullSdnControllerTenantAction 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.PullSdnControllerTenantResult 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.PullSdnControllerTenantResult value = res.getResult(org.zstack.sdk.PullSdnControllerTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.PullSdnControllerTenantResult() : 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 = "/sdn-controllers/{uuid}/tenant/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "pullSdnControllerTenant"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java new file mode 100644 index 00000000000..0627e44bd89 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/PullSdnControllerTenantResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class PullSdnControllerTenantResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java new file mode 100644 index 00000000000..f6248226fc0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryApplicationDevelopmentServiceAction 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.QueryApplicationDevelopmentServiceResult 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.QueryApplicationDevelopmentServiceResult value = res.getResult(org.zstack.sdk.QueryApplicationDevelopmentServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryApplicationDevelopmentServiceResult() : 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/app/"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java new file mode 100644 index 00000000000..6437b47dd52 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryApplicationDevelopmentServiceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryApplicationDevelopmentServiceResult { + 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/org/zstack/sdk/QueryCbtTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java new file mode 100644 index 00000000000..7ba3a86c7f4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryCbtTaskAction 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.QueryCbtTaskResult 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.QueryCbtTaskResult value = res.getResult(org.zstack.sdk.QueryCbtTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryCbtTaskResult() : 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 = "/cbt-task"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java new file mode 100644 index 00000000000..470267e3742 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryCbtTaskResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryCbtTaskResult { + 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/org/zstack/sdk/QueryContainerImageAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java new file mode 100644 index 00000000000..3938fbcdec4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryContainerImageAction 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.QueryContainerImageResult 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.QueryContainerImageResult value = res.getResult(org.zstack.sdk.QueryContainerImageResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryContainerImageResult() : 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 = "/container/images"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java new file mode 100644 index 00000000000..772a47e2179 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerImageResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryContainerImageResult { + 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/org/zstack/sdk/QueryContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java new file mode 100644 index 00000000000..21ad927e2b6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryContainerManagementEndpointAction 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.QueryContainerManagementEndpointResult 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.QueryContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.QueryContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryContainerManagementEndpointResult() : 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 = "/container/management/endpoint"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java new file mode 100644 index 00000000000..5e7621c2221 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryContainerManagementEndpointResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryContainerManagementEndpointResult { + 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/org/zstack/sdk/QueryDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java new file mode 100644 index 00000000000..54a94e20af7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryDatasetAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryDatasetAction 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.QueryDatasetResult 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.QueryDatasetResult value = res.getResult(org.zstack.sdk.QueryDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryDatasetResult() : 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/datasets"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java new file mode 100644 index 00000000000..5b6df199b9c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryDatasetResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryDatasetResult { + 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/org/zstack/sdk/QueryFcHbaDeviceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java new file mode 100644 index 00000000000..0d1335eaaab --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryFcHbaDeviceAction 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.QueryFcHbaDeviceResult 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.QueryFcHbaDeviceResult value = res.getResult(org.zstack.sdk.QueryFcHbaDeviceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryFcHbaDeviceResult() : 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 = "/storage-devices/hba"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java new file mode 100644 index 00000000000..08aedde3a23 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryFcHbaDeviceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryFcHbaDeviceResult { + 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/org/zstack/sdk/QueryImageGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java new file mode 100644 index 00000000000..609b52d35cc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryImageGroupAction 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.QueryImageGroupResult 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.QueryImageGroupResult value = res.getResult(org.zstack.sdk.QueryImageGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryImageGroupResult() : 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 = "/imagegroups"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java new file mode 100644 index 00000000000..970ca5d3e29 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryImageGroupRefAction 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.QueryImageGroupRefResult 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.QueryImageGroupRefResult value = res.getResult(org.zstack.sdk.QueryImageGroupRefResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryImageGroupRefResult() : 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 = "/imagegrouprefs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java new file mode 100644 index 00000000000..4870dddbba2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupRefResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryImageGroupRefResult { + 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/org/zstack/sdk/QueryImageGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupResult.java new file mode 100644 index 00000000000..a2352e38668 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryImageGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryImageGroupResult { + 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/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/org/zstack/sdk/QueryModelAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java new file mode 100644 index 00000000000..e93b4f4a03a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelAction 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.QueryModelResult 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.QueryModelResult value = res.getResult(org.zstack.sdk.QueryModelResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelResult() : 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/models"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java new file mode 100644 index 00000000000..dd08be13bb9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelCenterAction 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.QueryModelCenterResult 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.QueryModelCenterResult value = res.getResult(org.zstack.sdk.QueryModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelCenterResult() : 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-centers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java new file mode 100644 index 00000000000..3196f0a0e5e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelCenterResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelCenterResult { + 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/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java new file mode 100644 index 00000000000..303ffd940e9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelEvalServiceInstanceGroupAction 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.QueryModelServiceInstanceGroupResult 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.QueryModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.QueryModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelServiceInstanceGroupResult() : 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-eval-services/instances/groups/"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java new file mode 100644 index 00000000000..aa64249c0fd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvalServiceInstanceGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelEvalServiceInstanceGroupResult { + 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/org/zstack/sdk/QueryModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java new file mode 100644 index 00000000000..54aca235a7d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelEvaluationTaskAction 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.QueryModelEvaluationTaskResult 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.QueryModelEvaluationTaskResult value = res.getResult(org.zstack.sdk.QueryModelEvaluationTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelEvaluationTaskResult() : 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 = "/model-evaluation-tasks"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java new file mode 100644 index 00000000000..c0f09c14817 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelEvaluationTaskResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelEvaluationTaskResult { + 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/org/zstack/sdk/QueryModelResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelResult.java new file mode 100644 index 00000000000..2546d91e798 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelResult { + 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/org/zstack/sdk/QueryModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java new file mode 100644 index 00000000000..362ca8d1d80 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelServiceAction 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.QueryModelServiceResult 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.QueryModelServiceResult value = res.getResult(org.zstack.sdk.QueryModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelServiceResult() : 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"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java new file mode 100644 index 00000000000..e49163d2a00 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryModelServiceInstanceGroupAction 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.QueryModelServiceInstanceGroupResult 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.QueryModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.QueryModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryModelServiceInstanceGroupResult() : 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/instances/groups/"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java new file mode 100644 index 00000000000..4c0156d2870 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceInstanceGroupResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelServiceInstanceGroupResult { + 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/org/zstack/sdk/QueryModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceResult.java new file mode 100644 index 00000000000..214d364a141 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryModelServiceResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryModelServiceResult { + 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/org/zstack/sdk/QueryNativeClusterAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java new file mode 100644 index 00000000000..36c955da9ff --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryNativeClusterAction 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.QueryNativeClusterResult 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.QueryNativeClusterResult value = res.getResult(org.zstack.sdk.QueryNativeClusterResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNativeClusterResult() : 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 = "/container/native/cluster"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterResult.java new file mode 100644 index 00000000000..596c2e681ac --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeClusterResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryNativeClusterResult { + 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/org/zstack/sdk/QueryNativeHostAction.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java new file mode 100644 index 00000000000..59f4c4141f8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryNativeHostAction 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.QueryNativeHostResult 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.QueryNativeHostResult value = res.getResult(org.zstack.sdk.QueryNativeHostResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryNativeHostResult() : 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 = "/container/native/host"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java new file mode 100644 index 00000000000..47f05f56130 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryNativeHostResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryNativeHostResult { + 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/org/zstack/sdk/QueryPhysicalSwitchAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java new file mode 100644 index 00000000000..50e7691813e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryPhysicalSwitchAction 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.QueryPhysicalSwitchResult 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.QueryPhysicalSwitchResult value = res.getResult(org.zstack.sdk.QueryPhysicalSwitchResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryPhysicalSwitchResult() : 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 = "/topo/physical-switches"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java new file mode 100644 index 00000000000..d111c05dd37 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPhysicalSwitchResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryPhysicalSwitchResult { + 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/org/zstack/sdk/QueryPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java new file mode 100644 index 00000000000..6625e97f9e7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryPluginDriversAction 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.QueryPluginDriversResult 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.QueryPluginDriversResult value = res.getResult(org.zstack.sdk.QueryPluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryPluginDriversResult() : 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 = "/external/plugins"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java new file mode 100644 index 00000000000..c0661884e78 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryPluginDriversResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryPluginDriversResult { + 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/org/zstack/sdk/QueryTrainedModelRecordAction.java b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java new file mode 100644 index 00000000000..97c03cc82c5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryTrainedModelRecordAction 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.QueryTrainedModelRecordResult 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.QueryTrainedModelRecordResult value = res.getResult(org.zstack.sdk.QueryTrainedModelRecordResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryTrainedModelRecordResult() : 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/trained-model/records"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java new file mode 100644 index 00000000000..6e742e426b7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryTrainedModelRecordResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryTrainedModelRecordResult { + 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/org/zstack/sdk/QueryUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java new file mode 100644 index 00000000000..e53372d80e1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryUserProxyConfigAction 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.QueryUserProxyConfigResult 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.QueryUserProxyConfigResult value = res.getResult(org.zstack.sdk.QueryUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryUserProxyConfigResult() : 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 = "/user-proxy-configs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java new file mode 100644 index 00000000000..7cae15cc6d0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryUserProxyConfigResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryUserProxyConfigResult { + 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/org/zstack/sdk/QueryZdfsAction.java b/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java new file mode 100644 index 00000000000..638883de716 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryZdfsAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryZdfsAction 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.QueryZdfsResult 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.QueryZdfsResult value = res.getResult(org.zstack.sdk.QueryZdfsResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryZdfsResult() : 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 = "/zdfs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java b/sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java new file mode 100644 index 00000000000..83e1736bdf4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryZdfsResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryZdfsResult { + 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/org/zstack/sdk/ReconnectSdnControllerAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java new file mode 100644 index 00000000000..f0e74e26df5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ReconnectSdnControllerAction 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.ReconnectSdnControllerResult 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 sdnControllerUuid; + + @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.ReconnectSdnControllerResult value = res.getResult(org.zstack.sdk.ReconnectSdnControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.ReconnectSdnControllerResult() : 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 = "/sdn-controllers/{sdnControllerUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "reconnectSdnController"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java new file mode 100644 index 00000000000..875ea6bd980 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectSdnControllerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class ReconnectSdnControllerResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java new file mode 100644 index 00000000000..10324cbb46a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ReconnectZdfsAction 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.ReconnectZdfsResult 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.ReconnectZdfsResult value = res.getResult(org.zstack.sdk.ReconnectZdfsResult.class); + ret.value = value == null ? new org.zstack.sdk.ReconnectZdfsResult() : 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 = "/zdfs/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "reconnectZdfs"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java new file mode 100644 index 00000000000..c7e7488c012 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectZdfsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ZdfsInventory; + +public class ReconnectZdfsResult { + public ZdfsInventory inventory; + public void setInventory(ZdfsInventory inventory) { + this.inventory = inventory; + } + public ZdfsInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java new file mode 100644 index 00000000000..c68eb5f9909 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RefreshPluginDriversAction 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.RefreshPluginDriversResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @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.RefreshPluginDriversResult value = res.getResult(org.zstack.sdk.RefreshPluginDriversResult.class); + ret.value = value == null ? new org.zstack.sdk.RefreshPluginDriversResult() : 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 = "/external/plugins"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "refreshPluginDrivers"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java new file mode 100644 index 00000000000..84bda1da810 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshPluginDriversResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class RefreshPluginDriversResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java new file mode 100644 index 00000000000..e9bafeb0065 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RefreshSSOServerTokenAction 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.RefreshSSOServerTokenResult 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 token; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {60L,31536000L}, noTrim = false) + public java.lang.Long duration; + + @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.RefreshSSOServerTokenResult value = res.getResult(org.zstack.sdk.RefreshSSOServerTokenResult.class); + ret.value = value == null ? new org.zstack.sdk.RefreshSSOServerTokenResult() : 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 = "/sso/server/token/refresh"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "refreshSSOServerToken"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java new file mode 100644 index 00000000000..2ab2a219149 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RefreshSSOServerTokenResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SSOServerTokenInventory; + +public class RefreshSSOServerTokenResult { + public SSOServerTokenInventory inventory; + public void setInventory(SSOServerTokenInventory inventory) { + this.inventory = inventory; + } + public SSOServerTokenInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java index 4b26be3291e..4133773a938 100644 --- a/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/RegisterLicenseRequestedApplicationAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String clientPubKey; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long currentTimeMillis; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java index 33603c88987..050873aae34 100644 --- a/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java +++ b/sdk/src/main/java/org/zstack/sdk/ReloadLicenseAction.java @@ -28,6 +28,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) public java.util.List managementNodeUuids; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String additionSession; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/RestInfo.java b/sdk/src/main/java/org/zstack/sdk/RestInfo.java index de40ecb0979..1ba8ebddf88 100755 --- a/sdk/src/main/java/org/zstack/sdk/RestInfo.java +++ b/sdk/src/main/java/org/zstack/sdk/RestInfo.java @@ -9,4 +9,5 @@ public class RestInfo { public boolean needSession; public boolean needPoll; public String parameterName; + public String morphTransform; } diff --git a/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java new file mode 100644 index 00000000000..44c882a6a5f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RestartModelServiceGroupsAction 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.RestartModelServiceGroupsResult 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 = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List uuids; + + @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.RestartModelServiceGroupsResult value = res.getResult(org.zstack.sdk.RestartModelServiceGroupsResult.class); + ret.value = value == null ? new org.zstack.sdk.RestartModelServiceGroupsResult() : 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 = "/model-service-instance-groups"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "restartModelServiceGroups"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java new file mode 100644 index 00000000000..b360f3532f3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RestartModelServiceGroupsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class RestartModelServiceGroupsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java b/sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java new file mode 100644 index 00000000000..0296179fc1c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RuleAttributeType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum RuleAttributeType { + SYSTEM, + CUSTOM, +} diff --git a/sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java b/sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java new file mode 100644 index 00000000000..8dba965aad9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SAML2ClientInventory.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SAML2State; + +public class SAML2ClientInventory extends org.zstack.sdk.SSOClientInventory { + + public java.lang.String idpMetadataBase64; + public void setIdpMetadataBase64(java.lang.String idpMetadataBase64) { + this.idpMetadataBase64 = idpMetadataBase64; + } + public java.lang.String getIdpMetadataBase64() { + return this.idpMetadataBase64; + } + + public java.lang.String spX509Certificate; + public void setSpX509Certificate(java.lang.String spX509Certificate) { + this.spX509Certificate = spX509Certificate; + } + public java.lang.String getSpX509Certificate() { + return this.spX509Certificate; + } + + public java.lang.String spMetadataUrl; + public void setSpMetadataUrl(java.lang.String spMetadataUrl) { + this.spMetadataUrl = spMetadataUrl; + } + public java.lang.String getSpMetadataUrl() { + return this.spMetadataUrl; + } + + public SAML2State state; + public void setState(SAML2State state) { + this.state = state; + } + public SAML2State getState() { + return this.state; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SAML2State.java b/sdk/src/main/java/org/zstack/sdk/SAML2State.java new file mode 100644 index 00000000000..48c4a0a880d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SAML2State.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum SAML2State { + Enabled, + Disabled, +} diff --git a/sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java b/sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java new file mode 100644 index 00000000000..f0bdd5b1751 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SSOClientAttributeInventory.java @@ -0,0 +1,72 @@ +package org.zstack.sdk; + +import org.zstack.sdk.RuleAttributeType; +import org.zstack.sdk.AttributePurpose; + +public class SSOClientAttributeInventory { + + 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 value; + public void setValue(java.lang.String value) { + this.value = value; + } + public java.lang.String getValue() { + return this.value; + } + + public RuleAttributeType type; + public void setType(RuleAttributeType type) { + this.type = type; + } + public RuleAttributeType getType() { + return this.type; + } + + public AttributePurpose purpose; + public void setPurpose(AttributePurpose purpose) { + this.purpose = purpose; + } + public AttributePurpose getPurpose() { + return this.purpose; + } + + public java.lang.String ssoClientUuid; + public void setSsoClientUuid(java.lang.String ssoClientUuid) { + this.ssoClientUuid = ssoClientUuid; + } + public java.lang.String getSsoClientUuid() { + return this.ssoClientUuid; + } + + 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/SSOClientInventory.java b/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java index 2e9cf88a3a2..52e7328ae24 100644 --- a/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SSOClientInventory.java @@ -84,4 +84,12 @@ public java.lang.String getAccountUuid() { return this.accountUuid; } + public java.util.List attributes; + public void setAttributes(java.util.List attributes) { + this.attributes = attributes; + } + public java.util.List getAttributes() { + return this.attributes; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java b/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java index 81f31b71f77..44701abb855 100644 --- a/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SSOServerTokenInventory.java @@ -44,6 +44,14 @@ public java.lang.String getUserUuid() { return this.userUuid; } + public java.lang.String sessionUuid; + public void setSessionUuid(java.lang.String sessionUuid) { + this.sessionUuid = sessionUuid; + } + public java.lang.String getSessionUuid() { + return this.sessionUuid; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java new file mode 100644 index 00000000000..f38a2a2e586 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SdnControllerAddHostAction 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.SdnControllerAddHostResult 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 sdnControllerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, validValues = {"OvnDpdk","OvnKernel"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "OvnDpdk"; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List nicNames; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vtepIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String netmask; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String bondMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String lacpMode; + + @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.SdnControllerAddHostResult value = res.getResult(org.zstack.sdk.SdnControllerAddHostResult.class); + ret.value = value == null ? new org.zstack.sdk.SdnControllerAddHostResult() : 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 = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "null"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java new file mode 100644 index 00000000000..1fce8c1b26e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerAddHostResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class SdnControllerAddHostResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java new file mode 100644 index 00000000000..2a79c889b76 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SdnControllerChangeHostAction 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.SdnControllerChangeHostResult 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 sdnControllerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, validValues = {"OvnDpdk","OvnKernel"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "OvnDpdk"; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List nicNames; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vtepIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String netmask; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String bondMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String lacpMode; + + @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.SdnControllerChangeHostResult value = res.getResult(org.zstack.sdk.SdnControllerChangeHostResult.class); + ret.value = value == null ? new org.zstack.sdk.SdnControllerChangeHostResult() : 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 = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "sdnControllerChangeHost"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java new file mode 100644 index 00000000000..eac4f6da547 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerChangeHostResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class SdnControllerChangeHostResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java new file mode 100644 index 00000000000..0d7dda066b9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerHostRefInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + + + +public class SdnControllerHostRefInventory { + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String vSwitchType; + public void setVSwitchType(java.lang.String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public java.lang.String getVSwitchType() { + return this.vSwitchType; + } + + public java.lang.String vtepIp; + public void setVtepIp(java.lang.String vtepIp) { + this.vtepIp = vtepIp; + } + public java.lang.String getVtepIp() { + return this.vtepIp; + } + + public java.lang.String nicPciAddresses; + public void setNicPciAddresses(java.lang.String nicPciAddresses) { + this.nicPciAddresses = nicPciAddresses; + } + public java.lang.String getNicPciAddresses() { + return this.nicPciAddresses; + } + + public java.lang.String nicDrivers; + public void setNicDrivers(java.lang.String nicDrivers) { + this.nicDrivers = nicDrivers; + } + public java.lang.String getNicDrivers() { + return this.nicDrivers; + } + + public java.lang.String netmask; + public void setNetmask(java.lang.String netmask) { + this.netmask = netmask; + } + public java.lang.String getNetmask() { + return this.netmask; + } + + public java.lang.String bondMode; + public void setBondMode(java.lang.String bondMode) { + this.bondMode = bondMode; + } + public java.lang.String getBondMode() { + return this.bondMode; + } + + public java.lang.String lacpMode; + public void setLacpMode(java.lang.String lacpMode) { + this.lacpMode = lacpMode; + } + public java.lang.String getLacpMode() { + return this.lacpMode; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java index 68878cedec1..33cf6ab7ae0 100644 --- a/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.SdnControllerStatus; public class SdnControllerInventory { @@ -20,6 +20,14 @@ public java.lang.String getVendorType() { return this.vendorType; } + public java.lang.String vendorVersion; + public void setVendorVersion(java.lang.String vendorVersion) { + this.vendorVersion = vendorVersion; + } + public java.lang.String getVendorVersion() { + return this.vendorVersion; + } + public java.lang.String name; public void setName(java.lang.String name) { this.name = name; @@ -60,6 +68,22 @@ public java.lang.String getPassword() { return this.password; } + public SdnControllerStatus status; + public void setStatus(SdnControllerStatus status) { + this.status = status; + } + public SdnControllerStatus getStatus() { + return this.status; + } + + public java.util.List hostRefs; + public void setHostRefs(java.util.List hostRefs) { + this.hostRefs = hostRefs; + } + public java.util.List getHostRefs() { + return this.hostRefs; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; @@ -76,20 +100,4 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } - public java.util.List vniRanges; - public void setVniRanges(java.util.List vniRanges) { - this.vniRanges = vniRanges; - } - public java.util.List getVniRanges() { - return this.vniRanges; - } - - public java.util.List vxlanPools; - public void setVxlanPools(java.util.List vxlanPools) { - this.vxlanPools = vxlanPools; - } - public java.util.List getVxlanPools() { - return this.vxlanPools; - } - } diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java new file mode 100644 index 00000000000..44fb47d5a2e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SdnControllerRemoveHostAction 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.SdnControllerRemoveHostResult 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 sdnControllerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, validValues = {"OvnDpdk","OvnKernel"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vSwitchType = "OvnDpdk"; + + @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.SdnControllerRemoveHostResult value = res.getResult(org.zstack.sdk.SdnControllerRemoveHostResult.class); + ret.value = value == null ? new org.zstack.sdk.SdnControllerRemoveHostResult() : 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 = "/sdn-controllers/{sdnControllerUuid}/hosts/{hostUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java new file mode 100644 index 00000000000..35798792306 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerRemoveHostResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SdnControllerInventory; + +public class SdnControllerRemoveHostResult { + public SdnControllerInventory inventory; + public void setInventory(SdnControllerInventory inventory) { + this.inventory = inventory; + } + public SdnControllerInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java b/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java new file mode 100644 index 00000000000..1e9e6f92289 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnControllerStatus.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum SdnControllerStatus { + Connecting, + Connected, + Disconnected, +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java b/sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java new file mode 100644 index 00000000000..d5ff24050f4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SdnVlanRange.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class SdnVlanRange { + + public java.lang.Integer startVlan; + public void setStartVlan(java.lang.Integer startVlan) { + this.startVlan = startVlan; + } + public java.lang.Integer getStartVlan() { + return this.startVlan; + } + + public java.lang.Integer endVlan; + public void setEndVlan(java.lang.Integer endVlan) { + this.endVlan = endVlan; + } + public java.lang.Integer getEndVlan() { + return this.endVlan; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SdnVniRange.java b/sdk/src/main/java/org/zstack/sdk/SdnVniRange.java deleted file mode 100644 index 1250af40c82..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/SdnVniRange.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.zstack.sdk; - - - -public class SdnVniRange { - - public java.lang.Integer startVni; - public void setStartVni(java.lang.Integer startVni) { - this.startVni = startVni; - } - public java.lang.Integer getStartVni() { - return this.startVni; - } - - public java.lang.Integer endVni; - public void setEndVni(java.lang.Integer endVni) { - this.endVni = endVni; - } - public java.lang.Integer getEndVni() { - return this.endVni; - } - -} diff --git a/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java index a432ba3b723..df994d41f2b 100644 --- a/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/SecurityGroupInventory.java @@ -44,6 +44,14 @@ public java.lang.Integer getIpVersion() { return this.ipVersion; } + public java.lang.String vSwitchType; + public void setVSwitchType(java.lang.String vSwitchType) { + this.vSwitchType = vSwitchType; + } + public java.lang.String getVSwitchType() { + return this.vSwitchType; + } + public java.sql.Timestamp createDate; public void setCreateDate(java.sql.Timestamp createDate) { this.createDate = createDate; @@ -60,6 +68,14 @@ public java.sql.Timestamp getLastOpDate() { return this.lastOpDate; } + public long internalId; + public void setInternalId(long internalId) { + this.internalId = internalId; + } + public long getInternalId() { + return this.internalId; + } + public java.util.List rules; public void setRules(java.util.List rules) { this.rules = rules; diff --git a/sdk/src/main/java/org/zstack/sdk/ServiceStatus.java b/sdk/src/main/java/org/zstack/sdk/ServiceStatus.java new file mode 100644 index 00000000000..2ff9653cdc1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ServiceStatus.java @@ -0,0 +1,23 @@ +package org.zstack.sdk; + + + +public class ServiceStatus { + + 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 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/SetNicQosAction.java b/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java index 77ecab1cf52..bf839d354f1 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetNicQosAction.java @@ -28,10 +28,10 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String uuid; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8192L,32212254720L}, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8000L,30000000000L}, noTrim = false) public java.lang.Long outboundBandwidth; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8192L,32212254720L}, noTrim = false) + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {8000L,30000000000L}, noTrim = false) public java.lang.Long inboundBandwidth; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java index ce3ecf30074..10006e8719d 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkBondingAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List vlanIds; - @Param(required = false, validValues = {"ManagementNetwork","TenantNetwork","StorageNetwork","BackupNetwork","MigrationNetwork"}, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List serviceTypes; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java index 9410d86643f..1866d621f36 100644 --- a/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/SetServiceTypeOnHostNetworkInterfaceAction.java @@ -31,7 +31,7 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List vlanIds; - @Param(required = false, validValues = {"ManagementNetwork","TenantNetwork","StorageNetwork","BackupNetwork","MigrationNetwork"}, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, maxLength = 128, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List serviceTypes; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java new file mode 100644 index 00000000000..5ca300579e1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SsoClientPushDataAction 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.SsoClientPushDataResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dataType; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serverUrl; + + @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.SsoClientPushDataResult value = res.getResult(org.zstack.sdk.SsoClientPushDataResult.class); + ret.value = value == null ? new org.zstack.sdk.SsoClientPushDataResult() : 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 = "/sso/resource/data/push"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "ssoClientPushData"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java new file mode 100644 index 00000000000..7a0b770ef56 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SsoClientPushDataResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class SsoClientPushDataResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/StorageType.java b/sdk/src/main/java/org/zstack/sdk/StorageType.java new file mode 100644 index 00000000000..c199b8c5d4b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/StorageType.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum StorageType { + S3, + NFS, +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java new file mode 100644 index 00000000000..d14229a47a5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncAINginxConfigurationAction 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.SyncAINginxConfigurationResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List groupUuids; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean dryRun; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean syncAll = false; + + @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.SyncAINginxConfigurationResult value = res.getResult(org.zstack.sdk.SyncAINginxConfigurationResult.class); + ret.value = value == null ? new org.zstack.sdk.SyncAINginxConfigurationResult() : 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/nginx/sync"; + info.needSession = true; + info.needPoll = false; + info.parameterName = "param"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java new file mode 100644 index 00000000000..3257b6fa952 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncAINginxConfigurationResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class SyncAINginxConfigurationResult { + public java.util.List unSyncedRules; + public void setUnSyncedRules(java.util.List unSyncedRules) { + this.unSyncedRules = unSyncedRules; + } + public java.util.List getUnSyncedRules() { + return this.unSyncedRules; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java new file mode 100644 index 00000000000..abb9dace419 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncContainerManagementEndpointAction 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.SyncContainerManagementEndpointResult 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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String zoneUuid; + + @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.SyncContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.SyncContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.SyncContainerManagementEndpointResult() : 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 = "/container/management/endpoint/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "syncContainerManagementEndpoint"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java new file mode 100644 index 00000000000..f1e0139d01a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncContainerManagementEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementEndpointInventory; + +public class SyncContainerManagementEndpointResult { + public ContainerManagementEndpointInventory inventory; + public void setInventory(ContainerManagementEndpointInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java b/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java new file mode 100644 index 00000000000..ccd4034f3b5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/TrainedModelRecordInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class TrainedModelRecordInventory { + + 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 modelUuid; + public void setModelUuid(java.lang.String modelUuid) { + this.modelUuid = modelUuid; + } + public java.lang.String getModelUuid() { + return this.modelUuid; + } + + public java.lang.String sourceModelUuid; + public void setSourceModelUuid(java.lang.String sourceModelUuid) { + this.sourceModelUuid = sourceModelUuid; + } + public java.lang.String getSourceModelUuid() { + return this.sourceModelUuid; + } + + public java.lang.String modelServiceInstanceGroupUuid; + public void setModelServiceInstanceGroupUuid(java.lang.String modelServiceInstanceGroupUuid) { + this.modelServiceInstanceGroupUuid = modelServiceInstanceGroupUuid; + } + public java.lang.String getModelServiceInstanceGroupUuid() { + return this.modelServiceInstanceGroupUuid; + } + + public java.lang.String datasetUuid; + public void setDatasetUuid(java.lang.String datasetUuid) { + this.datasetUuid = datasetUuid; + } + public java.lang.String getDatasetUuid() { + return this.datasetUuid; + } + + 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/UnbindModelFromServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java new file mode 100644 index 00000000000..45c136ae210 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnbindModelFromServiceAction 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.UnbindModelFromServiceResult 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 modelUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelServiceUuid; + + @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.UnbindModelFromServiceResult value = res.getResult(org.zstack.sdk.UnbindModelFromServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.UnbindModelFromServiceResult() : 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 = "/ai/models/{modelUuid}/model-services/{modelServiceUuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java new file mode 100644 index 00000000000..2be1c139186 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnbindModelFromServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class UnbindModelFromServiceResult { + 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/UnexportNbdVolumesAction.java b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java new file mode 100644 index 00000000000..d73e1c0dbc9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnexportNbdVolumesAction 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.UnexportNbdVolumesResult 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.util.List volumeUuids; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vmInstanceUuid; + + @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.UnexportNbdVolumesResult value = res.getResult(org.zstack.sdk.UnexportNbdVolumesResult.class); + ret.value = value == null ? new org.zstack.sdk.UnexportNbdVolumesResult() : 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 = "/cbt-task/unexportvolume"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java new file mode 100644 index 00000000000..ba206af82c2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UnexportNbdVolumesResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class UnexportNbdVolumesResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java new file mode 100644 index 00000000000..3c930a245ac --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateAccessControlListAction 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.UpdateAccessControlListResult 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 = false, 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.UpdateAccessControlListResult value = res.getResult(org.zstack.sdk.UpdateAccessControlListResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateAccessControlListResult() : 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 = "/access-control-lists/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateAccessControlList"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java new file mode 100644 index 00000000000..01e68b9a7bb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccessControlListResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.AccessControlListInventory; + +public class UpdateAccessControlListResult { + public AccessControlListInventory inventory; + public void setInventory(AccessControlListInventory inventory) { + this.inventory = inventory; + } + public AccessControlListInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java index ff9178a1d6e..3d593e20b84 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateAccountAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateAccount"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java index 4e34b0ea324..da6a400c4b6 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateConsoleProxyAgentAction.java @@ -31,8 +31,8 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String consoleProxyOverriddenIp; - @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) - public int consoleProxyPort = 0; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {1L,65535L}, noTrim = false) + public java.lang.Integer consoleProxyPort; @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java new file mode 100644 index 00000000000..d2675c1a78f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateContainerManagementEndpointAction 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.UpdateContainerManagementEndpointResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vendor; + + @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.UpdateContainerManagementEndpointResult value = res.getResult(org.zstack.sdk.UpdateContainerManagementEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateContainerManagementEndpointResult() : 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 = "/container/management/endpoint/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateContainerManagementEndpoint"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java new file mode 100644 index 00000000000..3218418600a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateContainerManagementEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ContainerManagementEndpointInventory; + +public class UpdateContainerManagementEndpointResult { + public ContainerManagementEndpointInventory inventory; + public void setInventory(ContainerManagementEndpointInventory inventory) { + this.inventory = inventory; + } + public ContainerManagementEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java new file mode 100644 index 00000000000..5a2b0988f43 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateDatasetAction 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.UpdateDatasetResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, validValues = {"FineTune","Endpoint","App","ModelEval","ModelPerf"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List usageScenarios; + + @Param(required = false, validValues = {"Text","Audio","Image","Video","Tabular","Geospatial","TimeSeries"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String dataType; + + @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.UpdateDatasetResult value = res.getResult(org.zstack.sdk.UpdateDatasetResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateDatasetResult() : 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 = "/ai/datasets/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateDataset"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java new file mode 100644 index 00000000000..7c63bcfb858 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.DatasetInventory; + +public class UpdateDatasetResult { + public DatasetInventory inventory; + public void setInventory(DatasetInventory inventory) { + this.inventory = inventory; + } + public DatasetInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java new file mode 100644 index 00000000000..7cae036b324 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateDatasetsAction 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.UpdateDatasetsResult 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.util.List updateDatasetStructs; + + @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.UpdateDatasetsResult value = res.getResult(org.zstack.sdk.UpdateDatasetsResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateDatasetsResult() : 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 = "/ai/datasets"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateDatasets"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java new file mode 100644 index 00000000000..9e9ac659d9f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDatasetsResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class UpdateDatasetsResult { + public java.util.List results; + public void setResults(java.util.List results) { + this.results = results; + } + public java.util.List getResults() { + return this.results; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java index 2862daab4c7..ad9a2c9e625 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateGuestVmScriptAction.java @@ -34,6 +34,9 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 256, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String description; + @Param(required = false, validValues = {"Base64","PlainText"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encodingType; + @Param(required = false, maxLength = 65536, minLength = 1, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String scriptContent; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java new file mode 100644 index 00000000000..7842f4d353f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateHostNetworkServiceTypeAction 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.UpdateHostNetworkServiceTypeResult 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 = true, maxLength = 128, nonempty = true, nullElements = false, emptyString = true, noTrim = true) + public java.lang.String serviceType; + + @Param(required = false, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public boolean system = false; + + @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.UpdateHostNetworkServiceTypeResult value = res.getResult(org.zstack.sdk.UpdateHostNetworkServiceTypeResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateHostNetworkServiceTypeResult() : 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 = "/hosts/service-types/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateHostNetworkServiceType"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java new file mode 100644 index 00000000000..3dcaf4ee0f8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateHostNetworkServiceTypeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.HostNetworkLabelInventory; + +public class UpdateHostNetworkServiceTypeResult { + public HostNetworkLabelInventory inventory; + public void setInventory(HostNetworkLabelInventory inventory) { + this.inventory = inventory; + } + public HostNetworkLabelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java new file mode 100644 index 00000000000..e7f36e3ea42 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateKoAlSecretResourcePoolAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateKoAlSecretResourcePoolAction 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.UpdateSecretResourcePoolResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer port; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String secretKey; + + @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, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @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.UpdateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.UpdateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSecretResourcePoolResult() : 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 = "/secret-resource-pools/koal/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateKoAlSecretResourcePool"; + return info; + } + +} 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; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java new file mode 100644 index 00000000000..1d440e5787b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelAction.java @@ -0,0 +1,125 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelAction 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.UpdateModelResult 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 = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String modelCenterUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List modelClassifications; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String recommendedGpuNum; + + @Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuConstraintDescription; + + @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.UpdateModelResult value = res.getResult(org.zstack.sdk.UpdateModelResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelResult() : 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 = "/ai/models/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModel"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java new file mode 100644 index 00000000000..9bc5590ef92 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterAction.java @@ -0,0 +1,134 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelCenterAction 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.UpdateModelCenterResult 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 = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String parameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String managementIp; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer managementPort; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String storageNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceNetworkUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerRegistry; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerNetwork; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerStorageNetwork; + + @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.UpdateModelCenterResult value = res.getResult(org.zstack.sdk.UpdateModelCenterResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelCenterResult() : 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 = "/ai/model-centers/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelCenter"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java new file mode 100644 index 00000000000..e640183f83f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelCenterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelCenterInventory; + +public class UpdateModelCenterResult { + public ModelCenterInventory inventory; + public void setInventory(ModelCenterInventory inventory) { + this.inventory = inventory; + } + public ModelCenterInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java new file mode 100644 index 00000000000..98f1015d91a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelEvaluationTaskAction 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.UpdateModelEvaluationTaskResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, 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.UpdateModelEvaluationTaskResult value = res.getResult(org.zstack.sdk.UpdateModelEvaluationTaskResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelEvaluationTaskResult() : 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 = "/model-evaluation-tasks/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelEvaluationTask"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java new file mode 100644 index 00000000000..e8e5ab53513 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelEvaluationTaskResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelEvaluationTaskInventory; + +public class UpdateModelEvaluationTaskResult { + public ModelEvaluationTaskInventory inventory; + public void setInventory(ModelEvaluationTaskInventory inventory) { + this.inventory = inventory; + } + public ModelEvaluationTaskInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java new file mode 100644 index 00000000000..92299721529 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelInventory; + +public class UpdateModelResult { + public ModelInventory inventory; + public void setInventory(ModelInventory inventory) { + this.inventory = inventory; + } + public ModelInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java new file mode 100644 index 00000000000..131e4e3b9f4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceAction.java @@ -0,0 +1,179 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelServiceAction 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.UpdateModelServiceResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String yaml; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer requestCpu; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long requestMemory; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String gpuComputeCapability; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String startCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerArgs; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pythonVersion; + + @Param(required = false, validValues = {"Endpoint","FineTune","App","ModelEval"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, validValues = {"Other","Bentoml","HuggingFace"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String source; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String framework; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List architectureImages; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean supportDistributed; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.HashMap environmentParameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.HashMap startupParameters; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.HashMap inferenceParams; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceName; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List servicePorts; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootupTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceInstallPath; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceStartCommand; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map vendorToSpecUuidsMap; + + @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.UpdateModelServiceResult value = res.getResult(org.zstack.sdk.UpdateModelServiceResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelServiceResult() : 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 = "/ai/model-services/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelService"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java new file mode 100644 index 00000000000..18e3b183092 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateModelServiceInstanceGroupAction 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.UpdateModelServiceInstanceGroupResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map environmentVariables; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map startupParameters; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceLivez; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String serviceReadyz; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer serviceBootupTime; + + @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.UpdateModelServiceInstanceGroupResult value = res.getResult(org.zstack.sdk.UpdateModelServiceInstanceGroupResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateModelServiceInstanceGroupResult() : 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 = "/model-service-instance-groups/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateModelServiceInstanceGroup"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java new file mode 100644 index 00000000000..b7a9c6b6d40 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceInstanceGroupResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInstanceGroupInventory; + +public class UpdateModelServiceInstanceGroupResult { + public ModelServiceInstanceGroupInventory inventory; + public void setInventory(ModelServiceInstanceGroupInventory inventory) { + this.inventory = inventory; + } + public ModelServiceInstanceGroupInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java new file mode 100644 index 00000000000..a4b24fd8a78 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateModelServiceResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ModelServiceInventory; + +public class UpdateModelServiceResult { + 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/UpdateOAuthClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java index 59118ab3877..a17f2fe1d00 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateOAuthClientAction.java @@ -55,6 +55,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String identityProvider; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String pluginUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String loginType; diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java new file mode 100644 index 00000000000..f90210e0adc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePluginSecretResourcePoolAction.java @@ -0,0 +1,116 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdatePluginSecretResourcePoolAction 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.UpdateSecretResourcePoolResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map properties; + + @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, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String model; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {6L,180L}, noTrim = false) + public java.lang.Integer heartbeatInterval; + + @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.UpdateSecretResourcePoolResult value = res.getResult(org.zstack.sdk.UpdateSecretResourcePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSecretResourcePoolResult() : 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 = "/secret-resource-pool/plugin/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updatePluginSecretResourcePool"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java index 1326b0b0c6f..1fd613de5d2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdatePreconfigurationTemplateAction.java @@ -37,7 +37,7 @@ public Result throwExceptionIfError() { @Param(required = false, maxLength = 64, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String distribution; - @Param(required = false, validValues = {"kickstart","preseed","autoyast"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = false, validValues = {"kickstart","preseed","autoyast","autoinstall"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = false, maxLength = 16777215, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java index 7fcfd53713c..12f2b6efe12 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateQuotaAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateQuota"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java index 2e4e9c3e678..70cb42ca5a2 100644 --- a/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java +++ b/sdk/src/main/java/org/zstack/sdk/UpdateResourceConfigAction.java @@ -104,6 +104,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateResourceConfig"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java new file mode 100644 index 00000000000..73bb94a429d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateSAML2ClientAction 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.UpdateSAML2ClientResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String idpMetadataBase64; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String redirectUrl; + + @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.UpdateSAML2ClientResult value = res.getResult(org.zstack.sdk.UpdateSAML2ClientResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSAML2ClientResult() : 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 = "/update/saml2/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java new file mode 100644 index 00000000000..e150748bdaf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSAML2ClientResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SAML2ClientInventory; + +public class UpdateSAML2ClientResult { + public SAML2ClientInventory inventory; + public void setInventory(SAML2ClientInventory inventory) { + this.inventory = inventory; + } + public SAML2ClientInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java new file mode 100644 index 00000000000..c59c63aeea8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateSSOClientAttributeAction 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.UpdateSSOClientAttributeResult 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 = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String value; + + @Param(required = false, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String purpose; + + @Param(required = false, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @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.UpdateSSOClientAttributeResult value = res.getResult(org.zstack.sdk.UpdateSSOClientAttributeResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateSSOClientAttributeResult() : 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 = "/sso/client/attributes/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateSSOClientAttribute"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java new file mode 100644 index 00000000000..d831e04073c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateSSOClientAttributeResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.SSOClientAttributeInventory; + +public class UpdateSSOClientAttributeResult { + public SSOClientAttributeInventory inventory; + public void setInventory(SSOClientAttributeInventory inventory) { + this.inventory = inventory; + } + public SSOClientAttributeInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java new file mode 100644 index 00000000000..a5fda8afd1a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigAction.java @@ -0,0 +1,128 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateUserProxyConfigAction 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.UpdateUserProxyConfigResult 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 proxyType; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyHost; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Integer proxyPort; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyUsername; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyPassword; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean isEnabled; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String proxyProtocolVersion; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean useSsl; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String noProxy; + + @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.UpdateUserProxyConfigResult value = res.getResult(org.zstack.sdk.UpdateUserProxyConfigResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateUserProxyConfigResult() : 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 = "/user-proxy-configs/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateUserProxyConfig"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java new file mode 100644 index 00000000000..4141aad8449 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateUserProxyConfigResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.UserProxyConfigInventory; + +public class UpdateUserProxyConfigResult { + public UserProxyConfigInventory inventory; + public void setInventory(UserProxyConfigInventory inventory) { + this.inventory = inventory; + } + public UserProxyConfigInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java new file mode 100644 index 00000000000..91515dd171e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigInventory.java @@ -0,0 +1,103 @@ +package org.zstack.sdk; + + + +public class UserProxyConfigInventory { + + 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 proxyType; + public void setProxyType(java.lang.String proxyType) { + this.proxyType = proxyType; + } + public java.lang.String getProxyType() { + return this.proxyType; + } + + public java.lang.String proxyHost; + public void setProxyHost(java.lang.String proxyHost) { + this.proxyHost = proxyHost; + } + public java.lang.String getProxyHost() { + return this.proxyHost; + } + + public java.lang.Integer proxyPort; + public void setProxyPort(java.lang.Integer proxyPort) { + this.proxyPort = proxyPort; + } + public java.lang.Integer getProxyPort() { + return this.proxyPort; + } + + public java.lang.String proxyUsername; + public void setProxyUsername(java.lang.String proxyUsername) { + this.proxyUsername = proxyUsername; + } + public java.lang.String getProxyUsername() { + return this.proxyUsername; + } + + public java.lang.String proxyPassword; + public void setProxyPassword(java.lang.String proxyPassword) { + this.proxyPassword = proxyPassword; + } + public java.lang.String getProxyPassword() { + return this.proxyPassword; + } + + public java.lang.Boolean isEnabled; + public void setIsEnabled(java.lang.Boolean isEnabled) { + this.isEnabled = isEnabled; + } + public java.lang.Boolean getIsEnabled() { + return this.isEnabled; + } + + public java.lang.String proxyProtocolVersion; + public void setProxyProtocolVersion(java.lang.String proxyProtocolVersion) { + this.proxyProtocolVersion = proxyProtocolVersion; + } + public java.lang.String getProxyProtocolVersion() { + return this.proxyProtocolVersion; + } + + public java.lang.Boolean useSsl; + public void setUseSsl(java.lang.Boolean useSsl) { + this.useSsl = useSsl; + } + public java.lang.Boolean getUseSsl() { + return this.useSsl; + } + + public java.lang.String noProxy; + public void setNoProxy(java.lang.String noProxy) { + this.noProxy = noProxy; + } + public java.lang.String getNoProxy() { + return this.noProxy; + } + + 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/UserProxyConfigResourceRefInventory.java b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigResourceRefInventory.java new file mode 100644 index 00000000000..a6e548fc9f2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UserProxyConfigResourceRefInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class UserProxyConfigResourceRefInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public java.lang.String proxyUuid; + public void setProxyUuid(java.lang.String proxyUuid) { + this.proxyUuid = proxyUuid; + } + public java.lang.String getProxyUuid() { + return this.proxyUuid; + } + + 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/VHostAddOn.java b/sdk/src/main/java/org/zstack/sdk/VHostAddOn.java new file mode 100644 index 00000000000..b4af44bcb32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VHostAddOn.java @@ -0,0 +1,31 @@ +package org.zstack.sdk; + + + +public class VHostAddOn { + + public int queueNum; + public void setQueueNum(int queueNum) { + this.queueNum = queueNum; + } + public int getQueueNum() { + return this.queueNum; + } + + public java.lang.String rxBufferSize; + public void setRxBufferSize(java.lang.String rxBufferSize) { + this.rxBufferSize = rxBufferSize; + } + public java.lang.String getRxBufferSize() { + return this.rxBufferSize; + } + + public java.lang.String txBufferSize; + public void setTxBufferSize(java.lang.String txBufferSize) { + this.txBufferSize = txBufferSize; + } + public java.lang.String getTxBufferSize() { + return this.txBufferSize; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java b/sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java new file mode 100644 index 00000000000..7d34acd4502 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VolumeCbtBackupInfo.java @@ -0,0 +1,79 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VolumeTO; + +public class VolumeCbtBackupInfo { + + public VolumeTO volume; + public void setVolume(VolumeTO volume) { + this.volume = volume; + } + public VolumeTO getVolume() { + return this.volume; + } + + public java.lang.String bitmapBase64; + public void setBitmapBase64(java.lang.String bitmapBase64) { + this.bitmapBase64 = bitmapBase64; + } + public java.lang.String getBitmapBase64() { + return this.bitmapBase64; + } + + public java.lang.String target; + public void setTarget(java.lang.String target) { + this.target = target; + } + public java.lang.String getTarget() { + return this.target; + } + + public java.lang.String scratchNodeName; + public void setScratchNodeName(java.lang.String scratchNodeName) { + this.scratchNodeName = scratchNodeName; + } + public java.lang.String getScratchNodeName() { + return this.scratchNodeName; + } + + public java.lang.String metadata; + public void setMetadata(java.lang.String metadata) { + this.metadata = metadata; + } + public java.lang.String getMetadata() { + return this.metadata; + } + + public java.lang.String nbdPort; + public void setNbdPort(java.lang.String nbdPort) { + this.nbdPort = nbdPort; + } + public java.lang.String getNbdPort() { + return this.nbdPort; + } + + public java.lang.String nbdServer; + public void setNbdServer(java.lang.String nbdServer) { + this.nbdServer = nbdServer; + } + public java.lang.String getNbdServer() { + return this.nbdServer; + } + + public java.lang.String mode; + public void setMode(java.lang.String mode) { + this.mode = mode; + } + public java.lang.String getMode() { + return this.mode; + } + + public java.lang.String bitmapName; + public void setBitmapName(java.lang.String bitmapName) { + this.bitmapName = bitmapName; + } + public java.lang.String getBitmapName() { + return this.bitmapName; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeTO.java b/sdk/src/main/java/org/zstack/sdk/VolumeTO.java new file mode 100644 index 00000000000..84eb1d8518f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VolumeTO.java @@ -0,0 +1,159 @@ +package org.zstack.sdk; + + + +public class VolumeTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public int deviceId; + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + public int getDeviceId() { + return this.deviceId; + } + + public java.lang.String deviceType; + public void setDeviceType(java.lang.String deviceType) { + this.deviceType = deviceType; + } + public java.lang.String getDeviceType() { + return this.deviceType; + } + + public java.lang.String volumeUuid; + public void setVolumeUuid(java.lang.String volumeUuid) { + this.volumeUuid = volumeUuid; + } + public java.lang.String getVolumeUuid() { + return this.volumeUuid; + } + + public boolean useVirtio; + public void setUseVirtio(boolean useVirtio) { + this.useVirtio = useVirtio; + } + public boolean getUseVirtio() { + return this.useVirtio; + } + + public boolean useVirtioSCSI; + public void setUseVirtioSCSI(boolean useVirtioSCSI) { + this.useVirtioSCSI = useVirtioSCSI; + } + public boolean getUseVirtioSCSI() { + return this.useVirtioSCSI; + } + + public boolean shareable; + public void setShareable(boolean shareable) { + this.shareable = shareable; + } + public boolean getShareable() { + return this.shareable; + } + + public java.lang.String cacheMode; + public void setCacheMode(java.lang.String cacheMode) { + this.cacheMode = cacheMode; + } + public java.lang.String getCacheMode() { + return this.cacheMode; + } + + public boolean aioNative; + public void setAioNative(boolean aioNative) { + this.aioNative = aioNative; + } + public boolean getAioNative() { + return this.aioNative; + } + + public java.lang.String wwn; + public void setWwn(java.lang.String wwn) { + this.wwn = wwn; + } + public java.lang.String getWwn() { + return this.wwn; + } + + public int bootOrder; + public void setBootOrder(int bootOrder) { + this.bootOrder = bootOrder; + } + public int getBootOrder() { + return this.bootOrder; + } + + public int physicalBlockSize; + public void setPhysicalBlockSize(int physicalBlockSize) { + this.physicalBlockSize = physicalBlockSize; + } + public int getPhysicalBlockSize() { + return this.physicalBlockSize; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String format; + public void setFormat(java.lang.String format) { + this.format = format; + } + public java.lang.String getFormat() { + return this.format; + } + + public java.lang.String primaryStorageType; + public void setPrimaryStorageType(java.lang.String primaryStorageType) { + this.primaryStorageType = primaryStorageType; + } + public java.lang.String getPrimaryStorageType() { + return this.primaryStorageType; + } + + public java.lang.String multiQueues; + public void setMultiQueues(java.lang.String multiQueues) { + this.multiQueues = multiQueues; + } + public java.lang.String getMultiQueues() { + return this.multiQueues; + } + + public int ioThreadId; + public void setIoThreadId(int ioThreadId) { + this.ioThreadId = ioThreadId; + } + public int getIoThreadId() { + return this.ioThreadId; + } + + public java.lang.String ioThreadPin; + public void setIoThreadPin(java.lang.String ioThreadPin) { + this.ioThreadPin = ioThreadPin; + } + public java.lang.String getIoThreadPin() { + return this.ioThreadPin; + } + + public int controllerIndex; + public void setControllerIndex(int controllerIndex) { + this.controllerIndex = controllerIndex; + } + public int getControllerIndex() { + return this.controllerIndex; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZSClient.java b/sdk/src/main/java/org/zstack/sdk/ZSClient.java index d62e2fcbd64..882284e45c6 100755 --- a/sdk/src/main/java/org/zstack/sdk/ZSClient.java +++ b/sdk/src/main/java/org/zstack/sdk/ZSClient.java @@ -9,6 +9,7 @@ import com.google.gson.JsonParseException; import okhttp3.*; import org.apache.commons.codec.binary.Base64; +import org.springframework.lang.NonNull; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; @@ -128,19 +129,18 @@ public static ZSConfig getConfig() { public static void configure(ZSConfig c) { config = c; + http = buildHttpClient(c); + } - if (c.readTimeout != null || c.writeTimeout != null) { - OkHttpClient.Builder b = new OkHttpClient.Builder(); - - if (c.readTimeout != null) { - b.readTimeout(c.readTimeout, TimeUnit.MILLISECONDS); - } - if (c.writeTimeout != null) { - b.writeTimeout(c.writeTimeout, TimeUnit.MILLISECONDS); - } - - http = b.build(); + private static OkHttpClient buildHttpClient(ZSConfig c) { + OkHttpClient.Builder b = new OkHttpClient.Builder(); + if (c.readTimeout != null) { + b.readTimeout(c.readTimeout, TimeUnit.MILLISECONDS); } + if (c.writeTimeout != null) { + b.writeTimeout(c.writeTimeout, TimeUnit.MILLISECONDS); + } + return b.build(); } public static void webHookCallback(HttpServletRequest req, HttpServletResponse rsp) { @@ -213,15 +213,28 @@ static class Api { RestInfo info; InternalCompletion completion; String jobUuid = UUID.randomUUID().toString().replaceAll("-", ""); + ZSConfig config; + OkHttpClient http; private ApiResult resultFromWebHook; Api(AbstractAction action) { + this(action, ZSClient.config); + } + + Api(AbstractAction action, ZSConfig config) { this.action = action; info = action.getRestInfo(); if (action.apiId != null) { jobUuid = action.apiId; } + + this.config = config != null ? config : ZSClient.config; + if (this.config == ZSClient.config) { + this.http = ZSClient.http; + } else { + this.http = buildHttpClient(this.config); + } } void wakeUpFromWebHook(ApiResult res) { @@ -317,9 +330,9 @@ ApiResult doCall() { } if (response.code() == 200 || response.code() == 204) { + waittingApis.remove(jobUuid); return writeApiResult(response); } else if (response.code() == 202) { - if (config.webHook != null) { return webHookResult(); } else { @@ -370,8 +383,15 @@ private ApiResult webHookResult() { private void calculateAccessKeySignature(Request.Builder reqBuilder, String accessKeyId, String accessKeySecret, String path) throws Exception { ZonedDateTime date = ZonedDateTime.now(); - String dateStr = date.format(formatter); + DateTimeFormatter fmt = formatter; + if (getConfig() != null && getConfig().accessKeyDateStr != null) { + fmt = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .appendPattern(getConfig().accessKeyDateStr) + .toFormatter(Locale.ENGLISH); + } + String dateStr = date.format(fmt); StringBuilder sb = new StringBuilder(); sb.append(info.httpMethod).append("\n"); sb.append(dateStr).append("\n").append("/v1").append(path); @@ -578,7 +598,7 @@ private ApiResult pollResult(Response response) throws IOException { String configHost = String.format("%s:%s", config.getHostname(), config.getPort()); if (!pollingUrl.contains(configHost)) { - String splitRegex = "/zstack/v1/api-jobs"; + String splitRegex = Boolean.parseBoolean(System.getProperty("unitTestOn")) ? "/v1/api-jobs" : "/zstack/v1/api-jobs"; pollingUrl = String.format("http://%s%s%s", configHost, splitRegex ,pollingUrl.split(splitRegex)[1]); } @@ -599,6 +619,9 @@ private void asyncPollResult(final String url) { final long i = this.getInterval(); final Object sessionId = action.getParameterValue(Constants.SESSION_ID); + final Object accessKeyId = action.getParameterValue(Constants.ACCESS_KEY_KEYID); + final Object accessKeySecret = action.getParameterValue(Constants.ACCESS_KEY_KEY_SECRET); + final Object requestIp = action.getParameterValue(Constants.REQUEST_IP); final Timer timer = new Timer(); @@ -782,6 +805,14 @@ public static void call(AbstractAction action, InternalCompletion completion) { new Api(action).call(completion); } + public static void callWithConfig(AbstractAction action, @NonNull ZSConfig config, InternalCompletion completion) { + new Api(action, config).call(completion); + } + + public static ApiResult callWithConfig(AbstractAction action, @NonNull ZSConfig config) { + return new Api(action, config).call(); + } + public static ApiResult call(AbstractAction action) { errorIfNotConfigured(); return new Api(action).call(); diff --git a/sdk/src/main/java/org/zstack/sdk/ZSConfig.java b/sdk/src/main/java/org/zstack/sdk/ZSConfig.java index 657639bc933..fb154a092aa 100755 --- a/sdk/src/main/java/org/zstack/sdk/ZSConfig.java +++ b/sdk/src/main/java/org/zstack/sdk/ZSConfig.java @@ -14,6 +14,7 @@ public class ZSConfig { Long readTimeout; Long writeTimeout; String contextPath; + String accessKeyDateStr; public String getHostname() { return hostname; @@ -74,6 +75,10 @@ public Builder setContextPath(String name) { return this; } + public Builder setAccessKeyDateStr(String name) { + config.accessKeyDateStr = name; + return this; + } public ZSConfig build() { return config; diff --git a/sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java b/sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java new file mode 100644 index 00000000000..ddb0a381e7a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZakuImageInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ZakuImageInventory { + + 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.Integer tagCount; + public void setTagCount(java.lang.Integer tagCount) { + this.tagCount = tagCount; + } + public java.lang.Integer getTagCount() { + return this.tagCount; + } + + public java.lang.Integer pullCount; + public void setPullCount(java.lang.Integer pullCount) { + this.pullCount = pullCount; + } + public java.lang.Integer getPullCount() { + return this.pullCount; + } + + public java.lang.String createTime; + public void setCreateTime(java.lang.String createTime) { + this.createTime = createTime; + } + public java.lang.String getCreateTime() { + return this.createTime; + } + + public java.lang.String updateTime; + public void setUpdateTime(java.lang.String updateTime) { + this.updateTime = updateTime; + } + public java.lang.String getUpdateTime() { + return this.updateTime; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java b/sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java new file mode 100644 index 00000000000..4697da9943f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsInventory.java @@ -0,0 +1,95 @@ +package org.zstack.sdk; + +import org.zstack.sdk.ZdfsStorageInventory; + +public class ZdfsInventory { + + 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 java.lang.String zoneUuid; + public void setZoneUuid(java.lang.String zoneUuid) { + this.zoneUuid = zoneUuid; + } + public java.lang.String getZoneUuid() { + return this.zoneUuid; + } + + public java.lang.String url; + public void setUrl(java.lang.String url) { + this.url = url; + } + public java.lang.String getUrl() { + return this.url; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String hostName; + public void setHostName(java.lang.String hostName) { + this.hostName = hostName; + } + public java.lang.String getHostName() { + return this.hostName; + } + + public int sshPort; + public void setSshPort(int sshPort) { + this.sshPort = sshPort; + } + public int getSshPort() { + return this.sshPort; + } + + 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; + } + + public ZdfsStorageInventory storage; + public void setStorage(ZdfsStorageInventory storage) { + this.storage = storage; + } + public ZdfsStorageInventory getStorage() { + return this.storage; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsService.java b/sdk/src/main/java/org/zstack/sdk/ZdfsService.java new file mode 100644 index 00000000000..751e03b2637 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsService.java @@ -0,0 +1,47 @@ +package org.zstack.sdk; + + + +public class ZdfsService { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public int slaveCount; + public void setSlaveCount(int slaveCount) { + this.slaveCount = slaveCount; + } + public int getSlaveCount() { + return this.slaveCount; + } + + public int sentinelCount; + public void setSentinelCount(int sentinelCount) { + this.sentinelCount = sentinelCount; + } + public int getSentinelCount() { + return this.sentinelCount; + } + + public java.lang.String metaServerStatus; + public void setMetaServerStatus(java.lang.String metaServerStatus) { + this.metaServerStatus = metaServerStatus; + } + public java.lang.String getMetaServerStatus() { + return this.metaServerStatus; + } + + public java.util.List metaServers; + public void setMetaServers(java.util.List metaServers) { + this.metaServers = metaServers; + } + public java.util.List getMetaServers() { + return this.metaServers; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java b/sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java new file mode 100644 index 00000000000..349e3d51dc7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ZdfsStorageInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk; + +import org.zstack.sdk.StorageType; + +public class ZdfsStorageInventory { + + 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 endPoint; + public void setEndPoint(java.lang.String endPoint) { + this.endPoint = endPoint; + } + public java.lang.String getEndPoint() { + return this.endPoint; + } + + public java.lang.String accessKey; + public void setAccessKey(java.lang.String accessKey) { + this.accessKey = accessKey; + } + public java.lang.String getAccessKey() { + return this.accessKey; + } + + public java.lang.String secretKey; + public void setSecretKey(java.lang.String secretKey) { + this.secretKey = secretKey; + } + public java.lang.String getSecretKey() { + return this.secretKey; + } + + public StorageType type; + public void setType(StorageType type) { + this.type = type; + } + public StorageType getType() { + return this.type; + } + + public java.lang.Long usedCapacity; + public void setUsedCapacity(java.lang.Long usedCapacity) { + this.usedCapacity = usedCapacity; + } + public java.lang.Long getUsedCapacity() { + return this.usedCapacity; + } + + 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/huawei/imaster/CreateHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java new file mode 100644 index 00000000000..40808907cbe --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateHuaweiIMasterVRouterAction 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.huawei.imaster.CreateHuaweiIMasterVRouterResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String huaweiVpcUuid; + + @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.huawei.imaster.CreateHuaweiIMasterVRouterResult value = res.getResult(org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterResult() : 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 = "/sdn-controller/huawei-imaster/vrouters"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java new file mode 100644 index 00000000000..e7f94c38b51 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/CreateHuaweiIMasterVRouterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.huawei.imaster; + +import org.zstack.sdk.huawei.imaster.HuaweiIMasterVRouterInventory; + +public class CreateHuaweiIMasterVRouterResult { + public HuaweiIMasterVRouterInventory inventory; + public void setInventory(HuaweiIMasterVRouterInventory inventory) { + this.inventory = inventory; + } + public HuaweiIMasterVRouterInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java new file mode 100644 index 00000000000..dac79b20065 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterFabricAction 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.huawei.imaster.DeleteHuaweiIMasterFabricResult 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.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.huawei.imaster.DeleteHuaweiIMasterFabricResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricResult() : 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 = "/sdn-controller/huawei-imaster/fabrics/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java new file mode 100644 index 00000000000..b77013b2eb0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterFabricResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterFabricResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java new file mode 100644 index 00000000000..8f42501e563 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterTenantAction 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.huawei.imaster.DeleteHuaweiIMasterTenantResult 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.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.huawei.imaster.DeleteHuaweiIMasterTenantResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantResult() : 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 = "/sdn-controller/huawei-imaster/tenants/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java new file mode 100644 index 00000000000..b08da0dd4df --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterTenantResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterTenantResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java new file mode 100644 index 00000000000..b901c8c9526 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterVRouterAction 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.huawei.imaster.DeleteHuaweiIMasterVRouterResult 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.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.huawei.imaster.DeleteHuaweiIMasterVRouterResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterResult() : 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 = "/sdn-controller/huawei-imaster/vrouters/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java new file mode 100644 index 00000000000..901f06a2e25 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVRouterResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterVRouterResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java new file mode 100644 index 00000000000..e61f3a56f21 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteHuaweiIMasterVpcAction 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.huawei.imaster.DeleteHuaweiIMasterVpcResult 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.lang.String sdnControllerUuid; + + @Param(required = false) + public java.lang.String deleteMode = "Permissive"; + + @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.huawei.imaster.DeleteHuaweiIMasterVpcResult value = res.getResult(org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcResult() : 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 = "/sdn-controller/huawei-imaster/vpcs/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java new file mode 100644 index 00000000000..df23f002cfc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/DeleteHuaweiIMasterVpcResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class DeleteHuaweiIMasterVpcResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java new file mode 100644 index 00000000000..5fecd41b979 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterFabricInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterFabricInventory { + + 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 java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + 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/huawei/imaster/HuaweiIMasterSdnControllerInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterSdnControllerInventory.java new file mode 100644 index 00000000000..0bcbbdf4593 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterSdnControllerInventory.java @@ -0,0 +1,47 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterSdnControllerInventory extends org.zstack.sdk.SdnControllerInventory { + + public java.util.List fabrics; + public void setFabrics(java.util.List fabrics) { + this.fabrics = fabrics; + } + public java.util.List getFabrics() { + return this.fabrics; + } + + public java.util.List tenants; + public void setTenants(java.util.List tenants) { + this.tenants = tenants; + } + public java.util.List getTenants() { + return this.tenants; + } + + public java.util.List vpcs; + public void setVpcs(java.util.List vpcs) { + this.vpcs = vpcs; + } + public java.util.List getVpcs() { + return this.vpcs; + } + + public java.util.List vrouters; + public void setVrouters(java.util.List vrouters) { + this.vrouters = vrouters; + } + public java.util.List getVrouters() { + return this.vrouters; + } + + public java.util.List vlanRanges; + public void setVlanRanges(java.util.List vlanRanges) { + this.vlanRanges = vlanRanges; + } + public java.util.List getVlanRanges() { + return this.vlanRanges; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java new file mode 100644 index 00000000000..a3f1c964021 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterTenantInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterTenantInventory { + + 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 java.util.List fabricIds; + public void setFabricIds(java.util.List fabricIds) { + this.fabricIds = fabricIds; + } + public java.util.List getFabricIds() { + return this.fabricIds; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + 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/huawei/imaster/HuaweiIMasterVRouterInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVRouterInventory.java new file mode 100644 index 00000000000..7709bd4bfd0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVRouterInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterVRouterInventory { + + 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 java.lang.String logicalNetworkId; + public void setLogicalNetworkId(java.lang.String logicalNetworkId) { + this.logicalNetworkId = logicalNetworkId; + } + public java.lang.String getLogicalNetworkId() { + return this.logicalNetworkId; + } + + public java.lang.String tenantId; + public void setTenantId(java.lang.String tenantId) { + this.tenantId = tenantId; + } + public java.lang.String getTenantId() { + return this.tenantId; + } + + public java.lang.String fabricUuid; + public void setFabricUuid(java.lang.String fabricUuid) { + this.fabricUuid = fabricUuid; + } + public java.lang.String getFabricUuid() { + return this.fabricUuid; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + 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/huawei/imaster/HuaweiIMasterVpcInventory.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVpcInventory.java new file mode 100644 index 00000000000..df9e60d3ba4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/HuaweiIMasterVpcInventory.java @@ -0,0 +1,87 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class HuaweiIMasterVpcInventory { + + 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 java.lang.String tenantId; + public void setTenantId(java.lang.String tenantId) { + this.tenantId = tenantId; + } + public java.lang.String getTenantId() { + return this.tenantId; + } + + public java.lang.String fabricId; + public void setFabricId(java.lang.String fabricId) { + this.fabricId = fabricId; + } + public java.lang.String getFabricId() { + return this.fabricId; + } + + public java.lang.String sdnControllerUuid; + public void setSdnControllerUuid(java.lang.String sdnControllerUuid) { + this.sdnControllerUuid = sdnControllerUuid; + } + public java.lang.String getSdnControllerUuid() { + return this.sdnControllerUuid; + } + + public java.lang.String state; + public void setState(java.lang.String state) { + this.state = state; + } + public java.lang.String getState() { + return this.state; + } + + public java.lang.Boolean isVpcDeployed; + public void setIsVpcDeployed(java.lang.Boolean isVpcDeployed) { + this.isVpcDeployed = isVpcDeployed; + } + public java.lang.Boolean getIsVpcDeployed() { + return this.isVpcDeployed; + } + + 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/huawei/imaster/PullHuaweiIMasterControllerAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java new file mode 100644 index 00000000000..c8cab63f3fa --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class PullHuaweiIMasterControllerAction 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.huawei.imaster.PullHuaweiIMasterControllerResult 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, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean pullSwitch = true; + + @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.huawei.imaster.PullHuaweiIMasterControllerResult value = res.getResult(org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerResult() : 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 = "/sdn-controller/huawei-imaster/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "pullHuaweiIMasterController"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java new file mode 100644 index 00000000000..d7b2feff3a0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/PullHuaweiIMasterControllerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class PullHuaweiIMasterControllerResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java new file mode 100644 index 00000000000..52ab2e1b5cd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterFabricAction 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.huawei.imaster.QueryHuaweiIMasterFabricResult 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.huawei.imaster.QueryHuaweiIMasterFabricResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricResult() : 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 = "/sdn-controller/huawei-imaster/fabrics"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java new file mode 100644 index 00000000000..10a64737469 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterFabricResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterFabricResult { + 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/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java new file mode 100644 index 00000000000..ef20f29f9d9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterTenantAction 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.huawei.imaster.QueryHuaweiIMasterTenantResult 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.huawei.imaster.QueryHuaweiIMasterTenantResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantResult() : 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 = "/sdn-controller/huawei-imaster/tenants"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java new file mode 100644 index 00000000000..3a4b358929e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterTenantResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterTenantResult { + 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/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java new file mode 100644 index 00000000000..1ea349fce1a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterVRouterAction 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.huawei.imaster.QueryHuaweiIMasterVRouterResult 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.huawei.imaster.QueryHuaweiIMasterVRouterResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterResult() : 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 = "/sdn-controller/huawei-imaster/vrouters"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java new file mode 100644 index 00000000000..a75d7d71d9e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVRouterResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterVRouterResult { + 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/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java new file mode 100644 index 00000000000..877f4bd0feb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.huawei.imaster; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryHuaweiIMasterVpcAction 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.huawei.imaster.QueryHuaweiIMasterVpcResult 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.huawei.imaster.QueryHuaweiIMasterVpcResult value = res.getResult(org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcResult.class); + ret.value = value == null ? new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcResult() : 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 = "/sdn-controller/huawei-imaster/vpcs"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java new file mode 100644 index 00000000000..df6c792e1ca --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/huawei/imaster/QueryHuaweiIMasterVpcResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.huawei.imaster; + + + +public class QueryHuaweiIMasterVpcResult { + 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/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java index 854d32d13fa..f00de1952fb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2OrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java index 0670aef20e6..53bb36c5b6f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2ProjectAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java index 4d1575b67f4..188581aa6bb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java index a5bb512701d..ea4ea41d38a 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddAttributesToIAM2VirtualIDGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java index b26c2ba8f8c..d9d9ae5e33b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDGroupToProjectsAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java index debd245aacc..095e3ee8378 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java index 34084349c64..6659e146a43 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToOrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java index 572d5b879b1..5958bcbdc30 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java index 61937527ca9..7320a5c6fc4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddIAM2VirtualIDsToProjectsAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java index 407331c12bc..08da2267a85 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java index d2899b65128..c82beaf94e2 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AddRolesToIAM2VirtualIDGroupAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java index 55c408c03ab..59ed9c8c863 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/AttachIAM2ProjectToIAM2OrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java index f1915a28c93..9126f1aed9f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/Attribute.java @@ -4,6 +4,14 @@ public class Attribute { + 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; diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java index 2d8a76d4ef8..d8979de3cca 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/BatchCreateIAM2VirtualIDFromConfigFileAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java index 6173fcbdbf9..190291ad557 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationParentAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2OrganizationParent"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java index a60afac270e..69c87a49009 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2OrganizationStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2OrganizationState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java index 633788c62f0..c4ae6821a67 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2ProjectStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2ProjectState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java index 707213b8b4f..fc59203fdcd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDGroupStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2VirtualIDGroupState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java index ca1c012bae4..46dff445083 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDStateAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2VirtualIDState"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java index ad3178e7b86..945ae077534 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ChangeIAM2VirtualIDTypeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "changeIAM2VirtualIDType"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java index 124030b4558..94ea71721ca 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CheckIAM2VirtualIDConfigFileAction.java @@ -89,6 +89,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = false; info.parameterName = "checkIAM2VirtualIDConfigFile"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java index f9d2bd47d18..0eeec742bbb 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2OrganizationAction.java @@ -119,6 +119,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java index fc7d649762a..ba48f0c2e9d 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String organizationUuid; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String linkAccountUuid; + @Param(required = false) public java.lang.String resourceUuid; @@ -119,6 +122,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java index bd7cc5f4209..24c59d1109f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectFromTemplateAction.java @@ -43,6 +43,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List resourceTemplates; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String linkAccountUuid; + @Param(required = false) public java.lang.String resourceUuid; @@ -116,6 +119,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java index 5eb409ec0a6..b70638444fd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectRoleAction.java @@ -113,6 +113,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java index 3a6b279b5ac..afc0334c75b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateAction.java @@ -110,6 +110,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java index cccd51654b3..7d87d108777 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2ProjectTemplateFromProjectAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java index ae8180b6009..40cd014b6d4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDAction.java @@ -46,6 +46,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public boolean withoutDefaultRole = false; + @Param(required = false, validValues = {"ZStack","OAuth2","Ldap"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + @Param(required = false) public java.lang.String resourceUuid; @@ -119,6 +122,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java index 07b6969bce6..5db10864bdc 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/CreateIAM2VirtualIDGroupAction.java @@ -110,6 +110,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java index cbcbf4f6f69..02a9b82fd91 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2OrganizationAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java index b47340b71dd..bce7d3914c6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java index 924cfc1a594..93dda594247 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2ProjectTemplateAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java index 689d6f4ad48..22c842115ef 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java index 089189db132..177696a16c0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DeleteIAM2VirtualIDGroupAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java index 67526a0729a..5ee8e5a63ce 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/DetachIAM2ProjectFromIAM2OrganizationAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java index 788374814e2..911d0b7a958 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/ExpungeIAM2ProjectAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "expungeIAM2Project"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java index 220f4280937..9dd2a44f60c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RecoverIAM2ProjectAction.java @@ -95,6 +95,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "recoverIAM2Project"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java index 5ab190627d9..583e1c74023 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2OrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java index b993c0f8909..3e6df585357 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2ProjectAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java index 9addba20a2f..a60560db14d 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java index dc51bb20ae6..dfb19368649 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveAttributesFromIAM2VirtualIDGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java index be58161739d..83cae324e0a 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2ProjectLoginExpiredAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "removeIAM2ProjectLoginExpired"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java index 7b549c875b3..a670804f856 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDGroupFromProjectsAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java index fb42e010b22..51b54bde2de 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromGroupAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java index 03afe428cf3..c1eae738074 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromOrganizationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java index cac0c3146f3..96f9b59ebcf 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java index 57c6a9b218a..97a67ee6b23 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveIAM2VirtualIDsFromProjectsAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java index 5829aecd2f8..f5c1b087c54 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java index 12be25c8bc5..16d4eaaead0 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/RemoveRolesFromIAM2VirtualIDGroupAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java index 4ae4aea4deb..38df38a70e7 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectLoginExpiredAction.java @@ -31,6 +31,9 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String loginExpired; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String loginExpiredAttributeUuid; + @Param(required = false) public java.util.List systemTags; @@ -98,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setIAM2ProjectLoginExpired"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java index 05a7b6a20ca..24f903ce22b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetIAM2ProjectRetirePolicyAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setIAM2ProjectRetirePolicy"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java index a20e677ccb8..a712dc663b2 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationOperationAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setOrganizationOperation"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java index 2135d390376..97cc2963cc6 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/SetOrganizationSupervisorAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "setOrganizationSupervisor"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java index f39dea59097..ad6506acf8c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2Organization"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java index b4e33b1492b..83a66ee2d3b 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2OrganizationAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2OrganizationAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java index 4b3b5575d62..c69898d3ef8 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2Project"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java index 9eb8f57086d..cf980b8e938 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2ProjectAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java index 2d771440f07..2e91ce544b4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2ProjectTemplateAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2ProjectTemplate"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java index f771d47be19..053860e40bd 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualID"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java index 4a608b88917..252aba3c19f 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualIDAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java index 484a5edd3a1..757210c6de1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualIDGroup"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java index d568abb3259..09b8eae4bd4 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateIAM2VirtualIDGroupAttributeAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateIAM2VirtualIDGroupAttribute"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java index 7640bd6cf93..5c2293bf9db 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/api/UpdateOrganizationQuotaAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateOrganizationQuota"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java new file mode 100644 index 00000000000..543f4f4d4f2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/ContainerClusterInventory.java @@ -0,0 +1,55 @@ +package org.zstack.sdk.iam2.container; + + + +public class ContainerClusterInventory { + + public java.lang.String containerUuid; + public void setContainerUuid(java.lang.String containerUuid) { + this.containerUuid = containerUuid; + } + public java.lang.String getContainerUuid() { + return this.containerUuid; + } + + public long clusterId; + public void setClusterId(long clusterId) { + this.clusterId = clusterId; + } + public long getClusterId() { + return this.clusterId; + } + + public java.lang.String clusterName; + public void setClusterName(java.lang.String clusterName) { + this.clusterName = clusterName; + } + public java.lang.String getClusterName() { + return this.clusterName; + } + + public java.lang.String containerName; + public void setContainerName(java.lang.String containerName) { + this.containerName = containerName; + } + public java.lang.String getContainerName() { + return this.containerName; + } + + public java.lang.String containerDescription; + public void setContainerDescription(java.lang.String containerDescription) { + this.containerDescription = containerDescription; + } + public java.lang.String getContainerDescription() { + return this.containerDescription; + } + + public java.lang.String projectTag; + public void setProjectTag(java.lang.String projectTag) { + this.projectTag = projectTag; + } + public java.lang.String getProjectTag() { + return this.projectTag; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java new file mode 100644 index 00000000000..c8b4ba46056 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectContainerClusterCandidatesAction 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.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult 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 = 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.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesResult() : 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 = "/iam2/projects/container/cluster/candidates"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java new file mode 100644 index 00000000000..69449b586a3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerClusterCandidatesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectContainerClusterCandidatesResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java new file mode 100644 index 00000000000..07f4dd84749 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectContainerImageTagsAction 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.iam2.container.GetIAM2ProjectContainerImageTagsResult 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 projectId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String repositoryId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String imageName; + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @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.iam2.container.GetIAM2ProjectContainerImageTagsResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsResult() : 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 = "/iam2/project/{projectId}/repository/{repositoryId}/image/{imageName}/tag"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java new file mode 100644 index 00000000000..d3860dd50ad --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImageTagsResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectContainerImageTagsResult { + 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.Integer total; + public void setTotal(java.lang.Integer total) { + this.total = total; + } + public java.lang.Integer getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java new file mode 100644 index 00000000000..8bd4638d381 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectContainerImagesAction 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.iam2.container.GetIAM2ProjectContainerImagesResult 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 projectId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String repositoryId; + + @Param(required = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @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.iam2.container.GetIAM2ProjectContainerImagesResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesResult() : 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 = "/iam2/project/{projectId}/repository/{repositoryId}/image"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java new file mode 100644 index 00000000000..4ac2bd8c566 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectContainerImagesResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectContainerImagesResult { + 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.Integer total; + public void setTotal(java.lang.Integer total) { + this.total = total; + } + public java.lang.Integer getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java new file mode 100644 index 00000000000..cba3da80379 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetIAM2ProjectRepositoryAction 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.iam2.container.GetIAM2ProjectRepositoryResult 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 = false) + public java.lang.Integer limit = 1000; + + @Param(required = false) + public java.lang.Integer start = 0; + + @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.iam2.container.GetIAM2ProjectRepositoryResult value = res.getResult(org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryResult() : 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 = "/iam2/projects/repositories"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java new file mode 100644 index 00000000000..16bf045d036 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/GetIAM2ProjectRepositoryResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.iam2.container; + + + +public class GetIAM2ProjectRepositoryResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java new file mode 100644 index 00000000000..10ea4c31d00 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.iam2.container; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SetIAM2ProjectContainerClusterAction 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.iam2.container.SetIAM2ProjectContainerClusterResult 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 = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String containerUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Long clusterId; + + @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.iam2.container.SetIAM2ProjectContainerClusterResult value = res.getResult(org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterResult.class); + ret.value = value == null ? new org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterResult() : 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 = "/iam2/projects/{uuid}/container/cluster/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "setIAM2ProjectContainerCluster"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java new file mode 100644 index 00000000000..b4adb3df7c0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/iam2/container/SetIAM2ProjectContainerClusterResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.iam2.container; + + + +public class SetIAM2ProjectContainerClusterResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java index cbea6d639db..2fe5da94bd1 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2OrganizationInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -import org.zstack.sdk.iam2.entity.State; +import org.zstack.sdk.iam2.entity.IAM2State; import org.zstack.sdk.iam2.entity.OrganizationType; public class IAM2OrganizationInventory { @@ -29,11 +29,11 @@ public java.lang.String getDescription() { return this.description; } - public State state; - public void setState(State state) { + public IAM2State state; + public void setState(IAM2State state) { this.state = state; } - public State getState() { + public IAM2State getState() { return this.state; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/State.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2State.java similarity index 74% rename from sdk/src/main/java/org/zstack/sdk/iam2/entity/State.java rename to sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2State.java index d36e1349b76..393b5e08ff2 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/State.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2State.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -public enum State { +public enum IAM2State { Enabled, Disabled, Staled, diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java index e0939c640df..0cf12cbb273 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDGroupInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -import org.zstack.sdk.iam2.entity.State; +import org.zstack.sdk.iam2.entity.IAM2State; public class IAM2VirtualIDGroupInventory { @@ -36,11 +36,11 @@ public java.lang.String getDescription() { return this.description; } - public State state; - public void setState(State state) { + public IAM2State state; + public void setState(IAM2State state) { this.state = state; } - public State getState() { + public IAM2State getState() { return this.state; } diff --git a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java index 97d33c26c04..b49096b1b3c 100644 --- a/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/iam2/entity/IAM2VirtualIDInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk.iam2.entity; -import org.zstack.sdk.iam2.entity.State; +import org.zstack.sdk.iam2.entity.IAM2State; public class IAM2VirtualIDInventory { @@ -36,11 +36,11 @@ public java.lang.String getType() { return this.type; } - public State state; - public void setState(State state) { + public IAM2State state; + public void setState(IAM2State state) { this.state = state; } - public State getState() { + public IAM2State getState() { return this.state; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java index 7bfca2d27b3..2f2dad88fe8 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/AttachRoleToAccountAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java index fc70db18a8a..0afc3d658ad 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/CreateRoleAction.java @@ -113,6 +113,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "params"; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java index caf75de8d3f..41a8424a486 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DeleteRoleAction.java @@ -98,6 +98,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM2"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java index 7a8e64cbbec..346d675e7ee 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/DetachRoleFromAccountAction.java @@ -101,6 +101,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = ""; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java b/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java index 8ae3c7219c6..28ab46551cd 100644 --- a/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java +++ b/sdk/src/main/java/org/zstack/sdk/identity/role/api/UpdateRoleAction.java @@ -107,6 +107,7 @@ protected RestInfo getRestInfo() { info.needSession = true; info.needPoll = true; info.parameterName = "updateRole"; + info.morphTransform = "IAM1"; return info; } diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java new file mode 100644 index 00000000000..63c9e9edc32 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DegradeFromLicenseServerAction 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.license.api.server.DegradeFromLicenseServerResult 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 = 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.license.api.server.DegradeFromLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.DegradeFromLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.DegradeFromLicenseServerResult() : 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 = "/license-server"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java new file mode 100644 index 00000000000..c7800115aba --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/DegradeFromLicenseServerResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class DegradeFromLicenseServerResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java new file mode 100644 index 00000000000..510d48226c1 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetLicenseAuthorizedCapacityAction 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.license.api.server.GetLicenseAuthorizedCapacityResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public boolean showServerCapacity = false; + + @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.license.api.server.GetLicenseAuthorizedCapacityResult value = res.getResult(org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityResult() : 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 = "/license-server/authorized-capacity"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java new file mode 100644 index 00000000000..914453c4bb9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/GetLicenseAuthorizedCapacityResult.java @@ -0,0 +1,31 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.TotalLicenseAuthorizedCapacityView; +import org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityServerUsageView; + +public class GetLicenseAuthorizedCapacityResult { + public TotalLicenseAuthorizedCapacityView total; + public void setTotal(TotalLicenseAuthorizedCapacityView total) { + this.total = total; + } + public TotalLicenseAuthorizedCapacityView getTotal() { + return this.total; + } + + public java.util.List clients; + public void setClients(java.util.List clients) { + this.clients = clients; + } + public java.util.List getClients() { + return this.clients; + } + + public LicenseAuthorizedCapacityServerUsageView server; + public void setServer(LicenseAuthorizedCapacityServerUsageView server) { + this.server = server; + } + public LicenseAuthorizedCapacityServerUsageView getServer() { + return this.server; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java new file mode 100644 index 00000000000..e590a853801 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class IsLicenseServerAction 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.license.api.server.IsLicenseServerResult 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 = 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.license.api.server.IsLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.IsLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.IsLicenseServerResult() : 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 = "/license-server/is-server"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java new file mode 100644 index 00000000000..40183f7f4f7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/IsLicenseServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + + + +public class IsLicenseServerResult { + public boolean licenseServer; + public void setLicenseServer(boolean licenseServer) { + this.licenseServer = licenseServer; + } + public boolean getLicenseServer() { + return this.licenseServer; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java new file mode 100644 index 00000000000..b4d633f3d96 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryLicenseAuthorizedNodeAction 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.license.api.server.QueryLicenseAuthorizedNodeResult 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.license.api.server.QueryLicenseAuthorizedNodeResult value = res.getResult(org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeResult() : 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 = "/license-servers"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java new file mode 100644 index 00000000000..42812471867 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/QueryLicenseAuthorizedNodeResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.license.api.server; + + + +public class QueryLicenseAuthorizedNodeResult { + 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/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java new file mode 100644 index 00000000000..14ddda4da72 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RegisterLicenseServerAction 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.license.api.server.RegisterLicenseServerResult 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 ip; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map loginParams; + + @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.license.api.server.RegisterLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.RegisterLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.RegisterLicenseServerResult() : 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 = "/license-server/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java new file mode 100644 index 00000000000..905feafa03b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RegisterLicenseServerResult.java @@ -0,0 +1,23 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; + +public class RegisterLicenseServerResult { + public LicenseAuthorizedNodeInventory licenseClient; + public void setLicenseClient(LicenseAuthorizedNodeInventory licenseClient) { + this.licenseClient = licenseClient; + } + public LicenseAuthorizedNodeInventory getLicenseClient() { + return this.licenseClient; + } + + public LicenseAuthorizedNodeInventory licenseServer; + public void setLicenseServer(LicenseAuthorizedNodeInventory licenseServer) { + this.licenseServer = licenseServer; + } + public LicenseAuthorizedNodeInventory getLicenseServer() { + return this.licenseServer; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java new file mode 100644 index 00000000000..0f42eedfe4f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RequestLicenseCapacityAction 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.license.api.server.RequestLicenseCapacityResult 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 resourceUuid; + + @Param(required = true, validValues = {"CPU_Socket","CPU_Core","VM","Host","Capacity","None"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String quotaType; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,9223372036854775807L}, noTrim = false) + public java.lang.Long quota; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String licenseType; + + @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.license.api.server.RequestLicenseCapacityResult value = res.getResult(org.zstack.sdk.license.api.server.RequestLicenseCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.RequestLicenseCapacityResult() : 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 = "/license-server/capacity-application"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java new file mode 100644 index 00000000000..000317b5d1f --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/RequestLicenseCapacityResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedCapacityInventory; + +public class RequestLicenseCapacityResult { + public LicenseAuthorizedCapacityInventory inventory; + public void setInventory(LicenseAuthorizedCapacityInventory inventory) { + this.inventory = inventory; + } + public LicenseAuthorizedCapacityInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java new file mode 100644 index 00000000000..7610c600282 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncLicenseCapacityAction 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.license.api.server.SyncLicenseCapacityResult 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 = 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.license.api.server.SyncLicenseCapacityResult value = res.getResult(org.zstack.sdk.license.api.server.SyncLicenseCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.SyncLicenseCapacityResult() : 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 = "/license-server/authorized-capacity/sync"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "syncLicenseCapacity"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java new file mode 100644 index 00000000000..1f491410569 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/SyncLicenseCapacityResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class SyncLicenseCapacityResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java new file mode 100644 index 00000000000..727c9605895 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnregisterLicenseRequestedApplicationAction 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.license.api.server.UnregisterLicenseRequestedApplicationResult 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 appId; + + @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.license.api.server.UnregisterLicenseRequestedApplicationResult value = res.getResult(org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationResult() : 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 = "/license/unregister-applications"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "unregisterLicenseRequestedApplication"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java new file mode 100644 index 00000000000..c49df01533b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseRequestedApplicationResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class UnregisterLicenseRequestedApplicationResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java new file mode 100644 index 00000000000..8c9669b4fd6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UnregisterLicenseServerAction 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.license.api.server.UnregisterLicenseServerResult 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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @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.license.api.server.UnregisterLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.UnregisterLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.UnregisterLicenseServerResult() : 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 = "/license-server/client"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java new file mode 100644 index 00000000000..58c6ce83cf3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UnregisterLicenseServerResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class UnregisterLicenseServerResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java new file mode 100644 index 00000000000..f3ea01c77e7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerAction.java @@ -0,0 +1,98 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpgradeToLicenseServerAction 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.license.api.server.UpgradeToLicenseServerResult 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 = 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.license.api.server.UpgradeToLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.UpgradeToLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.UpgradeToLicenseServerResult() : 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 = "/license-server"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java new file mode 100644 index 00000000000..0a3710c6f4c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/UpgradeToLicenseServerResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; + +public class UpgradeToLicenseServerResult { + public LicenseAuthorizedNodeInventory inventory; + public void setInventory(LicenseAuthorizedNodeInventory inventory) { + this.inventory = inventory; + } + public LicenseAuthorizedNodeInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java new file mode 100644 index 00000000000..7cce409fdbf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class VerifyLicenseServerAction 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.license.api.server.VerifyLicenseServerResult 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 appId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAccessKeyId; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAccessKeySecret; + + @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.license.api.server.VerifyLicenseServerResult value = res.getResult(org.zstack.sdk.license.api.server.VerifyLicenseServerResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.VerifyLicenseServerResult() : 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 = "/license-server/register-verify"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java new file mode 100644 index 00000000000..de5484187cc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/VerifyLicenseServerResult.java @@ -0,0 +1,39 @@ +package org.zstack.sdk.license.api.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; + +public class VerifyLicenseServerResult { + public java.lang.String accessKeyId; + public void setAccessKeyId(java.lang.String accessKeyId) { + this.accessKeyId = accessKeyId; + } + public java.lang.String getAccessKeyId() { + return this.accessKeyId; + } + + public java.lang.String accessKeySecret; + public void setAccessKeySecret(java.lang.String accessKeySecret) { + this.accessKeySecret = accessKeySecret; + } + public java.lang.String getAccessKeySecret() { + return this.accessKeySecret; + } + + public LicenseAuthorizedNodeInventory licenseClient; + public void setLicenseClient(LicenseAuthorizedNodeInventory licenseClient) { + this.licenseClient = licenseClient; + } + public LicenseAuthorizedNodeInventory getLicenseClient() { + return this.licenseClient; + } + + public LicenseAuthorizedNodeInventory licenseServer; + public void setLicenseServer(LicenseAuthorizedNodeInventory licenseServer) { + this.licenseServer = licenseServer; + } + public LicenseAuthorizedNodeInventory getLicenseServer() { + return this.licenseServer; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java new file mode 100644 index 00000000000..6334e2ec530 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.license.api.server; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class WithdrawLicenseCapacityApplicationAction 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.license.api.server.WithdrawLicenseCapacityApplicationResult 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 = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List resourceUuidList; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String clientAuthorizedNodeUuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String licenseType; + + @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.license.api.server.WithdrawLicenseCapacityApplicationResult value = res.getResult(org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationResult.class); + ret.value = value == null ? new org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationResult() : 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 = "/license-server/capacity-application"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java new file mode 100644 index 00000000000..f8020407e72 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/api/server/WithdrawLicenseCapacityApplicationResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.license.api.server; + + + +public class WithdrawLicenseCapacityApplicationResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java new file mode 100644 index 00000000000..4b3f9c3c59d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientAddOnUsageView.java @@ -0,0 +1,31 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityClientAddOnUsageView { + + public java.lang.String module; + public void setModule(java.lang.String module) { + this.module = module; + } + public java.lang.String getModule() { + return this.module; + } + + public long used; + public void setUsed(long used) { + this.used = used; + } + public long getUsed() { + return this.used; + } + + public java.util.List usageDetails; + public void setUsageDetails(java.util.List usageDetails) { + this.usageDetails = usageDetails; + } + public java.util.List getUsageDetails() { + return this.usageDetails; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java new file mode 100644 index 00000000000..df2514261bf --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityClientUsageView.java @@ -0,0 +1,55 @@ +package org.zstack.sdk.license.header.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; + +public class LicenseAuthorizedCapacityClientUsageView { + + public java.lang.String clientAppId; + public void setClientAppId(java.lang.String clientAppId) { + this.clientAppId = clientAppId; + } + public java.lang.String getClientAppId() { + return this.clientAppId; + } + + public java.lang.String clientAuthorizedNodeUuid; + public void setClientAuthorizedNodeUuid(java.lang.String clientAuthorizedNodeUuid) { + this.clientAuthorizedNodeUuid = clientAuthorizedNodeUuid; + } + public java.lang.String getClientAuthorizedNodeUuid() { + return this.clientAuthorizedNodeUuid; + } + + public LicenseAuthorizedNodeInventory clientInventory; + public void setClientInventory(LicenseAuthorizedNodeInventory clientInventory) { + this.clientInventory = clientInventory; + } + public LicenseAuthorizedNodeInventory getClientInventory() { + return this.clientInventory; + } + + public long platformUsed; + public void setPlatformUsed(long platformUsed) { + this.platformUsed = platformUsed; + } + public long getPlatformUsed() { + return this.platformUsed; + } + + public java.util.List platformUsageDetails; + public void setPlatformUsageDetails(java.util.List platformUsageDetails) { + this.platformUsageDetails = platformUsageDetails; + } + public java.util.List getPlatformUsageDetails() { + return this.platformUsageDetails; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java new file mode 100644 index 00000000000..cb5184b0207 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityInventory.java @@ -0,0 +1,79 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String nodeUuid; + public void setNodeUuid(java.lang.String nodeUuid) { + this.nodeUuid = nodeUuid; + } + public java.lang.String getNodeUuid() { + return this.nodeUuid; + } + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public java.lang.String quotaType; + public void setQuotaType(java.lang.String quotaType) { + this.quotaType = quotaType; + } + public java.lang.String getQuotaType() { + return this.quotaType; + } + + public java.lang.Long quota; + public void setQuota(java.lang.Long quota) { + this.quota = quota; + } + public java.lang.Long getQuota() { + return this.quota; + } + + 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 type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + 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/license/header/server/LicenseAuthorizedCapacityServerUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityServerUsageView.java new file mode 100644 index 00000000000..d498f815d3a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityServerUsageView.java @@ -0,0 +1,23 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityServerUsageView { + + public long platformUsed; + public void setPlatformUsed(long platformUsed) { + this.platformUsed = platformUsed; + } + public long getPlatformUsed() { + return this.platformUsed; + } + + public java.util.List addOns; + public void setAddOns(java.util.List addOns) { + this.addOns = addOns; + } + public java.util.List getAddOns() { + return this.addOns; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java new file mode 100644 index 00000000000..e8d8e567b18 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedCapacityUsageDetailView.java @@ -0,0 +1,39 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedCapacityUsageDetailView { + + public java.lang.String resourceUuid; + public void setResourceUuid(java.lang.String resourceUuid) { + this.resourceUuid = resourceUuid; + } + public java.lang.String getResourceUuid() { + return this.resourceUuid; + } + + public long used; + public void setUsed(long used) { + this.used = used; + } + public long getUsed() { + return this.used; + } + + 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/license/header/server/LicenseAuthorizedNodeInventory.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedNodeInventory.java new file mode 100644 index 00000000000..fde99128f9d --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseAuthorizedNodeInventory.java @@ -0,0 +1,71 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseAuthorizedNodeInventory { + + 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 appId; + public void setAppId(java.lang.String appId) { + this.appId = appId; + } + public java.lang.String getAppId() { + return this.appId; + } + + public java.lang.String ip; + public void setIp(java.lang.String ip) { + this.ip = ip; + } + public java.lang.String getIp() { + return this.ip; + } + + public java.sql.Timestamp lastSyncDate; + public void setLastSyncDate(java.sql.Timestamp lastSyncDate) { + this.lastSyncDate = lastSyncDate; + } + public java.sql.Timestamp getLastSyncDate() { + return this.lastSyncDate; + } + + public java.lang.String status; + public void setStatus(java.lang.String status) { + this.status = status; + } + public java.lang.String getStatus() { + return this.status; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + 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/license/header/server/LicenseUsageView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java new file mode 100644 index 00000000000..dd713fdddfa --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/LicenseUsageView.java @@ -0,0 +1,39 @@ +package org.zstack.sdk.license.header.server; + + + +public class LicenseUsageView { + + 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; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java b/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java new file mode 100644 index 00000000000..7860523e8b8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/license/header/server/TotalLicenseAuthorizedCapacityView.java @@ -0,0 +1,48 @@ +package org.zstack.sdk.license.header.server; + +import org.zstack.sdk.license.header.server.LicenseAuthorizedNodeInventory; +import org.zstack.sdk.LicenseInventory; + +public class TotalLicenseAuthorizedCapacityView { + + public java.lang.String serverAppId; + public void setServerAppId(java.lang.String serverAppId) { + this.serverAppId = serverAppId; + } + public java.lang.String getServerAppId() { + return this.serverAppId; + } + + public java.lang.String serverAuthorizedNodeUuid; + public void setServerAuthorizedNodeUuid(java.lang.String serverAuthorizedNodeUuid) { + this.serverAuthorizedNodeUuid = serverAuthorizedNodeUuid; + } + public java.lang.String getServerAuthorizedNodeUuid() { + return this.serverAuthorizedNodeUuid; + } + + public LicenseAuthorizedNodeInventory serverInventory; + public void setServerInventory(LicenseAuthorizedNodeInventory serverInventory) { + this.serverInventory = serverInventory; + } + public LicenseAuthorizedNodeInventory getServerInventory() { + return this.serverInventory; + } + + 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; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java index 6638ecc9d7c..5b0914bc88f 100644 --- a/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/email/ValidateSNSEmailPlatformAction.java @@ -40,6 +40,9 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String password; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String encryptType; + @Param(required = false) public java.util.List systemTags; diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java new file mode 100644 index 00000000000..88c0b681aff --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointAction.java @@ -0,0 +1,122 @@ +package org.zstack.sdk.sns.platform.plugin; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateSNSPluginEndpointAction 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.sns.platform.plugin.CreateSNSPluginEndpointResult 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 type; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public long timeoutInSeconds = 0L; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map properties; + + @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 = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String platformUuid; + + @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.sns.platform.plugin.CreateSNSPluginEndpointResult value = res.getResult(org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointResult() : 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 = "/sns/application-endpoints/plugin"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java new file mode 100644 index 00000000000..5440b617541 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/CreateSNSPluginEndpointResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.sns.platform.plugin; + +import org.zstack.sdk.sns.platform.plugin.SNSPluginEndpointInventory; + +public class CreateSNSPluginEndpointResult { + public SNSPluginEndpointInventory inventory; + public void setInventory(SNSPluginEndpointInventory inventory) { + this.inventory = inventory; + } + public SNSPluginEndpointInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java new file mode 100644 index 00000000000..296635f110b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk.sns.platform.plugin; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QuerySNSPluginEndpointAction 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.sns.platform.plugin.QuerySNSPluginEndpointResult 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.sns.platform.plugin.QuerySNSPluginEndpointResult value = res.getResult(org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointResult.class); + ret.value = value == null ? new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointResult() : 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 = "/sns/application-endpoints/plugin"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java new file mode 100644 index 00000000000..0d1ca7411de --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/QuerySNSPluginEndpointResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.sns.platform.plugin; + + + +public class QuerySNSPluginEndpointResult { + 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/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java new file mode 100644 index 00000000000..fd491e80393 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/sns/platform/plugin/SNSPluginEndpointInventory.java @@ -0,0 +1,39 @@ +package org.zstack.sdk.sns.platform.plugin; + +import org.zstack.sdk.PluginDriverInventory; + +public class SNSPluginEndpointInventory extends org.zstack.sdk.sns.SNSApplicationEndpointInventory { + + public java.lang.String pluginDriverUuid; + public void setPluginDriverUuid(java.lang.String pluginDriverUuid) { + this.pluginDriverUuid = pluginDriverUuid; + } + public java.lang.String getPluginDriverUuid() { + return this.pluginDriverUuid; + } + + public long timeoutInSeconds; + public void setTimeoutInSeconds(long timeoutInSeconds) { + this.timeoutInSeconds = timeoutInSeconds; + } + public long getTimeoutInSeconds() { + return this.timeoutInSeconds; + } + + public java.util.Map properties; + public void setProperties(java.util.Map properties) { + this.properties = properties; + } + public java.util.Map getProperties() { + return this.properties; + } + + public PluginDriverInventory driver; + public void setDriver(PluginDriverInventory driver) { + this.driver = driver; + } + public PluginDriverInventory getDriver() { + return this.driver; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java index c77bbb562f4..16a4a60a378 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/AddLabelToAlarmAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String value; - @Param(required = true, validValues = {"Regex","Equal"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"Regex","Equal","RegexAgainst","NotEqual"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String operator; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java index 23246bc1077..813761701d6 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/alarm/UpdateAlarmLabelAction.java @@ -34,7 +34,7 @@ public Result throwExceptionIfError() { @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String value; - @Param(required = true, validValues = {"Regex","Equal"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"Regex","Equal","RegexAgainst","NotEqual"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String operator; @Param(required = false) diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java new file mode 100644 index 00000000000..966d8ed7114 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk.zwatch.api; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetPrometheusMetricLabelValueAction 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.api.GetPrometheusMetricLabelValueResult 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 namespace; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String metricName; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,253402271999L}, noTrim = false) + public java.lang.Long startTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, numberRange = {0L,253402271999L}, noTrim = false) + public java.lang.Long endTime; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List labelNames; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List filterLabels; + + @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.zwatch.api.GetPrometheusMetricLabelValueResult value = res.getResult(org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueResult.class); + ret.value = value == null ? new org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueResult() : 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 = "/zwatch/metrics/prometheus/label-values"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java new file mode 100644 index 00000000000..62a3157e5bd --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/api/GetPrometheusMetricLabelValueResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.zwatch.api; + + + +public class GetPrometheusMetricLabelValueResult { + public java.util.Map labelValues; + public void setLabelValues(java.util.Map labelValues) { + this.labelValues = labelValues; + } + public java.util.Map getLabelValues() { + return this.labelValues; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java b/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java deleted file mode 100644 index c011401d3bc..00000000000 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/datatype/AuditDataV1.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.zstack.sdk.zwatch.datatype; - - - -public class AuditDataV1 extends org.zstack.sdk.zwatch.datatype.AuditData { - - -} diff --git a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java index 429fd24c961..2aa0bfcf9eb 100644 --- a/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java +++ b/sdk/src/main/java/org/zstack/sdk/zwatch/thirdparty/api/AddThirdpartyPlatformAction.java @@ -28,7 +28,7 @@ public Result throwExceptionIfError() { @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String name; - @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + @Param(required = true, validValues = {"XSKY","XSKY_V6","ZSTONE"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.String type; @Param(required = true, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) diff --git a/search/pom.xml b/search/pom.xml index a9b03626e36..b765e61e0f1 100755 --- a/search/pom.xml +++ b/search/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. search diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java index 05c25a618cf..3445f1a32d5 100755 --- a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/AbstractQueryVisitorPlugin.java @@ -28,7 +28,7 @@ public AbstractQueryVisitorPlugin(ASTNode.Query node) { public List targetFields() { ZQLMetadata.InventoryMetadata inventory = ZQLMetadata.findInventoryMetadata(node.getTarget().getEntity()); List fieldNames = new ArrayList<>(); - if (node.getGroupBy() != null) { + if (node.getGroupBy() != null && node.getTarget().getFunction() != null) { fieldNames.addAll(node.getGroupBy().getFields()); } if (node.getTarget().getFields() != null) { diff --git a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java index 0168d070c35..911dc2896f1 100755 --- a/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java +++ b/search/src/main/java/org/zstack/zql/ast/visitors/plugin/QueryPlugin.java @@ -61,8 +61,10 @@ public String selectTarget() { if (StringUtils.isNotBlank(queryTarget)) { if (isDistinct(function)) { return queryTarget.concat(",").concat(groupByTarget); - } else { + } else if (function != null) { return groupByTarget.concat(",").concat(queryTarget); + } else { + return queryTarget; } } else { return groupByTarget; diff --git a/simulator/pom.xml b/simulator/pom.xml index d9d75651e23..d2e22ea6592 100755 --- a/simulator/pom.xml +++ b/simulator/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. simulator diff --git a/simulator/simulatorHeader/pom.xml b/simulator/simulatorHeader/pom.xml index 51d7e0d2ce1..8ed6ccc130d 100755 --- a/simulator/simulatorHeader/pom.xml +++ b/simulator/simulatorHeader/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.2.0 + 5.4.0 .. simulatorHeader diff --git a/simulator/simulatorImpl/pom.xml b/simulator/simulatorImpl/pom.xml index e7d6ff803ba..488fb34922d 100755 --- a/simulator/simulatorImpl/pom.xml +++ b/simulator/simulatorImpl/pom.xml @@ -4,7 +4,7 @@ simulator org.zstack - 5.2.0 + 5.4.0 .. simulatorImpl diff --git a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java index a4c639c9bdd..45cf8612a3c 100755 --- a/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java +++ b/simulator/simulatorImpl/src/main/java/org/zstack/simulator/storage/primary/SimulatorPrimaryStorage.java @@ -155,6 +155,7 @@ protected void handle(AskVolumeSnapshotCapabilityMsg msg) { AskVolumeSnapshotCapabilityReply reply = new AskVolumeSnapshotCapabilityReply(); VolumeSnapshotCapability capability = new VolumeSnapshotCapability(); capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN); + capability.setPlacementType(VolumeSnapshotCapability.VolumeSnapshotPlacementType.EXTERNAL); capability.setSupport(true); reply.setCapability(capability); bus.reply(msg, reply); diff --git a/storage/pom.xml b/storage/pom.xml index c45fa73c3c7..d5fe306aec3 100755 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -3,7 +3,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. storage diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java index 45b2b92502d..2c561cc03a3 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/BlockExternalPrimaryStorageFactory.java @@ -10,10 +10,4 @@ public interface BlockExternalPrimaryStorageFactory { String getType(); BlockExternalPrimaryStorageBackend getBlockExternalPrimaryStorageBackend(PrimaryStorageVO vo); - - void activeIscsiVolume(String clientIqn, BaseVolumeInfo vol, boolean shareable); - - Map getVolumeIscsiInfo(String volInstallPath, HostInventory host); - - String getVolumeLunId(String volInstallPath); } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java new file mode 100644 index 00000000000..3e35587825f --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalHostIdGetter.java @@ -0,0 +1,234 @@ +package org.zstack.storage.addon.primary; + +import org.hibernate.exception.ConstraintViolationException; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.transaction.annotation.Transactional; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.thread.SyncTask; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.HostVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO; +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageHostRefVO_; +import org.zstack.header.storage.primary.PrimaryStorageHostStatus; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import javax.persistence.LockModeType; +import java.sql.Timestamp; +import java.util.BitSet; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class ExternalHostIdGetter { + private static final CLogger logger = Utils.getLogger(ExternalHostIdGetter.class); + private static final Random random = new Random(); + + @Autowired + protected DatabaseFacade dbf; + @Autowired + private ThreadFacade thdf; + + private final int maxHostId; + + public ExternalHostIdGetter(int maxHostId) { + this.maxHostId = maxHostId; + } + + public ExternalPrimaryStorageHostRefVO getOrAllocateHostIdRef(String hostUuid, String psUuid) { + if (!dbf.isExist(psUuid, ExternalPrimaryStorageVO.class)) { + throw new CloudRuntimeException(String.format( + "can not find external primary storage[uuid: %s]", psUuid)); + } + + if (!dbf.isExist(hostUuid, HostVO.class)) { + throw new CloudRuntimeException(String.format( + "can not find host[uuid: %s] for external primary storage[uuid: %s]", hostUuid, psUuid)); + } + + ExternalPrimaryStorageHostRefVO refVO = findRef(hostUuid, psUuid); + if (refVO != null) { + return refVO; + } + + if (allocateAndSetHostId(hostUuid, psUuid) == null) { + throw new CloudRuntimeException(String.format("cannot allocate host id for primary storage[uuid:%s]", psUuid)); + } + + return Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, hostUuid) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .find(); + } + + private ExternalPrimaryStorageHostRefVO findRef(String hostUuid, String psUuid) { + return Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, hostUuid) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .find(); + } + + private Integer allocateAndSetHostId(String hostUuid, String psUuid) { + Future f = thdf.syncSubmit(new SyncTask() { + @Override + public String getSyncSignature() { + return "allocate-and-set-host-id-for-" + psUuid; + } + + @Override + public int getSyncLevel() { + return 0; + } + + @Override + public String getName() { + return String.format("allocate-and-set-host-id-for-host-%s-ps-%s", hostUuid, psUuid); + } + + @Override + public Integer call() throws Exception { + return doAllocateAndSetHostId(hostUuid, psUuid); + } + }); + + try { + return f.get(1, TimeUnit.MINUTES); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new RuntimeException(e); + } + } + + @Transactional + protected Integer doAllocateAndSetHostId(String hostUuid, String psUuid) { + dbf.getEntityManager().find(ExternalPrimaryStorageVO.class, psUuid, LockModeType.PESSIMISTIC_WRITE); + + ExternalPrimaryStorageHostRefVO vo = findRef(hostUuid, psUuid); + if (vo != null && vo.getHostId() > 0) { + return vo.getHostId(); + } + + int hostId = allocateHostId(psUuid); + + try { + if (vo == null) { + vo = new ExternalPrimaryStorageHostRefVO(); + vo.setHostId(hostId); + vo.setCreateDate(new Timestamp(System.currentTimeMillis())); + vo.setHostUuid(hostUuid); + vo.setPrimaryStorageUuid(psUuid); + vo.setStatus(PrimaryStorageHostStatus.Disconnected); + dbf.getEntityManager().persist(vo); + logger.debug(String.format( + "new external primary storage[%s] host[%s] ref created, allocated host id[%s]", psUuid, hostUuid, vo.getHostId())); + return hostId; + } else if (vo.getHostId() != hostId) { + boolean exists = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostId, hostId) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .isExists(); + if (!exists) { + vo.setHostId(hostId); + dbf.getEntityManager().merge(vo); + return hostId; + } else { + logger.warn(String.format("found abnormal duplicate entry for ExternalPrimaryStorageHostRefVO[hostUuid: %s, hostId: %s]", hostUuid, hostId)); + return null; + } + } + } catch (ConstraintViolationException e) { + logger.error(String.format("found duplicate entry for hostUuid: %s, hostId: %s", + hostUuid, hostId)); + return null; + } + return null; + } + + private int allocateHostId(String psUuid) { + int total = this.maxHostId; + Integer s = 1; + Integer e = total; + Integer ret = steppingAllocate(s, e, total, psUuid); + if (ret != null) { + return ret; + } + + ret = steppingAllocate(s, e, total, psUuid); + if (ret != null) { + return ret; + } + + throw new CloudRuntimeException(String.format("no available host id for external primary storage[uuid:%s]", psUuid)); + } + + private Integer steppingAllocate(Integer s, Integer e, int total, String psUuid) { + int step = 100; + int failureCount = 0; + int failureCheckPoint = 10; + + while (s < e) { + if (failureCheckPoint == failureCount++) { + long count = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .gte(ExternalPrimaryStorageHostRefVO_.hostId, s) + .lte(ExternalPrimaryStorageHostRefVO_.hostId, e) + .count(); + if (count == total) { + logger.debug(String.format("host id range[s: %d, e: %d] has no vni available, try next one", s, e)); + return null; + } else { + failureCount = 0; + } + } + + int te = s + step; + te = te > e ? e : te; + List used = Q.New(ExternalPrimaryStorageHostRefVO.class).select(ExternalPrimaryStorageHostRefVO_.hostId) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, psUuid) + .gte(ExternalPrimaryStorageHostRefVO_.hostId, s) + .lte(ExternalPrimaryStorageHostRefVO_.hostId, te) + .listValues(); + + if (te - s + 1 == used.size()) { + s += step; + continue; + } + + Collections.sort(used); + + return randomAllocateHostId(s, te, used); + } + + return null; + } + + private static Integer randomAllocateHostId(Integer start, Integer end, List allocated) { + int total = (end - start + 1); + if (total == allocated.size()) { + return null; + } + + BitSet full = new BitSet(total); + for (Integer alloc : allocated) { + full.set(alloc - start); + } + + int next = random.nextInt(total); + int a = full.nextClearBit(next); + + if (a >= total) { + a = full.nextClearBit(0); + } + + return a + start; + } +} diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index 837dfa74ce5..79332acdc88 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -5,7 +5,6 @@ import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.core.CoreGlobalProperty; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.cloudbus.ResourceDestinationMaker; @@ -55,10 +54,9 @@ import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; @@ -137,6 +135,12 @@ protected void handleLocalMessage(Message msg) { handle((SetTrashExpirationTimeMsg) msg); } else if (msg instanceof GetAccessPathMsg) { handle((GetAccessPathMsg) msg); + } else if (msg instanceof UpdatePrimaryStorageHostStatusMsg) { + handle((UpdatePrimaryStorageHostStatusMsg) msg); + } else if (msg instanceof GetVolumeBackingChainFromPrimaryStorageMsg) { + handle((GetVolumeBackingChainFromPrimaryStorageMsg) msg); + } else if (msg instanceof DeleteVolumeChainOnPrimaryStorageMsg) { + handle((DeleteVolumeChainOnPrimaryStorageMsg) msg); } else { super.handleLocalMessage(msg); } @@ -177,11 +181,34 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { if (msg.getDefaultProtocol() != null) { externalVO.setDefaultProtocol(msg.getDefaultProtocol()); } + boolean needReconnect = false; if (msg.getConfig() != null) { controller.validateConfig(msg.getConfig()); externalVO.setConfig(msg.getConfig()); + needReconnect = true; } externalVO = dbf.updateAndRefresh(externalVO); + + if (needReconnect) { + ReconnectPrimaryStorageMsg rmsg = new ReconnectPrimaryStorageMsg(); + rmsg.setPrimaryStorageUuid(externalVO.getUuid()); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, rmsg.getPrimaryStorageUuid()); + bus.send(rmsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + evt.setError(reply.getError()); + } else { + self = dbf.reload(self); + evt.setInventory(externalVO.toInventory()); + } + + bus.publish(evt); + } + }); + return; + } + evt.setInventory(externalVO.toInventory()); bus.publish(evt); } @@ -189,10 +216,27 @@ private void handle(APIUpdateExternalPrimaryStorageMsg msg) { @Override protected void handle(APICleanUpImageCacheOnPrimaryStorageMsg msg) { APICleanUpImageCacheOnPrimaryStorageEvent evt = new APICleanUpImageCacheOnPrimaryStorageEvent(msg.getId()); - imageCacheCleaner.cleanup(msg.getUuid(), false); + imageCacheCleaner.cleanup(msg.getUuid(), new ImageCacheCleanParam(true, msg.isForce())); bus.publish(evt); } + @Override + protected void handle(UpdatePrimaryStorageHostStatusMsg msg) { + ExternalPrimaryStorageHostRefVO ref = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, msg.getHostUuid()) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, msg.getPrimaryStorageUuid()) + .find(); + + if (ref == null || ref.getHostId() == 0) { + // FIXME: different primary storage may have different max host id + ref = new ExternalHostIdGetter(999).getOrAllocateHostIdRef(msg.getHostUuid(), msg.getPrimaryStorageUuid()); + } + + updatePrimaryStorageHostStatus(msg.getPrimaryStorageUuid(), msg.getHostUuid(), msg.getStatus(), msg.getReason()); + UpdatePrimaryStorageHostStatusReply reply = new UpdatePrimaryStorageHostStatusReply(); + bus.reply(msg, reply); + } + @Override protected void handle(InstantiateVolumeOnPrimaryStorageMsg msg) { VolumeInventory volume = msg.getVolume(); @@ -240,8 +284,7 @@ public void success(VolumeStats stats) { reply.setSize(stats.getSize()); reply.setInstallPath(stats.getInstallPath()); reply.setProtocol(externalVO.getDefaultProtocol()); - // FIXME: bypass the incremental flag for expon - // reply.setIncremental(true); + reply.setIncremental(!controller.reportCapabilities().getSnapshotCapability().isSupportLazyDelete()); bus.reply(msg, reply); } @@ -587,8 +630,9 @@ public void run(MessageReply r) { } }); + flow(new Flow() { - final String __name__ = "clone-volume"; + final String __name__ = "create-image-cache-from-volume-snapshot"; @Override public void run(FlowTrigger trigger, Map data) { @@ -638,6 +682,39 @@ public void fail(ErrorCode errorCode) { } }); + flow(new NoRollbackFlow() { + String __name__ = "create-image-cache-snapshot"; + + @Override + public void run(FlowTrigger trigger, Map data) { + CreateVolumeSnapshotSpec sspec = new CreateVolumeSnapshotSpec(); + sspec.setVolumeInstallPath(imageCachePath); + sspec.setName(buildSnapshotName(msg.getImageInventory().getUuid())); + controller.createSnapshot(sspec, new ReturnValueCompletion(trigger) { + @Override + public void success(VolumeSnapshotStats returnValue) { + ImageCacheVO cvo = new ImageCacheVO(); + cvo.setMd5sum("not calculated"); + cvo.setInstallUrl(returnValue.getInstallPath()); + cvo.setImageUuid((msg.getImageInventory().getUuid())); + cvo.setPrimaryStorageUuid(self.getUuid()); + cvo.setMediaType(ImageConstant.ImageMediaType.valueOf( + msg.getImageInventory().getMediaType()) + ); + cvo.setState(ImageCacheState.ready); + cvo.setSize(returnValue.getActualSize()); + dbf.persist(cvo); + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + done(new FlowDoneHandler(msg) { @Override public void handle(Map data) { @@ -669,8 +746,17 @@ protected void handle(CreateImageCacheFromVolumeSnapshotOnPrimaryStorageMsg msg) ImageCacheVO cache = createTemporaryImageCacheFromVolumeSnapshot(msg.getImageInventory(), msg.getVolumeSnapshot()); dbf.persist(cache); reply.setInventory(cache.toInventory()); - // TODO hardcode for expon - reply.setIncremental(false); + + boolean lazyDelete = controller.reportCapabilities().getSnapshotCapability().isSupportLazyDelete(); + /** + If the primary storage supports lazy deletion, we can delete the snapshot immediately. + Otherwise, we need to retain the snapshot until its references are deleted. + The incremental clone mechanism handles this reference management. + + In other words, if the primary storage supports lazy deletion, we can treat it as a + standard clone operation for simplified management. + */ + reply.setIncremental(!lazyDelete); bus.reply(msg, reply); return; } @@ -1128,7 +1214,10 @@ public void success(VolumeStats volStats) { cache.setImageUuid(image.getUuid()); cache.setMediaType(ImageConstant.ImageMediaType.valueOf(image.getMediaType())); cache.setInstallUrl(volStats.getInstallPath()); - cache.setSize(volStats.getSize()); + // zbs report size in 20~30s interval, so we can't use volStats.getActualSize(), + // Currently, all external storages are thinly provisioned. For now, + // we will use the actual size of the image. + cache.setSize(image.getActualSize()); cache.setPrimaryStorageUuid(self.getUuid()); dbf.persist(cache); completion.success(ImageCacheInventory.valueOf(cache)); @@ -1300,7 +1389,7 @@ public boolean skip(Map data) { public void run(FlowTrigger trigger, Map data) { CreateVolumeSnapshotSpec sspec = new CreateVolumeSnapshotSpec(); sspec.setVolumeInstallPath(volume.getInstallPath()); - sspec.setName(spec.getName()); + sspec.setName(buildSnapshotName(spec.getUuid())); controller.createSnapshot(sspec, new ReturnValueCompletion(trigger) { @Override public void success(VolumeSnapshotStats returnValue) { @@ -1346,14 +1435,103 @@ protected void handle(GetInstallPathForDataVolumeDownloadMsg msg) { bus.reply(msg, reply); } + protected void handle(GetVolumeBackingChainFromPrimaryStorageMsg msg) { + GetVolumeBackingChainFromPrimaryStorageReply r = new GetVolumeBackingChainFromPrimaryStorageReply(); + new While<>(msg.getRootInstallPaths()).each((installPath, compl) -> { + getParentChain(installPath, new ArrayList<>(), new ReturnValueCompletion>(compl) { + @Override + public void success(List chains) { + long tsize = 0; + List chainPaths = new ArrayList<>(); + for (VolumeStats stats : chains) { + tsize += stats.getActualSize(); + chainPaths.add(stats.getInstallPath()); + } + + r.putBackingChainInstallPath(installPath, chainPaths); + r.putBackingChainSize(installPath, tsize); + compl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + compl.addError(errorCode); + compl.allDone(); + } + }); + }).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + r.setError(errorCodeList.getCauses().get(0)); + } + bus.reply(msg, r); + } + }); + } + + private void getParentChain(String installPath, List chains, ReturnValueCompletion> completion) { + controller.stats(installPath, new ReturnValueCompletion(completion) { + @Override + public void success(VolumeStats stats) { + chains.add(stats); + if (stats.getParentUri() == null) { + chains.remove(0); // do not contain self + completion.success(chains); + return; + } + + getParentChain(stats.getParentUri(), chains, completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }); + } + + protected void handle(DeleteVolumeChainOnPrimaryStorageMsg msg) { + DeleteVolumeChainOnPrimaryStorageReply reply = new DeleteVolumeChainOnPrimaryStorageReply(); + new While<>(msg.getInstallPaths()).each((installPath, compl) -> { + // TODO use trash instead, make sure only one snapshot for link clone. + controller.deleteVolumeAndSnapshot(installPath, new Completion(compl) { + @Override + public void success() { + compl.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + compl.addError(errorCode); + compl.allDone(); + } + }); + }).run(new WhileDoneCompletion(msg) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (!errorCodeList.getCauses().isEmpty()) { + reply.setError(errorCodeList.getCauses().get(0)); + bus.reply(msg, reply); + } else { + bus.reply(msg, reply); + } + } + }); + } + @Override protected void handle(DeleteVolumeBitsOnPrimaryStorageMsg msg) { String protocol = null; boolean force = false; if (VolumeVO.class.getSimpleName().equals(msg.getBitsType()) && msg.getBitsUuid() != null) { VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, msg.getBitsUuid()).find(); - protocol = volume.getProtocol(); - if (VolumeType.Root.equals(volume.getType()) && VolumeProtocol.iSCSI.toString().equals(protocol)) { + if (volume != null) { + protocol = volume.getProtocol(); + } + + // FIXME(shenjin) remove it + if (volume != null && VolumeType.Root.equals(volume.getType()) && VolumeProtocol.iSCSI.toString().equals(protocol)) { force = true; } } @@ -1643,7 +1821,13 @@ public void setup() { @Override public void run(final FlowTrigger trigger, Map data) { - ImageInventory image = ImageInventory.valueOf(dbf.findByUuid(msg.getVolume().getRootImageUuid(), ImageVO.class)); + ImageVO ivo = dbf.findByUuid(msg.getVolume().getRootImageUuid(), ImageVO.class); + if (ivo == null) { + throw new OperationFailureException(operr("cannot reinit rootvolume [%s] because image [%s] has been deleted and imagecache cannot be found", + msg.getVolume().getUuid(), msg.getVolume().getRootImageUuid())); + } + + ImageInventory image = ImageInventory.valueOf(ivo); downloadImageCache(image, new ReturnValueCompletion(trigger) { @Override public void success(ImageCacheInventory returnValue) { @@ -1684,12 +1868,18 @@ public void fail(ErrorCode errorCode) { }); flow(new NoRollbackFlow() { - // TODO: hardcode for expon final String __name__ = "delete-origin-root-volume-which-has-no-snapshot"; + @Override + public boolean skip(Map data) { + return controller.reportCapabilities().getSnapshotCapability() + .getPlacementType() != VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL; + } + @Override public void run(FlowTrigger trigger, Map data) { boolean hasSnapshot = Q.New(VolumeSnapshotVO.class) + .eq(VolumeSnapshotVO_.volumeUuid, msg.getVolume().getUuid()) .like(VolumeSnapshotVO_.primaryStorageInstallPath, String.format("%s%%", msg.getVolume().getInstallPath())) .isExists(); if (!hasSnapshot) { @@ -1738,6 +1928,30 @@ protected void handle(AskInstallPathForNewSnapshotMsg msg) { bus.reply(msg, reply); } + @Override + protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { + GetOwningVolumePathFromInternalSnapshotReply reply = new GetOwningVolumePathFromInternalSnapshotReply(); + if (msg.getSnapshotPaths() != null) { + VolumeSnapshotCapability scap = controller.reportCapabilities().getSnapshotCapability(); + if (scap.getPlacementType() == VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL) { + Pattern pattern = Pattern.compile(scap.getVolumePathFromInternalSnapshotRegex()); + for (String snapshotPath : msg.getSnapshotPaths()) { + Matcher matcher = pattern.matcher(snapshotPath); + if (matcher.find()) { + String volumePath = matcher.group(); + reply.putOwningVolumePath(snapshotPath, volumePath); + } else { + reply.setError(operr("cannot find owning volume path from internal snapshot path[%s], " + + "because the regex[%s] does not match the snapshot path", snapshotPath, scap.getVolumePathFromInternalSnapshotRegex())); + break; + } + } + } + } + + bus.reply(msg, reply); + } + @Override protected void handle(GetPrimaryStorageResourceLocationMsg msg) { bus.reply(msg, new GetPrimaryStorageResourceLocationReply()); @@ -1750,9 +1964,13 @@ protected void handle(CheckVolumeSnapshotOperationOnPrimaryStorageMsg msg) { @Override protected void connectHook(ConnectParam param, Completion completion) { + controller.validateConfig(externalVO.getConfig()); controller.connect(externalVO.getConfig(), self.getUrl(), new ReturnValueCompletion(completion) { @Override public void success(LinkedHashMap addonInfo) { + if (param.isNewAdded()) { + controller.onFirstAdditionConfigure(new NopeCompletion()); + } SQL.New(ExternalPrimaryStorageVO.class).eq(ExternalPrimaryStorageVO_.uuid, self.getUuid()) .set(ExternalPrimaryStorageVO_.addonInfo, JSONObjectUtil.toJsonString(addonInfo)) .update(); @@ -1777,11 +1995,6 @@ public void setup() { flow(new NoRollbackFlow() { final String __name__ = "ping-storage"; - @Override - public boolean skip(Map data) { - return CoreGlobalProperty.UNIT_TEST_ON; - } - @Override public void run(FlowTrigger trigger, Map data) { controller.ping(new Completion(trigger) { @@ -1959,7 +2172,7 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } - protected void doDeleteBits(String installPath, boolean force, Completion completion) { + private void doDeleteBits(String installPath, boolean force, Completion completion) { if (force) { controller.deleteVolume(installPath, completion); } else { diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index b12d17ebe91..a8e00d3a0ad 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -1,5 +1,6 @@ package org.zstack.storage.addon.primary; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; @@ -11,6 +12,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.singleflight.MultiNodeSingleFlightImpl; +import org.zstack.core.trash.StorageTrash; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.header.Component; import org.zstack.header.apimediator.ApiMessageInterceptionException; @@ -21,12 +23,15 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.host.HostInventory; +import org.zstack.header.host.HostResizeVolumeExtensionPoint; import org.zstack.header.host.HostVO; +import org.zstack.header.host.HostResizeVolumeStruct; import org.zstack.header.managementnode.ManagementNodeChangeListener; import org.zstack.header.managementnode.ManagementNodeInventory; import org.zstack.header.message.AbstractBeforeDeliveryMessageInterceptor; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; +import org.zstack.header.storage.addon.IscsiRemoteTarget; import org.zstack.header.storage.addon.primary.*; import org.zstack.header.storage.backup.BackupStorageConstant; import org.zstack.header.storage.backup.DeleteBitsOnBackupStorageMsg; @@ -35,15 +40,21 @@ import org.zstack.header.vm.*; import org.zstack.header.vm.cdrom.VmCdRomVO; import org.zstack.header.vm.cdrom.VmCdRomVO_; +import org.zstack.header.volume.VolumeDeletionPolicyManager; import org.zstack.header.volume.VolumeInventory; import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.block.BlockVolumeVO; import org.zstack.storage.addon.backup.ExternalBackupStorageFactory; +import org.zstack.storage.primary.PrimaryStorageFeatureAllocatorExtensionPoint; import org.zstack.storage.snapshot.MarkRootVolumeAsSnapshotExtension; +import org.zstack.storage.volume.ChangeVolumeProcessingMethodExtensionPoint; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.zstack.core.Platform.argerr; @@ -53,8 +64,10 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com PreVmInstantiateResourceExtensionPoint, VmReleaseResourceExtensionPoint, VmAttachVolumeExtensionPoint, VmDetachVolumeExtensionPoint, BeforeTakeLiveSnapshotsOnVolumes, CreateTemplateFromVolumeSnapshotExtensionPoint, MarkRootVolumeAsSnapshotExtension, VmInstanceMigrateExtensionPoint, - ManagementNodeChangeListener { + ManagementNodeChangeListener, PrimaryStorageFeatureAllocatorExtensionPoint, HostResizeVolumeExtensionPoint, + VolumeSnapshotAfterDeleteExtensionPoint, ChangeVolumeProcessingMethodExtensionPoint { private static final CLogger logger = Utils.getLogger(ExternalBackupStorageFactory.class); + public static PrimaryStorageType type = new PrimaryStorageType(PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE); protected static Map controllers = new HashMap<>(); @@ -75,10 +88,13 @@ public class ExternalPrimaryStorageFactory implements PrimaryStorageFactory, Com protected CloudBus bus; @Autowired protected EventFacade evtf; + @Autowired + protected StorageTrash trash; static { type.setSupportHeartbeatFile(true); type.setSupportStorageTrash(true); + type.setSupportSharedVolume(true); } @Override @@ -453,6 +469,24 @@ private void activeVolumeIfNeed(VmInstanceInventory vm, VolumeInventory volume, svc.activate(BaseVolumeInfo.valueOf(volume), host, volume.isShareable(), new ReturnValueCompletion(completion) { @Override public void success(ActiveVolumeTO returnValue) { + VolumeVO volumeVO = dbf.findByUuid(volume.getUuid(), VolumeVO.class); + if (!(volumeVO instanceof BlockVolumeVO)) { + completion.success(); + return; + } + String uri = svc.getActivePath(BaseVolumeInfo.valueOf(volume), + host, volume.isShareable()); + IscsiRemoteTarget target = IscsiRemoteTarget.fromUri(uri); + if (target == null) { + completion.success(); + return; + } + + BlockVolumeVO blockVolumeVO = (BlockVolumeVO) volumeVO; + if (!blockVolumeVO.getIscsiPath().contains(target.getIqn())) { + blockVolumeVO.setIscsiPath(String.format("%s%s", blockVolumeVO.getIscsiPath(), target.getIqn())); + dbf.updateAndRefresh(blockVolumeVO); + } completion.success(); } @@ -949,4 +983,97 @@ public void iAmDead(ManagementNodeInventory inv) { public void iJoin(ManagementNodeInventory inv) { } + + @Override + public List allocatePrimaryStorage(Set requiredFeatures, List candidates) { + if (requiredFeatures.contains(PrimaryStorageFeature.SHARED_VOLUME)) { + List excludeCandidates = candidates.stream() + .filter(v -> PrimaryStorageConstant.EXTERNAL_PRIMARY_STORAGE_TYPE.equals(v.getType())) + .filter(v -> !(controllers.containsKey(v.getUuid()) && controllers.get(v.getUuid()).reportCapabilities().isSupportShareableVolume())) + .collect(Collectors.toList()); + + logger.info(String.format("exclude external primary storage candidates: %s for shared volume feature", excludeCandidates)); + + candidates.removeAll(excludeCandidates); + } + + return candidates; + } + + @Override + public HostResizeVolumeStruct beforeKvmHostResizeVolume(HostResizeVolumeStruct struct, VolumeInventory vol, String hostUuid) { + PrimaryStorageControllerSvc controller = controllers.get(vol.getPrimaryStorageUuid()); + if (controller == null) { + return struct; + } + + struct.setSize(controller.alignSize(struct.getSize())); + return struct; + } + + @Override + public void volumeSnapshotAfterDeleteExtensionPoint(VolumeSnapshotInventory snapshot, NoErrorCompletion completion) { + completion.done(); + } + + + @Override + public void volumeSnapshotAfterCleanUpExtensionPoint(String volumeUuid, List snapshots) { + if (CollectionUtils.isEmpty(snapshots)) { + return; + } + + String psUuid = snapshots.get(0).getPrimaryStorageUuid(); + PrimaryStorageControllerSvc controller = controllers.get(psUuid); + if (controller == null) { + return; + } + + VolumeSnapshotCapability snapCap = controller.reportCapabilities().getSnapshotCapability(); + if (snapCap.getPlacementType() != VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL) { + return; + } + + Pattern pattern = Pattern.compile(snapCap.getVolumePathFromInternalSnapshotRegex()); + Set volumeInstallPaths = snapshots.stream().map(s -> { + Matcher matcher = pattern.matcher(s.getPrimaryStorageInstallPath()); + if (matcher.find()) { + return matcher.group(); + } else { + logger.warn(String.format("cannot find volume install path from internal snapshot install path[%s] " + + "by regex[%s], skip deleting volume bits on primary storage", s.getPrimaryStorageInstallPath(), + snapCap.getVolumePathFromInternalSnapshotRegex())); + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toSet()); + + volumeInstallPaths.forEach(volumeInstallPath -> { + String details = trash.makeSureInstallPathNotUsed(volumeInstallPath, VolumeVO.class.getSimpleName()); + + if (StringUtils.isBlank(details)) { + logger.debug(String.format("delete volume[InstallPath:%s] after cleaning up snapshots", volumeInstallPath)); + DeleteVolumeBitsOnPrimaryStorageMsg msg = new DeleteVolumeBitsOnPrimaryStorageMsg(); + msg.setPrimaryStorageUuid(snapshots.get(0).getPrimaryStorageUuid()); + msg.setInstallPath(volumeInstallPath); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, snapshots.get(0).getPrimaryStorageUuid()); + bus.send(msg); + } + }); + } + + @Override + public VolumeDeletionPolicyManager.VolumeDeletionPolicy getTransientVolumeDeletionPolicy(VolumeInventory transientVolume) { + PrimaryStorageControllerSvc controllerSvc = controllers.get(transientVolume.getPrimaryStorageUuid()); + if (controllerSvc == null || controllerSvc.reportCapabilities().getSnapshotCapability() + .getPlacementType() != VolumeSnapshotCapability.VolumeSnapshotPlacementType.INTERNAL) { + return null; + } + + boolean hasSnapshots = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.primaryStorageUuid, transientVolume.getPrimaryStorageUuid()) + .like(VolumeSnapshotVO_.primaryStorageInstallPath, String.format("%s@%%", transientVolume.getInstallPath())).isExists(); + if (!hasSnapshots) { + return VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct; + } + return VolumeDeletionPolicyManager.VolumeDeletionPolicy.DBOnly; + } } diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java b/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java index 2fafa766f4b..ca9b35898fc 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStorageBase.java @@ -14,6 +14,7 @@ import org.zstack.core.cloudbus.EventFacade; import org.zstack.core.config.GlobalConfigFacade; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.db.SQL; import org.zstack.core.db.TransactionalCallback; import org.zstack.core.errorcode.ErrorFacade; @@ -33,9 +34,7 @@ import org.zstack.header.errorcode.ErrorCodeList; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; -import org.zstack.header.image.CancelDownloadImageMsg; -import org.zstack.header.image.ImageConstant; -import org.zstack.header.image.ImageVO; +import org.zstack.header.image.*; import org.zstack.header.message.APIDeleteMessage; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; @@ -51,6 +50,7 @@ import javax.persistence.LockModeType; import javax.persistence.Query; +import javax.persistence.TypedQuery; import java.net.URISyntaxException; import java.util.*; @@ -324,9 +324,42 @@ private void handleBase(CancelDownloadImageMsg msg) { } private void handleBase(DeleteBitsOnBackupStorageMsg msg) { - checkState(msg); - checkStatus(msg); - handle(msg); + thdf.chainSubmit(new ChainTask(msg) { + @Override + public String getSyncSignature() { + return String.format("delete-%s-on-backup-storage-%s", msg.getInstallPath(), msg.getBackupStorageUuid()); + } + + @Override + public void run(SyncTaskChain chain) { + checkState(msg); + checkStatus(msg); + + if (!bitsCanDelete(msg.getInstallPath(), msg.getBackupStorageUuid())) { + final DeleteBitsOnBackupStorageReply reply = new DeleteBitsOnBackupStorageReply(); + logger.debug(String.format("cannot delete %s on backup storage %s because it is still referenced by " + + "other images", msg.getInstallPath(), msg.getBackupStorageUuid())); + + bus.reply(msg, reply); + chain.next(); + return; + } + + handle(msg); + chain.next(); + } + + @Override + public String getName() { + return String.format("delete-image-%s-on-backup-storage-%s", msg.getInstallPath(), msg.getBackupStorageUuid()); + } + }); + } + + private boolean bitsCanDelete(String installPath, String bsUuid) { + return !Q.New(ImageBackupStorageRefVO.class) + .eq(ImageBackupStorageRefVO_.installPath, installPath) + .eq(ImageBackupStorageRefVO_.backupStorageUuid, bsUuid).isExists(); } @Transactional diff --git a/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java b/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java index d338026429e..c4e35a38ca2 100755 --- a/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java +++ b/storage/src/main/java/org/zstack/storage/backup/BackupStoragePingTracker.java @@ -9,7 +9,7 @@ import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatch; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.managementnode.ManagementNodeChangeListener; diff --git a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java new file mode 100644 index 00000000000..47f557c8f10 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleanParam.java @@ -0,0 +1,15 @@ +package org.zstack.storage.primary; + +public class ImageCacheCleanParam { + public boolean triggerByApi; + public boolean includeReadyImage; + + public ImageCacheCleanParam() { + + } + + public ImageCacheCleanParam(boolean triggerByApi, boolean includeReadyImage) { + this.triggerByApi = triggerByApi; + this.includeReadyImage = includeReadyImage; + } +} diff --git a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java index 98f22742abf..8aab976bf7c 100755 --- a/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java +++ b/storage/src/main/java/org/zstack/storage/primary/ImageCacheCleaner.java @@ -80,11 +80,7 @@ protected GlobalConfig cleanupIntervalConfig() { return PrimaryStorageGlobalConfig.IMAGE_CACHE_GARBAGE_COLLECTOR_INTERVAL; } - public void cleanup(boolean needDestinationCheck) { - cleanup(null, needDestinationCheck); - } - - public void cleanup(String psUuid, boolean needDestinationCheck) { + public void cleanup(String psUuid, ImageCacheCleanParam param) { ImageCacheCleaner self = this; thdf.chainSubmit(new ChainTask(null) { @Override @@ -94,7 +90,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { - doCleanup(psUuid, needDestinationCheck, new NoErrorCompletion() { + doCleanup(psUuid, param, new NoErrorCompletion() { @Override public void done() { chain.next(); @@ -109,19 +105,18 @@ public String getName() { }); } - protected void cleanUpVolumeCache(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { - List shadowVOs = createShadowImageCacheVOs(psUuid); + protected void cleanUpVolumeCache(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { + List shadowVOs = createShadowImageCacheVOs(psUuid, param); if (shadowVOs == null || shadowVOs.isEmpty()) { completion.done(); return; } - new While<>(shadowVOs).each((vo, whileCompletion) -> { - if (needDestinationCheck && !destMaker.isManagedByUs(vo.getImageUuid())) { - whileCompletion.done(); - return; - } + if (!param.triggerByApi) { + shadowVOs.removeIf(vo -> !destMaker.isManagedByUs(vo.getImageUuid())); + } + new While<>(shadowVOs).each((vo, whileCompletion) -> { DeleteImageCacheOnPrimaryStorageMsg msg = new DeleteImageCacheOnPrimaryStorageMsg(); msg.setImageUuid(vo.getImageUuid()); msg.setInstallPath(vo.getInstallUrl()); @@ -175,7 +170,7 @@ public void done(ErrorCodeList errorCodeList) { }); } - protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCompletion completion) { + protected void doCleanup(String psUuid, ImageCacheCleanParam param, NoErrorCompletion completion) { List psUuids = new ArrayList<>(); if (psUuid == null) { psUuids.addAll(listPrimaryStoragesBySelfType()); @@ -188,7 +183,7 @@ protected void doCleanup(String psUuid, boolean needDestinationCheck, NoErrorCom chain.then(new NoRollbackFlow() { @Override public void run(FlowTrigger trigger, Map data) { - cleanUpVolumeCache(psUuid, needDestinationCheck, new NoErrorCompletion() { + cleanUpVolumeCache(psUuid, param, new NoErrorCompletion() { @Override public void done() { trigger.next(); @@ -283,13 +278,13 @@ public String getName() { @Override public void run() { - cleanup(true); + cleanup(null, new ImageCacheCleanParam(false, false)); } }); } @Transactional - protected List getStaleImageCacheIds(String psUuid) { + protected boolean volumeFindMissingImageUuid(String psUuid) { String sql; if (psUuid == null) { sql = "select count(*) from VolumeVO vol, PrimaryStorageVO pri where vol.primaryStorageUuid = pri.uuid" + @@ -312,11 +307,55 @@ protected List getStaleImageCacheIds(String psUuid) { "1. zstack-ctl stop_node\n" + "2. zstack-ctl start_node -DfixImageCacheUuid=true -DrootVolumeFindMissingImageUuid=true\n" + "to fix the problem. For the data safety, we won't clean the image cache of the primary storage", count, getPrimaryStorageType())); + return true; + } + + return false; + } + + /*** + * + * @param psUuid image cache to be cleaned up on the primary storage, if null, clean up same type of primary storage + * @return image cache ids whose image is expunged + */ + @Transactional + protected List getStaleImageCacheIds(String psUuid, boolean includeReadyImage) { + if (volumeFindMissingImageUuid(psUuid)) { return null; } + List ids; + if (includeReadyImage) { + ids = queryCacheOfAllImage(psUuid); + } else { + ids = queryCacheOfExpungedImage(psUuid); + } + + return VolumeSnapshotReferenceUtils.filterStaleImageCache(ids); + } + + private List queryCacheOfAllImage(String psUuid) { + if (psUuid == null) { + String sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri" + + " where c.primaryStorageUuid = pri.uuid" + + " and pri.type = :ptype"; + return SQL.New(sql, Long.class) + .param("ptype", getPrimaryStorageType()) + .list(); + } else { + return Q.New(ImageCacheVO.class).eq(ImageCacheVO_.primaryStorageUuid, psUuid) + .select(ImageCacheVO_.id).listValues(); + } + } + + private List queryCacheOfExpungedImage(String psUuid) { + String sql; if (psUuid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype"; + sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i" + + " where c.primaryStorageUuid = pri.uuid" + + " and i.uuid = c.imageUuid" + + " and i.deleted is not null" + + " and pri.type = :ptype"; } else { sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype and pri.uuid = :psUuid"; } @@ -342,83 +381,42 @@ protected List getStaleImageCacheIds(String psUuid) { cq.setParameter("psUuid", psUuid); } deleted.addAll(cq.getResultList()); - - if (deleted.isEmpty()) { - return null; - } - - return VolumeSnapshotReferenceUtils.filterStaleImageCache(deleted); + return deleted; } - @Transactional - protected List getStaleImageCacheIdsForLocalStorage(String psUuid) { - String sql; - Long count; - if (psUuid == null) { - sql = "select count(*) from VolumeVO vol, PrimaryStorageVO pri where vol.primaryStorageUuid = pri.uuid" + - " and vol.type = :volType and vol.rootImageUuid is null and pri.type = :psType"; - count = SQL.New(sql).param("volType", VolumeType.Root).param("psType", getPrimaryStorageType()).find(); - - } else { - sql = "select count(*) from VolumeVO vol, PrimaryStorageVO pri where vol.primaryStorageUuid = pri.uuid" + - " and vol.type = :volType and vol.rootImageUuid is null and pri.type = :psType and pri.uuid = :psUuid"; - count = SQL.New(sql).param("volType", VolumeType.Root).param("psType", getPrimaryStorageType()).param("psUuid", psUuid).find(); - } - - if (count != 0) { - logger.warn(String.format("found %s volumes on the primary storage[type:%s] has NULL rootImageUuid. Please do following:\n" + - "1. zstack-ctl stop_node\n" + - "2. zstack-ctl start_node -DfixImageCacheUuid=true -DrootVolumeFindMissingImageUuid=true\n" + - "to fix the problem. For the data safety, we won't clean the image cache of the primary storage", count, getPrimaryStorageType())); - return null; - } - - List deleted; - if (psUuid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype"; - deleted=SQL.New(sql).param("ptype", getPrimaryStorageType()).list(); - } else { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri, ImageEO i where c.primaryStorageUuid = pri.uuid and i.uuid = c.imageUuid and i.deleted is not null and pri.type = :ptype and pri.uuid = :psUuid"; - deleted=SQL.New(sql).param("ptype", getPrimaryStorageType()).param("psUuid", psUuid).list(); - } - - if (psUuid == null) { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + - " c.primaryStorageUuid = pri.uuid and pri.type = :psType"; - deleted.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).list()); - } else { - sql = "select c.id from ImageCacheVO c, PrimaryStorageVO pri where c.imageUuid not in (select vm.imageUuid from VmInstanceVO vm) and" + - " c.primaryStorageUuid = pri.uuid and pri.type = :psType and pri.uuid = :psUuid"; - deleted.addAll(SQL.New(sql).param("psType", getPrimaryStorageType()).param("psUuid", psUuid).list()); - } - - if (deleted.isEmpty()) { - return null; - } - - return VolumeSnapshotReferenceUtils.filterStaleImageCache(deleted); - } @Transactional - protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid) { - List staleImageCacheIds = getStaleImageCacheIds(psUuid); + protected List createShadowImageCacheVOsForNewDeletedAndOld(String psUuid, ImageCacheCleanParam param) { + // 1. image has been deleted + List staleImageCacheIds = getStaleImageCacheIds(psUuid, false); if (staleImageCacheIds == null || staleImageCacheIds.isEmpty()) { return null; } - String sql = "select c from ImageCacheVO c where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol where vol.rootImageUuid is not null) and c.id in (:ids)"; - TypedQuery cq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); + // 2. no volume refers to the image + String sql = "select c.id from ImageCacheVO c" + + " where c.imageUuid not in (select vol.rootImageUuid from VolumeVO vol where vol.rootImageUuid is not null)" + + " and c.id in (:ids)"; + TypedQuery cq = dbf.getEntityManager().createQuery(sql, Long.class); cq.setParameter("ids", staleImageCacheIds); - List stale = cq.getResultList(); + staleImageCacheIds = cq.getResultList(); - if (stale.isEmpty()) { + if (staleImageCacheIds.isEmpty()) { return null; } + // 3. no volume snapshot tree refers to the image + sql = "select c from ImageCacheVO c" + + " where c.imageUuid not in (select tree.rootImageUuid from VolumeSnapshotTreeVO tree where tree.rootImageUuid is not null)" + + " and c.id in (:ids)"; + TypedQuery tq = dbf.getEntityManager().createQuery(sql, ImageCacheVO.class); + tq.setParameter("ids", staleImageCacheIds); + List stales = tq.getResultList(); + logger.debug(String.format("found %s stale images in cache on the primary storage[type:%s], they are about to be cleaned up", - stale.size(), getPrimaryStorageType())); + stales.size(), getPrimaryStorageType())); - for (ImageCacheVO vo : stale) { + for (ImageCacheVO vo : stales) { dbf.getEntityManager().persist(new ImageCacheShadowVO(vo)); dbf.getEntityManager().remove(vo); } @@ -430,8 +428,8 @@ protected List createShadowImageCacheVOsForNewDeletedAndOld( } @Transactional - protected List createShadowImageCacheVOs(String psUuid) { - List newDeletedAndOld = createShadowImageCacheVOsForNewDeletedAndOld(psUuid); + protected List createShadowImageCacheVOs(String psUuid, ImageCacheCleanParam param) { + List newDeletedAndOld = createShadowImageCacheVOsForNewDeletedAndOld(psUuid, param); if (newDeletedAndOld == null) { // no new deleted images, let's check if there any old that failed to be deleted last time String sql = "select s from ImageCacheShadowVO s, PrimaryStorageVO p where p.uuid = s.primaryStorageUuid and p.type = :ptype"; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java index 42bc1a5a57f..a5011877ba3 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java @@ -413,6 +413,8 @@ protected void handleLocalMessage(Message msg) { handle((DeleteVolumeChainOnPrimaryStorageMsg) msg); } else if (msg instanceof CleanUpStorageTrashOnPrimaryStorageMsg) { handle((CleanUpStorageTrashOnPrimaryStorageMsg)msg); + } else if (msg instanceof GetOwningVolumePathFromInternalSnapshotMsg) { + handle((GetOwningVolumePathFromInternalSnapshotMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -500,6 +502,7 @@ protected void handle(final CheckInstallPathInTrashMsg msg) { reply.setTrashId(trashId); reply.setResourceUuid(inv.getResourceUuid()); } + reply.setRelatedTrashPaths(trash.findTrashInstallPath(msg.getInstallPath(), self.getUuid())); bus.reply(msg, reply); } @@ -757,6 +760,7 @@ public void run(MessageReply reply) { r2.getVolume().getInstallPath(), msg.getBackupStorageRef().getInstallPath()) ); + r.setProtocol(r2.getVolume().getProtocol()); } bus.reply(msg, r); } @@ -1761,6 +1765,11 @@ protected void handle(UnlinkBitsOnPrimaryStorageMsg msg) { bus.reply(msg, reply); }; + protected void handle(GetOwningVolumePathFromInternalSnapshotMsg msg) { + GetOwningVolumePathFromInternalSnapshotReply reply = new GetOwningVolumePathFromInternalSnapshotReply(); + bus.reply(msg, reply); + } + // don't attach any cluster public boolean isUnmounted() { long count = Q.New(PrimaryStorageClusterRefVO.class) diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java index efaeca67a15..280e902fb4e 100644 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageCapacityChecker.java @@ -8,6 +8,8 @@ import org.zstack.header.storage.primary.PrimaryStorageCapacityVO_; import org.zstack.header.storage.primary.PrimaryStorageOverProvisioningManager; import org.zstack.utils.SizeUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; /** * Created by MaJin on 2021/7/21. @@ -15,6 +17,8 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageCapacityChecker { + private CLogger logger = Utils.getLogger(PrimaryStorageCapacityChecker.class); + @Autowired protected PrimaryStorageOverProvisioningManager psRatioMgr; @Autowired @@ -69,6 +73,17 @@ public boolean checkIncreasedAndTotalRequiredSize(long increasedRequiredSize, lo boolean physicalCapacityMeetTotalRequiredSizeByRatio = physicalCapacityMgr .checkRequiredCapacityByRatio(primaryStorageUuid, totalPhysicalCapacity, totalRequiredSize); + if (logger.isTraceEnabled()) { + logger.trace(String.format("Check required size result:" + + " availableCapacityMeetIncreaseSizeByRatio: %s," + + " physicalCapacityHasFreeSpaceByRatio: %s," + + " physicalCapacityMeetTotalRequiredSizeByRatio: %s", + availableCapacityMeetIncreaseSizeByRatio, + physicalCapacityHasFreeSpaceByRatio, + physicalCapacityMeetTotalRequiredSizeByRatio) + ); + } + return availableCapacityMeetIncreaseSizeByRatio && physicalCapacityHasFreeSpaceByRatio && physicalCapacityMeetTotalRequiredSizeByRatio; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java new file mode 100644 index 00000000000..da53a4da48b --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorExtensionPoint.java @@ -0,0 +1,15 @@ +package org.zstack.storage.primary; + +import org.zstack.header.storage.primary.PrimaryStorageFeature; +import org.zstack.header.storage.primary.PrimaryStorageVO; + +import java.util.List; +import java.util.Set; + +/** + * @ Author : yh.w + * @ Date : Created in 10:49 2025/7/15 + */ +public interface PrimaryStorageFeatureAllocatorExtensionPoint { + List allocatePrimaryStorage(Set requiredFeatures, List candidates); +} diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java new file mode 100644 index 00000000000..ff6cc9376ff --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageFeatureAllocatorFlow.java @@ -0,0 +1,58 @@ +package org.zstack.storage.primary; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.core.workflow.FlowTrigger; +import org.zstack.header.core.workflow.NoRollbackFlow; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.storage.primary.PrimaryStorageAllocationSpec; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageVO; + +import java.util.List; +import java.util.Map; + +import static org.zstack.core.Platform.operr; + +/** + * @ Author : yh.w + * @ Date : Created in 18:41 2025/7/14 + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class PrimaryStorageFeatureAllocatorFlow extends NoRollbackFlow { + @Autowired + private PluginRegistry pluginRgty; + + protected final List featureExtensions = pluginRgty.getExtensionList(PrimaryStorageFeatureAllocatorExtensionPoint.class);; + + @Override + public void run(FlowTrigger trigger, Map data) { + PrimaryStorageAllocationSpec spec = (PrimaryStorageAllocationSpec) data.get(PrimaryStorageConstant.AllocatorParams.SPEC); + List candidates = (List) data.get(PrimaryStorageConstant.AllocatorParams.CANDIDATES); + List ret; + for (PrimaryStorageFeatureAllocatorExtensionPoint extp : featureExtensions) { + ret = extp.allocatePrimaryStorage(spec.getRequiredFeatures(), candidates); + if (ret == null) { + continue; + } + + if (ret.isEmpty()) { + throw new OperationFailureException(operr("PrimaryStorageFeatureAllocatorFlow[%s] returns zero primary storage candidate", extp.getClass().getName())); + } + + candidates = ret; + } + + data.put(PrimaryStorageConstant.AllocatorParams.CANDIDATES, candidates); + trigger.next(); + } + + @Override + public boolean skip(Map data) { + PrimaryStorageAllocationSpec spec = (PrimaryStorageAllocationSpec) data.get(PrimaryStorageConstant.AllocatorParams.SPEC); + return CollectionUtils.isEmpty(spec.getRequiredFeatures()); + } +} diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java index a5c4c6242ef..9d80582f268 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageMainAllocatorFlow.java @@ -15,6 +15,7 @@ import org.zstack.header.storage.backup.BackupStorageVO; import org.zstack.header.storage.primary.*; import org.zstack.header.storage.primary.PrimaryStorageConstant.AllocatorParams; +import org.zstack.storage.addon.primary.ExternalPrimaryStorage; import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.function.Function; @@ -32,7 +33,7 @@ */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageMainAllocatorFlow extends NoRollbackFlow { - private static CLogger logger = Utils.getLogger(PrimaryStorageMainAllocatorFlow.class); + private static final CLogger logger = Utils.getLogger(PrimaryStorageMainAllocatorFlow.class); @Autowired protected DatabaseFacade dbf; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java index 56ef7ef3a3e..965747050ef 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageManagerImpl.java @@ -78,7 +78,7 @@ public class PrimaryStorageManagerImpl extends AbstractService implements PrimaryStorageManager, ManagementNodeChangeListener, ManagementNodeReadyExtensionPoint, VmInstanceStartExtensionPoint, VmInstanceCreateExtensionPoint, InstanceOfferingUserConfigValidator, DiskOfferingUserConfigValidator, - PrimaryStorageSortExtensionPoint { + PrimaryStorageSortExtensionPoint, PrimaryStorageFeatureAllocatorExtensionPoint { private static final CLogger logger = Utils.getLogger(PrimaryStorageManager.class); @Autowired @@ -827,6 +827,7 @@ private String getAllocateStrategyFromMsg(AllocatePrimaryStorageMsg msg) { private PrimaryStorageAllocationSpec buildAllocateSpecFromMsg(AllocatePrimaryStorageMsg msg) { PrimaryStorageAllocationSpec spec = new PrimaryStorageAllocationSpec(); spec.setPossiblePrimaryStorageTypes(msg.getPossiblePrimaryStorageTypes()); + spec.setRequiredFeatures(msg.getRequiredFeatures()); spec.setExcludePrimaryStorageTypes(msg.getExcludePrimaryStorageTypes()); spec.setImageUuid(msg.getImageUuid()); spec.setDiskOfferingUuid(msg.getDiskOfferingUuid()); @@ -1023,6 +1024,18 @@ public void sort(List primaryStorageVOS, VmInstanceSpec.ImageS strategy.sort(allocationSpec, primaryStorageVOS); } + @Override + public List allocatePrimaryStorage(Set requiredFeatures, List candidates) { + if (requiredFeatures.contains(PrimaryStorageFeature.SHARED_VOLUME)) { + candidates = candidates.stream() + .filter(v -> PrimaryStorageType.getSupportFeaturesTypes(PrimaryStorageType::isSupportSharedVolume) + .contains(v.getType())) + .collect(Collectors.toList()); + } + + return candidates; + } + class AutoDeleteTrashTask { Future runnable; PeriodicTask task; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java index f5464f71e48..697c94319c7 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStoragePingTracker.java @@ -6,7 +6,7 @@ import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigUpdateExtensionPoint; import org.zstack.core.db.SQLBatch; -import org.zstack.core.tacker.PingTracker; +import org.zstack.core.tracker.PingTracker; import org.zstack.header.managementnode.ManagementNodeChangeListener; import org.zstack.header.managementnode.ManagementNodeInventory; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java index 529d9fbb3c2..01a316be593 100644 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortByAvailablePhysicalCapacityFlow.java @@ -22,7 +22,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageSortByAvailablePhysicalCapacityFlow extends NoRollbackFlow { - private static CLogger logger = Utils.getLogger(PrimaryStorageSortByAvailablePhysicalCapacityFlow.class); + private static final CLogger logger = Utils.getLogger(PrimaryStorageSortByAvailablePhysicalCapacityFlow.class); @Override diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java index 127c29a6aba..be1b234202c 100644 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageSortFlow.java @@ -23,7 +23,7 @@ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PrimaryStorageSortFlow extends NoRollbackFlow { - private static CLogger logger = Utils.getLogger(PrimaryStorageSortFlow.class); + private static final CLogger logger = Utils.getLogger(PrimaryStorageSortFlow.class); @Autowired protected PrimaryStoragePriorityGetter priorityGetter; diff --git a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java index c708dbc66de..26595c4b199 100755 --- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java +++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageTagAllocatorFlow.java @@ -38,13 +38,8 @@ public class PrimaryStorageTagAllocatorFlow extends NoRollbackFlow { @Autowired private PluginRegistry pluginRgty; - protected static List tagExtensions; + protected final List tagExtensions = pluginRgty.getExtensionList(PrimaryStorageTagAllocatorExtensionPoint.class);; - public PrimaryStorageTagAllocatorFlow() { - if (tagExtensions == null) { - tagExtensions = pluginRgty.getExtensionList(PrimaryStorageTagAllocatorExtensionPoint.class); - } - } @Override public void run(FlowTrigger trigger, Map data) { diff --git a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java new file mode 100644 index 00000000000..e2a4adf8dd8 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotGC.java @@ -0,0 +1,48 @@ +package org.zstack.storage.snapshot; + +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.gc.GC; +import org.zstack.core.gc.GCCompletion; +import org.zstack.core.gc.TimeBasedGarbageCollector; +import org.zstack.header.message.MessageReply; +import org.zstack.header.storage.primary.DeleteSnapshotOnPrimaryStorageMsg; +import org.zstack.header.storage.primary.PrimaryStorageConstant; +import org.zstack.header.storage.primary.PrimaryStorageInventory; +import org.zstack.header.storage.primary.PrimaryStorageVO; +import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +public class DeleteVolumeSnapshotGC extends TimeBasedGarbageCollector { + @GC + public String primaryStorageUuid; + @GC + public VolumeSnapshotInventory volumeSnapshot; + @GC + public String fullInstallUrl; + + private static final CLogger logger = Utils.getLogger(DeleteVolumeSnapshotGC.class); + + @Override + protected void triggerNow(GCCompletion completion) { + if (!dbf.isExist(primaryStorageUuid, PrimaryStorageVO.class)) { + completion.cancel(); + return; + } + + DeleteSnapshotOnPrimaryStorageMsg msg = new DeleteSnapshotOnPrimaryStorageMsg(); + msg.setSnapshot(volumeSnapshot); + bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, primaryStorageUuid); + bus.send(msg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + completion.fail(reply.getError()); + return; + } + + completion.success(); + } + }); + } +} diff --git a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java index 6bc15670a42..1b7864807d5 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/DeleteVolumeSnapshotLongJob.java @@ -42,6 +42,8 @@ public void start(LongJobVO job, ReturnValueCompletion completion) { msg.setVolumeUuid(apiMessage.getSnapshotUuid()); msg.setSnapshotUuid(apiMessage.getSnapshotUuid()); msg.setDeletionMode(apiMessage.getDeletionMode()); + msg.setDirection(apiMessage.getDirection()); + msg.setScope(apiMessage.getScope()); bus.makeTargetServiceIdByResourceUuid(msg, VolumeSnapshotConstant.SERVICE_ID, getRoutedMnId(apiMessage)); bus.send(msg, new CloudBusCallBack(completion) { @Override diff --git a/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java b/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java index 5c1af6a932e..2dd1aa5a5ab 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/RevertVolumeSnapshotLongJob.java @@ -18,6 +18,7 @@ import org.zstack.header.message.APIEvent; import org.zstack.header.message.MessageReply; import org.zstack.header.storage.snapshot.*; +import org.zstack.header.volume.VolumeConstant; import org.zstack.header.volume.VolumeVO; import org.zstack.longjob.LongJobUtils; import org.zstack.utils.gson.JSONObjectUtil; @@ -45,7 +46,13 @@ public void start(LongJobVO job, ReturnValueCompletion completion) { msg.setTreeUuid(apiMessage.getTreeUuid()); msg.setSession(apiMessage.getSession()); bus.makeServiceIdByManagementNodeId(msg, VolumeSnapshotConstant.SERVICE_ID, getRoutedMnId(apiMessage)); - bus.send(msg, new CloudBusCallBack(completion) { + + + VolumeSnapshotRevertOverlayVolumeMsg omsg = new VolumeSnapshotRevertOverlayVolumeMsg(); + omsg.setVolumeUuid(msg.getVolumeUuid()); + omsg.setMessage(msg); + bus.makeTargetServiceIdByResourceUuid(omsg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid()); + bus.send(omsg, new CloudBusCallBack(completion) { @Override public void run(MessageReply reply) { auditResourceUuid = msg.getVolumeUuid(); diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java index 2195fb7576a..4a4ae42f1a4 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotBase.java @@ -11,6 +11,7 @@ import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.gc.GCGlobalConfig; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.core.Completion; @@ -222,17 +223,7 @@ private void handle(final VolumeSnapshotPrimaryStorageDeletionMsg msg) { chain.then(new ShareFlow() { private void finish() { new While<>(pluginRgty.getExtensionList(VolumeSnapshotAfterDeleteExtensionPoint.class)).all((ext, c) -> { - ext.volumeSnapshotAfterDeleteExtensionPoint(sp, new Completion(c) { - @Override - public void success() { - c.done(); - } - - @Override - public void fail(ErrorCode errorCode) { - c.done(); - } - }); + ext.volumeSnapshotAfterDeleteExtensionPoint(sp, c); }).run(new WhileDoneCompletion(msg) { @Override public void done(ErrorCodeList errorCodeList) { @@ -259,13 +250,6 @@ private void updateDb() { } private void errors(ErrorCode errorCode) { - CollectionUtils.safeForEach(pluginRgty.getExtensionList(VolumeSnapshotAfterDeleteExtensionPoint.class), new ForEachFunction() { - @Override - public void run(VolumeSnapshotAfterDeleteExtensionPoint arg) { - arg.volumeSnapshotAfterFailedDeleteExtensionPoint(sp); - } - }); - VolumeSnapshotPrimaryStorageDeletionReply dreply = new VolumeSnapshotPrimaryStorageDeletionReply(); dreply.setError(errorCode); bus.reply(msg, dreply); @@ -279,6 +263,7 @@ public void setup() { public void run(final FlowTrigger trigger, Map data) { DeleteSnapshotOnPrimaryStorageMsg dmsg = new DeleteSnapshotOnPrimaryStorageMsg(); dmsg.setSnapshot(getSelfInventory()); + dmsg.setGcOnFailure(true); bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); bus.send(dmsg, new CloudBusCallBack(trigger) { @Override @@ -318,7 +303,7 @@ public void handle(Map data) { error(new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { - // TODO GC + // primary storage handle gc by itself, and reply success. the flow chain will always succeed. if (VolumeSnapshotErrors.FULL_SNAPSHOT_ERROR.toString().equals(errCode.getCode())) { errors(errCode); } else { diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java index 2c5def975d0..9128094ffdf 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotCascadeExtension.java @@ -68,7 +68,8 @@ public void asyncCascade(CascadeAction action, Completion completion) { private void handleDeletionCleanup(CascadeAction action, Completion completion) { try { if (VolumeSnapshotVO.class.getSimpleName().equals(action.getParentIssuer())) { - List sinvs = action.getParentIssuerContext(); + VolumeSnapshotDeletionStructs structs = action.getParentIssuerContext(); + List sinvs = structs.getSnapshotInventories(); sinvs.forEach(s -> dbf.eoCleanup(VolumeSnapshotVO.class, s.getUuid())); } else { dbf.eoCleanup(VolumeSnapshotVO.class); @@ -83,7 +84,7 @@ private void handleDeletionCleanup(CascadeAction action, Completion completion) } } - private static VolumeSnapshotDeletionMsg buildMsg(final String suuid, boolean volumeDeletion) { + private static VolumeSnapshotDeletionMsg buildMsg(final String suuid, String direction, String scope, boolean volumeDeletion) { Tuple t = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, suuid) .select(VolumeSnapshotVO_.volumeUuid, VolumeSnapshotVO_.treeUuid) .findTuple(); @@ -96,11 +97,13 @@ private static VolumeSnapshotDeletionMsg buildMsg(final String suuid, boolean vo msg.setTreeUuid(treeUuid); msg.setVolumeUuid(volumeUuid); msg.setVolumeDeletion(volumeDeletion); + msg.setDirection(direction); + msg.setScope(scope); return msg; } - private VolumeSnapshotDeletionMsg makeMsg(final String suuid, boolean volumeDeletion) { - VolumeSnapshotDeletionMsg msg = buildMsg(suuid, volumeDeletion); + private VolumeSnapshotDeletionMsg makeMsg(final String suuid, String direction, String scope, boolean volumeDeletion) { + VolumeSnapshotDeletionMsg msg = buildMsg(suuid, direction, scope, volumeDeletion); setTargetServiceId(msg); return msg; } @@ -118,9 +121,11 @@ private void handleDeletion(final CascadeAction action, final Completion complet msgs.addAll(handleVolumeDeletion(vol)); } } else if (VolumeSnapshotVO.class.getSimpleName().equals(action.getParentIssuer())) { - List sinvs = action.getParentIssuerContext(); + VolumeSnapshotDeletionStructs struct = action.getParentIssuerContext(); + List sinvs = struct.getSnapshotInventories(); + for (VolumeSnapshotInventory sinv : sinvs) { - msgs.add(handleSnapshotDeletion(sinv)); + msgs.add(handleSnapshotDeletion(sinv, struct.getDirection(), struct.getScope())); } } @@ -190,8 +195,8 @@ public void done(ErrorCodeList errorCodeList) { }); } - private VolumeSnapshotDeletionMsg handleSnapshotDeletion(VolumeSnapshotInventory sinv) { - return makeMsg(sinv.getUuid(), false); + private VolumeSnapshotDeletionMsg handleSnapshotDeletion(VolumeSnapshotInventory sinv, String direction, String scope) { + return makeMsg(sinv.getUuid(), direction, scope, false); } private List handleVolumeDeletion(VolumeDeletionStruct vol) { @@ -213,8 +218,8 @@ static List handleVolumeExpunge(String volumeUuid) { .getDirectReferencedSnapshotUuidsGroupByTree(volumeUuid); return cuuids.stream().flatMap(it -> - getDeletableSnapshotUuidOnVolumeExpunge(it, referenceSnapshotTrees.get(it)).stream()) - .map(it -> buildMsg(it, true)) + getDeletableSnapshotUuidOnVolumeExpunge(it, referenceSnapshotTrees.get(it)).stream()) + .map(it -> buildMsg(it, DeleteVolumeSnapshotDirection.Pull.toString(), DeleteVolumeSnapshotScope.Chain.toString(), true)) .collect(Collectors.toList()); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java index 9948dbdf738..0ca0b3191ee 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotGlobalConfig.java @@ -1,5 +1,6 @@ package org.zstack.storage.snapshot; +import org.zstack.core.GlobalProperty; import org.zstack.core.config.GlobalConfig; import org.zstack.core.config.GlobalConfigDef; import org.zstack.core.config.GlobalConfigDefinition; @@ -23,4 +24,14 @@ public class VolumeSnapshotGlobalConfig { @GlobalConfigValidation(validValues = {"true", "false"}) @GlobalConfigDef(defaultValue = "false", type = Boolean.class, description = "effective count with detached volumes") public static GlobalConfig EFFECTIVE_COUNT_WITH_DETACHED_VOLUMES = new GlobalConfig(CATEGORY, "effectiveCount.withDetachedVolumes"); + + @GlobalConfigValidation(numberGreaterThan = 0) + @GlobalConfigDef(defaultValue = "10", type = Integer.class, description = "Percentage of additional space reserved when creating a logical volume for memory snapshot.") + public static GlobalConfig MEMORY_SNAPSHOT_VOLUME_BUFFER_PERCENT = new GlobalConfig(CATEGORY, "memorySnapshotVolume.BufferPercent"); + + @GlobalConfigValidation(validValues = {"true", "false"}) + public static GlobalConfig ENABLE_FAST_REVERT = new GlobalConfig(CATEGORY, "enable.fast.revert"); + + @GlobalConfigValidation(inNumberRange = {1, 10}) + public static GlobalConfig SNAPSHOT_GROUP_REVERT_CONCURRENCY = new GlobalConfig(CATEGORY, "snapshot.group.revert.concurrency"); } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java index c75a6545025..7488f23e178 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java @@ -17,10 +17,7 @@ import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.AbstractService; -import org.zstack.header.core.Completion; -import org.zstack.header.core.ExceptionSafe; -import org.zstack.header.core.NopeCompletion; -import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.*; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; @@ -36,8 +33,6 @@ import org.zstack.header.storage.snapshot.*; import org.zstack.header.storage.snapshot.group.*; import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceMessage; -import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceVO; -import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceVO_; import org.zstack.header.vm.*; import org.zstack.header.vm.devices.VmInstanceDeviceManager; import org.zstack.header.volume.*; @@ -283,7 +278,8 @@ private void handle(APIBatchDeleteVolumeSnapshotMsg msg) { final String issuer = VolumeSnapshotVO.class.getSimpleName(); List vos = Q.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, ancestorMap.keySet()).list(); - final List ctx = VolumeSnapshotInventory.valueOf(vos); + VolumeSnapshotDeletionStructs ctx = new VolumeSnapshotDeletionStructs( + VolumeSnapshotInventory.valueOf(vos), DeleteVolumeSnapshotDirection.Pull.toString(), DeleteVolumeSnapshotScope.Chain.toString()); FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("batch-delete-snapshots-%s", msg.getUuids())); @@ -351,7 +347,7 @@ public void fail(ErrorCode errorCode) { public void handle(Map data) { reportProgress("95"); casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion()); - ctx.stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) + ctx.getSnapshotInventories().stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) .forEach(inventory -> { new FireSnapShotCanonicalEvent() .fireSnapShotStatusChangedEvent(VolumeSnapshotStatus.valueOf(inventory.getStatus()), inventory); @@ -383,7 +379,7 @@ public void handle(ErrorCode errCode, Map data) { } handleErrorCode((ErrorCodeList) errCode); event.setResults(new ArrayList<>(results.values())); - ctx.stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) + ctx.getSnapshotInventories().stream().filter(inventory -> results.containsKey(inventory.getUuid()) && results.get(inventory.getUuid()).isSuccess()) .forEach(inventory -> { new FireSnapShotCanonicalEvent() .fireSnapShotStatusChangedEvent(VolumeSnapshotStatus.valueOf(inventory.getStatus()), inventory); @@ -536,7 +532,6 @@ private void handle(APIGetVolumeSnapshotTreeMsg msg) { } */ - @Transactional private VolumeSnapshotStruct newChain(VolumeSnapshotVO vo, boolean fullsnapshot) { new SQLBatch() { @Override @@ -546,6 +541,13 @@ protected void scripts() { chain.setVolumeUuid(vo.getVolumeUuid()); chain.setUuid(Platform.getUuid()); chain.setStatus(VolumeSnapshotTreeStatus.Creating); + if (!fullsnapshot) { + String rootImageUuid = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, vo.getVolumeUuid()) + .select(VolumeVO_.rootImageUuid) + .findValue(); + chain.setRootImageUuid(rootImageUuid); + } + chain = dbf.getEntityManager().merge(chain); logger.debug(String.format("created new volume snapshot tree[tree uuid:%s, volume uuid:%s, full snapshot uuid:%s]", @@ -774,9 +776,10 @@ private void handle(final CreateVolumeSnapshotMsg msg) { String volumeNewInstallPath; VolumeSnapshotStruct struct; long volumeSize; + String allocatedInstall; + long allocatedSize; VolumeVO volumeVO = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); - PrimaryStorageVO storageVO = dbf.findByUuid(volumeVO.getPrimaryStorageUuid(), PrimaryStorageVO.class); @Override public void setup() { @@ -826,7 +829,6 @@ public void run(MessageReply reply) { flow(new Flow() { String __name__ = "pre-allocate-primary-storage-capacity"; - String allocatedInstall; @Override public boolean skip(Map data) { @@ -839,6 +841,7 @@ public void run(FlowTrigger trigger, Map data) { amsg.setRequiredPrimaryStorageUuid(vol.getPrimaryStorageUuid()); amsg.setSize(volumeSize); amsg.setRequiredInstallUri(String.format("volume://%s", msg.getVolumeUuid())); + amsg.setNoOverProvisioning(true); bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); bus.send(amsg, new CloudBusCallBack(trigger) { @@ -848,6 +851,7 @@ public void run(MessageReply reply) { trigger.fail(reply.getError()); return; } + allocatedSize = volumeSize; allocatedInstall = ((AllocatePrimaryStorageSpaceReply) reply).getAllocatedInstallUrl(); trigger.next(); } @@ -860,7 +864,8 @@ public void rollback(FlowRollback trigger, Map data) { if (snapshot == null && allocatedInstall != null) { ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); rmsg.setPrimaryStorageUuid(vol.getPrimaryStorageUuid()); - rmsg.setDiskSize(snapshot.getSize()); + rmsg.setDiskSize(allocatedSize); + rmsg.setNoOverProvisioning(true); rmsg.setAllocatedInstallUrl(allocatedInstall); bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); bus.send(rmsg); @@ -869,7 +874,6 @@ public void rollback(FlowRollback trigger, Map data) { } }); - flow(new NoRollbackFlow() { String __name__ = "take-volume-snapshot"; @@ -931,54 +935,55 @@ public void done(ErrorCodeList errorCodeList) { } }); - flow(new Flow() { - - String __name__ = "reserve-snapshot-size-on-primary-storage"; - - boolean success; - String allocatedInstall; - - @Override - public boolean skip(Map data) { - return volumeSize >= snapshot.getSize(); - } + flow(new NoRollbackFlow() { + String __name__ = "adjust-snapshot-capacity-on-primary-storage"; @Override public void run(FlowTrigger trigger, Map data) { - AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); - amsg.setRequiredPrimaryStorageUuid(vol.getPrimaryStorageUuid()); - amsg.setSize(snapshot.getSize() - volumeSize); - amsg.setRequiredInstallUri(String.format("volume://%s", snapshot.getVolumeUuid())); - amsg.setForce(true); - amsg.setNoOverProvisioning(true); + if (snapshot.getSize() == volumeSize) { + trigger.next(); + return; + } - bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); - bus.send(amsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { + if (snapshot.getSize() - volumeSize > 0) { + logger.debug(String.format("reserving primary storage capacity: " + + "snapshot[uuid:%s, size:%s] is larger than Volume[uuid:%s, size:%s]", + snapshot.getUuid(), snapshot.getSize(), vol.getUuid(), volumeSize)); + AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); + amsg.setRequiredPrimaryStorageUuid(vol.getPrimaryStorageUuid()); + amsg.setRequiredInstallUri(String.format("volume://%s", snapshot.getVolumeUuid())); + amsg.setSize(snapshot.getSize() - volumeSize); + amsg.setForce(true); + amsg.setNoOverProvisioning(true); + bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); + bus.send(amsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.next(); + return; + } + allocatedSize = snapshot.getSize(); trigger.next(); - return; } - AllocatePrimaryStorageSpaceReply ar = (AllocatePrimaryStorageSpaceReply) reply; - allocatedInstall = ar.getAllocatedInstallUrl(); - success = true; - trigger.next(); - } - }); - } + }); + return; + } - @Override - public void rollback(FlowRollback trigger, Map data) { - if (success) { + if (volumeSize - snapshot.getSize() > 0) { + logger.debug(String.format("releasing primary storage capacity: " + + "snapshot[uuid:%s, size:%s] is smaller than Volume[uuid:%s, size:%s]", + snapshot.getUuid(), snapshot.getSize(), vol.getUuid(), volumeSize)); ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); rmsg.setPrimaryStorageUuid(vol.getPrimaryStorageUuid()); - rmsg.setDiskSize(snapshot.getSize()); + rmsg.setDiskSize(volumeSize - snapshot.getSize()); + rmsg.setNoOverProvisioning(true); rmsg.setAllocatedInstallUrl(allocatedInstall); bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, vol.getPrimaryStorageUuid()); bus.send(rmsg); + allocatedSize = snapshot.getSize(); + trigger.next(); } - trigger.rollback(); } }); @@ -1309,7 +1314,7 @@ public boolean skipExpungeVolume(VolumeInventory volume) { } @Override - public void volumeBeforeExpunge(VolumeInventory volume, Completion completion) { + public void volumeBeforeExpunge(VolumeInventory volume, NoErrorCompletion completion) { List msgs = VolumeSnapshotCascadeExtension.handleVolumeExpunge(volume.getUuid()); new While<>(msgs).all((msg, c) -> { @@ -1318,22 +1323,13 @@ public void volumeBeforeExpunge(VolumeInventory volume, Completion completion) { bus.send(msg, new CloudBusCallBack(c) { @Override public void run(MessageReply reply) { - if (!reply.isSuccess()) { - c.addError(reply.getError()); - } - c.done(); } }); }).run(new WhileDoneCompletion(completion) { @Override public void done(ErrorCodeList errorCodeList) { - if (!errorCodeList.getCauses().isEmpty()) { - completion.fail(errorCodeList.getCauses().get(0)); - return; - } - - completion.success(); + completion.done(); } }); } @@ -1401,18 +1397,8 @@ public void innerOverwriteVolume(VolumeInventory originVolume, VolumeInventory t if (originVolumeDeletionPolicy != VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct) { return; } - boolean hasDirectBackingRef = Q.New(VolumeSnapshotReferenceVO.class) - .eq(VolumeSnapshotReferenceVO_.referenceVolumeUuid, originVolume.getUuid()) - .eq(VolumeSnapshotReferenceVO_.referenceType, VolumeVO.class.getSimpleName()) - .eq(VolumeSnapshotReferenceVO_.referenceInstallUrl, originVolume.getInstallPath()) - .eq(VolumeSnapshotReferenceVO_.referenceUuid, originVolume.getUuid()) - .isExists(); - - if (hasDirectBackingRef) { - SQL.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.referenceVolumeUuid, originVolume.getUuid()) - .set(VolumeSnapshotReferenceVO_.referenceVolumeUuid, transientVolume.getUuid()) - .update(); - } + + VolumeSnapshotReferenceUtils.handleVolumeOverwrite(originVolume, transientVolume.getUuid()); } @Override diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java index 91487ed876f..e21cec893e8 100755 --- a/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java @@ -8,15 +8,13 @@ import org.zstack.core.asyncbatch.While; import org.zstack.core.cascade.CascadeConstant; import org.zstack.core.cascade.CascadeFacade; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; -import org.zstack.core.cloudbus.CloudBusListCallBack; -import org.zstack.core.cloudbus.MessageSafe; +import org.zstack.core.cloudbus.*; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.*; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.RunInQueue; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; import org.zstack.core.trash.StorageTrash; @@ -30,16 +28,12 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; -import org.zstack.header.host.CancelHostTasksMsg; -import org.zstack.header.host.HostConstant; +import org.zstack.header.host.*; import org.zstack.header.image.ImageConstant; import org.zstack.header.image.ImageInventory; import org.zstack.header.image.ImageVO; import org.zstack.header.image.SyncSystemTagFromVolumeMsg; -import org.zstack.header.message.APIDeleteMessage; -import org.zstack.header.message.APIMessage; -import org.zstack.header.message.Message; -import org.zstack.header.message.MessageReply; +import org.zstack.header.message.*; import org.zstack.header.storage.backup.AllocateBackupStorageMsg; import org.zstack.header.storage.backup.AllocateBackupStorageReply; import org.zstack.header.storage.backup.BackupStorageConstant; @@ -179,7 +173,7 @@ private VolumeSnapshotInventory getSelfInventory() { private void buildFullSnapshotTree() { SimpleQuery q = dbf.createQuery(VolumeSnapshotVO.class); - q.add(VolumeSnapshotVO_.treeUuid, SimpleQuery.Op.EQ, currentRoot.getTreeUuid()); + q.add(VolumeSnapshotVO_.treeUuid, Op.EQ, currentRoot.getTreeUuid()); List vos = q.list(); fullTree = VolumeSnapshotTree.fromVOs(vos); @@ -211,8 +205,6 @@ private void handleLocalMessage(Message msg) { handle((RevertVolumeFromSnapshotGroupMsg) msg); } else if (msg instanceof CancelDeleteVolumeSnapshotMsg) { handle((CancelDeleteVolumeSnapshotMsg) msg); - } else if (msg instanceof MarkSnapshotAsVolumeMsg) { - handle((MarkSnapshotAsVolumeMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -377,29 +369,21 @@ private void deletion(final VolumeSnapshotDeletionMsg msg, final NoErrorCompleti return; } - FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("delete-snapshot-%s", currentRoot.getUuid())); chain.allowEmptyFlow(); - boolean ancestorOfLatest = false; - long size = 0; - for (VolumeSnapshotInventory inv : currentLeaf.getDescendants()) { - if (inv.isLatest()) { - ancestorOfLatest = true; - } - - size += inv.getSize(); - } - long volumeVirtualSize = Q.New(VolumeVO.class) - .select(VolumeVO_.size) - .eq(VolumeVO_.uuid, msg.getVolumeUuid()) - .findValue(); - long requiredSize = size < volumeVirtualSize ? size : volumeVirtualSize; - + VolumeVO volume = dbf.findByUuid(msg.getVolumeUuid(), VolumeVO.class); String primaryStorageType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type) .eq(PrimaryStorageVO_.uuid, getSelfInventory().getPrimaryStorageUuid()).findValue(); - chain.then(new NoRollbackFlow() { + chain.then(new ShareFlow() { + boolean ancestorOfLatest; + long requiredSize; + + @Override + public void setup() { + flow(new NoRollbackFlow() { String __name__ = "check-snapshot-reference"; @Override @@ -418,7 +402,7 @@ public void run(FlowTrigger trigger, Map data) { trigger.fail(operr("snapshot or its desendant has reference volume[uuids:%s]", refVolUuids)); } }); - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "run snapshot protector"; @Override @@ -479,7 +463,102 @@ public void done(ErrorCodeList errorCodeList) { } }); - chain.then(new Flow() { + if (Objects.equals(msg.getScope(), DeleteVolumeSnapshotScope.Single.toString())) { + deleteSingleFlows(); + } else { + if (msg.getScope() == null) { + logger.warn("snapshot deletion scope is null, default to Chain scope"); + } + + long size = 0; + for (VolumeSnapshotInventory inv : currentLeaf.getDescendants()) { + if (inv.isLatest()) { + ancestorOfLatest = true; + } + size += inv.getSize(); + } + requiredSize = Math.min(size, volume.getSize()); + + deleteChainFlows(); + } + + done(new FlowDoneHandler(msg, completion) { + @Override + public void handle(Map data) { + if (Objects.equals(msg.getScope(), DeleteVolumeSnapshotScope.Single.toString())) { + bus.reply(msg, reply); + completion.done(); + return; + } + + new SQLBatch() { + @Override + protected void scripts() { + if (msg.isVolumeDeletion()) { + sql("update VolumeSnapshotTreeVO tree set tree.volumeUuid = NULL where tree.uuid = :treeUuid") + .param("treeUuid", currentRoot.getTreeUuid()).execute(); + + sql("update VolumeSnapshotVO s set s.volumeUuid = NULL where s.treeUuid = :treeUuid") + .param("treeUuid", currentRoot.getTreeUuid()).execute(); + } + + + if (!msg.isVolumeDeletion() && ancestorOfLatest && currentRoot.getParentUuid() != null) { + // reset latest + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, currentRoot.getParentUuid()) + .set(VolumeSnapshotVO_.latest, true).update(); + logger.debug(String.format("reset latest snapshot of tree[uuid:%s] to snapshot[uuid:%s]", + currentRoot.getTreeUuid(), currentRoot.getParentUuid())); + } + } + }.execute(); + + if (!cleanup()) { + changeStatusOfSnapshots(StatusEvent.ready, currentLeaf.getDescendants(), new Completion(msg, completion) { + @Override + public void success() { + bus.reply(msg, reply); + completion.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + completion.done(); + } + }); + } else { + if (msg.isVolumeDeletion()) { + List aliveAncestors = currentLeaf.getAncestors().stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); + if (!aliveAncestors.isEmpty()) { + SQL.New(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.volumeUuid, currentRoot.getVolumeUuid()) + .update(); + SQL.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, aliveAncestors) + .set(VolumeSnapshotVO_.volumeUuid, currentRoot.getVolumeUuid()) + .update(); + } + } + + bus.reply(msg, reply); + completion.done(); + } + } + }); + + error(new FlowErrorHandler(msg, completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + reply.setError(errCode); + bus.reply(msg, reply); + completion.done(); + } + }); + } + + private void deleteChainFlows() { + flow(new Flow() { String __name__ = String.format("change-volume-snapshot-status-%s", VolumeSnapshotStatus.Deleting); public void run(final FlowTrigger trigger, Map data) { @@ -521,7 +600,7 @@ public void fail(ErrorCode errorCode) { boolean needMerge = onCurrentTree && ancestorOfLatest && currentRoot.getPrimaryStorageUuid() != null && VolumeSnapshotConstant.HYPERVISOR_SNAPSHOT_TYPE.toString().equals(currentRoot.getType()); if (needMerge) { - chain.then(new Flow() { + flow(new Flow() { String __name__ = "allocate-primary-storage"; boolean success; @@ -564,7 +643,7 @@ public void rollback(FlowRollback trigger, Map data) { trigger.rollback(); } }); - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "merge-volume-snapshots-to-volume"; @Override @@ -596,7 +675,7 @@ public void run(MessageReply reply) { }); } - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "delete-volume-snapshots-from-backup-storage"; @Override @@ -625,7 +704,7 @@ public void run(List replies) { }); } - chain.then(new NoRollbackFlow() { + flow(new NoRollbackFlow() { String __name__ = "delete-volume-snapshots-from-primary-storage"; @Override @@ -671,7 +750,7 @@ public void run(List replies) { } } if (errors.getCauses().size() > 0) { - trigger.fail(errors); + trigger.fail(errors.getCauses().get(0)); } else { trigger.next(); } @@ -679,73 +758,624 @@ public void run(List replies) { }); } }); + } - final boolean finalAncestorOfLatest = ancestorOfLatest; - chain.done(new FlowDoneHandler(msg, completion) { - @Override - public void handle(Map data) { - new SQLBatch() { - @Override - protected void scripts() { - if (msg.isVolumeDeletion()) { - sql("update VolumeSnapshotTreeVO tree set tree.volumeUuid = NULL where tree.uuid = :treeUuid") - .param("treeUuid", currentRoot.getTreeUuid()).execute(); - - sql("update VolumeSnapshotVO s set s.volumeUuid = NULL where s.treeUuid = :treeUuid") - .param("treeUuid", currentRoot.getTreeUuid()).execute(); - } + private void deleteSingleFlows() { + flow(new NoRollbackFlow() { + VmInstanceState vmState; + String srcSnapshotParentPath; + String __name__ = "delete-single-volume-snapshot"; - if (!msg.isVolumeDeletion() && finalAncestorOfLatest && currentRoot.getParentUuid() != null) { - // reset latest - sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, currentRoot.getParentUuid()) - .set(VolumeSnapshotVO_.latest, true).update(); - logger.debug(String.format("reset latest snapshot of tree[uuid:%s] to snapshot[uuid:%s]", - currentRoot.getTreeUuid(), currentRoot.getParentUuid())); - } - } - }.execute(); + public void run(final FlowTrigger trigger, Map data) { + if (volume == null) { + trigger.fail(operr("volume not found for volumeUuid: %s", msg.getVolumeUuid())); + return; + } - if (!cleanup()) { - changeStatusOfSnapshots(StatusEvent.ready, currentLeaf.getDescendants(), new Completion(msg, completion) { + if (VolumeSnapshotConstant.STORAGE_SNAPSHOT_TYPE.toString().equals(currentRoot.getType()) + || Objects.equals(currentRoot.getVolumeType(), VolumeType.Memory.toString())) { + deleteVolumeSnapshotAndSyncVolumeSize(new Completion(completion) { @Override public void success() { - bus.reply(msg, reply); - completion.done(); + trigger.next(); } @Override public void fail(ErrorCode errorCode) { - reply.setError(errorCode); - bus.reply(msg, reply); - completion.done(); + trigger.fail(errorCode); } }); + return; + } + + if (volume.getVmInstanceUuid() != null) { + vmState = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()).select(VmInstanceVO_.state).findValue(); + if (vmState != VmInstanceState.Running && vmState != VmInstanceState.Paused + && vmState != VmInstanceState.Destroyed && vmState != VmInstanceState.Stopped && vmState != VmInstanceState.Destroying) { + trigger.fail(operr("vm[uuid:%s] is not Running, Paused or Destroyed, Stopped, Destroying, " + + "current state[%s]", volume.getVmInstanceUuid(), vmState)); + return; + } + } + + stepDelete(new Completion(msg, completion) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + + private void stepDelete(Completion completion) { + List vos = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.treeUuid, currentRoot.getTreeUuid()).list(); + boolean current = Q.New(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) + .select(VolumeSnapshotTreeVO_.current).findValue(); + VolumeTree volumeTree = VolumeTree.fromVOs(vos, current, VolumeInventory.valueOf(volume)); + List children = volumeTree.getSnapshotLeaf(currentRoot.getUuid()).getChildren(); + + if (children.isEmpty()) { + deleteVolumeSnapshotAndSyncVolumeSize(completion); + return; + } + + VolumeTree.VolumeSnapshotLeaf onlineChild = children.stream() + .filter(child -> volumeTree.isOnline(current, currentRoot.getUuid(), child.getUuid(), vmState)) + .findFirst().orElse(null); + + Completion comp = new Completion(completion) { + @Override + public void success() { + stepDelete(completion); + } + + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); + } + }; + VolumeTree.VolumeSnapshotLeaf child = children.get(0); + if (children.size() == 1) { + DeleteVolumeSnapshotDirection direction = volumeTree.resolveDirection(currentRoot.getUuid(), child.getUuid(), + msg.getDirection(), currentRoot.isLatest(), vmState); + boolean online = volumeTree.isOnline(current, currentRoot.getUuid(), child.getUuid(), vmState); + if (Objects.equals(direction, DeleteVolumeSnapshotDirection.Commit)) { + commit(child, volumeTree, online, comp); + } else { + pull(child, volumeTree, online, comp); + } } else { - if (msg.isVolumeDeletion()) { - List aliveAncestors = currentLeaf.getAncestors().stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); - if (!aliveAncestors.isEmpty()) { - SQL.New(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) - .set(VolumeSnapshotTreeVO_.volumeUuid, currentRoot.getVolumeUuid()) - .update(); - SQL.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, aliveAncestors) - .set(VolumeSnapshotVO_.volumeUuid, currentRoot.getVolumeUuid()) - .update(); + if (onlineChild != null && Objects.equals(child.getUuid(), onlineChild.getUuid())) { + child = children.get(1); + } + boolean online = volumeTree.isOnline(current, currentRoot.getUuid(), child.getUuid(), vmState); + pull(child, volumeTree, online, comp); + } + } + + private void commit(VolumeTree.VolumeSnapshotLeaf child, VolumeTree volumeTree, boolean online, Completion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("delete-single-volume-snapshot-%s-by-commit", currentRoot.getUuid())); + chain.then(new ShareFlow() { + final VolumeSnapshotInventory srcSnapshotInv = child.getInventory(); + final VolumeTree.VolumeSnapshotLeaf srcSnapshotLeaf = child; + final VolumeSnapshotInventory dstSnapshotInv = VolumeSnapshotInventory.valueOf(currentRoot); + long size = srcSnapshotInv.getSize(); + String allocatedInstall; + + @Override + public void setup() { + if (Objects.equals(srcSnapshotInv.getUuid(), volume.getUuid())) { + flow(new NoRollbackFlow() { + String __name__ = String.format("get-volume-%s-current-size", volume.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncVolumeSizeOnPrimaryStorageMsg smsg = new SyncVolumeSizeOnPrimaryStorageMsg(); + smsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + smsg.setVolumeUuid(volume.getUuid()); + smsg.setInstallPath(volume.getInstallPath()); + bus.makeTargetServiceIdByResourceUuid(smsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(smsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(operr(String.format("failed to get volume[uuid:%s, installPath:%s] size " + + "on primary storage[uuid:%s], %s", volume.getUuid(), volume.getInstallPath(), + volume.getPrimaryStorageUuid(), reply.getError().getDetails()))); + return; + } + + SyncVolumeSizeOnPrimaryStorageReply r = reply.castReply(); + size = r.getActualSize(); + srcSnapshotInv.setSize(size); + trigger.next(); + } + }); + } + }); + } + + flow(new Flow() { + String __name__ = "allocate-primary-storage-capacity"; + + @Override + public void run(FlowTrigger trigger, Map data) { + AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); + amsg.setRequiredPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + amsg.setSize(size); + amsg.setNoOverProvisioning(true); + amsg.setRequiredInstallUri(String.format("volume://%s", volume.getUuid())); + bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(amsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + AllocatePrimaryStorageSpaceReply r = reply.castReply(); + allocatedInstall = r.getAllocatedInstallUrl(); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (allocatedInstall == null) { + trigger.rollback(); + return; + } + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(size); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setNoOverProvisioning(true); + rmsg.setAllocatedInstallUrl(allocatedInstall); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + trigger.rollback(); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = "commit-volume-snapshot-on-primary-storage"; + + long newInstallPathSize; + + @Override + public void run(FlowTrigger trigger, Map data) { + List childrenInstallPath = child.getChildren().stream().map(c -> + c.getInventory().getPrimaryStorageInstallPath()).collect(Collectors.toList()); + + if (online) { + String hostUuid = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()) + .select(VmInstanceVO_.hostUuid).findValue(); + CommitVolumeSnapshotOnHypervisorMsg cmsg = new CommitVolumeSnapshotOnHypervisorMsg(); + cmsg.setHostUuid(hostUuid); + cmsg.setVolume(VolumeInventory.valueOf(volume)); + cmsg.setSrcSnapshot(srcSnapshotInv); + cmsg.setDstSnapshot(dstSnapshotInv); + cmsg.setSrcChildrenInstallPathInDb(childrenInstallPath); + bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(cmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + CommitVolumeSnapshotOnHypervisorReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } else { + CommitVolumeSnapshotOnPrimaryStorageMsg cmsg = new CommitVolumeSnapshotOnPrimaryStorageMsg(); + cmsg.setVolume(VolumeInventory.valueOf(volume)); + cmsg.setSrcSnapshot(srcSnapshotInv); + cmsg.setDstSnapshot(dstSnapshotInv); + cmsg.setSrcChildrenInstallPathInDb(childrenInstallPath); + bus.makeTargetServiceIdByResourceUuid(cmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(cmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + CommitVolumeSnapshotOnPrimaryStorageReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } + } + + private void updateDatabase() { + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(size); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setAllocatedInstallUrl(allocatedInstall); + rmsg.setNoOverProvisioning(true); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + + if (Objects.equals(srcSnapshotInv.getUuid(), volume.getUuid())) { + markSnapshotAsVolume(VolumeInventory.valueOf(volume), size, dstSnapshotInv.getPrimaryStorageInstallPath(), newInstallPathSize); + return; + } + + volumeTree.updateDatabaseAfterCommit(srcSnapshotLeaf, dstSnapshotInv, newInstallPathSize); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + + private void pull(VolumeTree.VolumeSnapshotLeaf child, VolumeTree volumeTree, boolean online, Completion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName(String.format("delete-single-volume-snapshot-%s-by-pull", currentRoot.getUuid())); + chain.then(new ShareFlow() { + final VolumeSnapshotInventory srcSnapshotInv = VolumeSnapshotInventory.valueOf(currentRoot); + final VolumeSnapshotInventory dstSnapshotInv = child.getInventory(); + final VolumeTree.VolumeSnapshotLeaf dstSnapshotLeaf = child; + String hostUuid; + long newInstallPathSize; + String allocatedInstall; + + @Override + public void setup() { + if (volume.getVmInstanceUuid() != null && (vmState == VmInstanceState.Running || vmState == VmInstanceState.Paused)) { + hostUuid = Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, volume.getVmInstanceUuid()) + .select(VmInstanceVO_.hostUuid).findValue(); + } + + flow(new NoRollbackFlow() { + String __name__ = "get-snapshot-backing-chain"; + + @Override + public boolean skip(Map data) { + return srcSnapshotParentPath != null; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + GetVolumeBackingChainFromPrimaryStorageMsg gmsg = new GetVolumeBackingChainFromPrimaryStorageMsg(); + gmsg.setVolumeUuid(volume.getUuid()); + gmsg.setRootInstallPaths(Collections.singletonList(srcSnapshotInv.getPrimaryStorageInstallPath())); + gmsg.setPrimaryStorageUuid(srcSnapshotInv.getPrimaryStorageUuid()); + gmsg.setHostUuid(hostUuid); + gmsg.setVolumeFormat(volume.getFormat()); + bus.makeTargetServiceIdByResourceUuid(gmsg, PrimaryStorageConstant.SERVICE_ID, gmsg.getPrimaryStorageUuid()); + bus.send(gmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + GetVolumeBackingChainFromPrimaryStorageReply gr = reply.castReply(); + List backingChainInstallPath = gr.getBackingChainInstallPath().get(srcSnapshotInv.getPrimaryStorageInstallPath()); + if (!CollectionUtils.isEmpty(backingChainInstallPath)) { + srcSnapshotParentPath = backingChainInstallPath.get(0); + } + trigger.next(); + } + }); + } + }); + + flow(new Flow() { + String __name__ = "allocate-primary-storage-capacity"; + + @Override + public void run(FlowTrigger trigger, Map data) { + AllocatePrimaryStorageSpaceMsg amsg = new AllocatePrimaryStorageSpaceMsg(); + amsg.setRequiredPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + amsg.setSize(srcSnapshotInv.getSize()); + amsg.setNoOverProvisioning(true); + amsg.setRequiredInstallUri(String.format("volume://%s", volume.getUuid())); + bus.makeTargetServiceIdByResourceUuid(amsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(amsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + AllocatePrimaryStorageSpaceReply r = reply.castReply(); + allocatedInstall = r.getAllocatedInstallUrl(); + trigger.next(); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + if (allocatedInstall == null) { + trigger.rollback(); + return; + } + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(srcSnapshotInv.getSize()); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setNoOverProvisioning(true); + rmsg.setAllocatedInstallUrl(allocatedInstall); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + trigger.rollback(); + } + }); + + if (Objects.equals(dstSnapshotInv.getUuid(), volume.getUuid())) { + flow(new NoRollbackFlow() { + String __name__ = String.format("get-volume-%s-current-size", volume.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncVolumeSizeOnPrimaryStorageMsg smsg = new SyncVolumeSizeOnPrimaryStorageMsg(); + smsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + smsg.setVolumeUuid(volume.getUuid()); + smsg.setInstallPath(volume.getInstallPath()); + bus.makeTargetServiceIdByResourceUuid(smsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(smsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(operr(String.format("failed to get volume[uuid:%s, installPath:%s] size on primary storage[uuid:%s], because %s", + volume.getUuid(), volume.getInstallPath(), volume.getPrimaryStorageUuid(), reply.getError().getDetails()))); + return; + } + + SyncVolumeSizeOnPrimaryStorageReply r = reply.castReply(); + dstSnapshotInv.setSize(r.getActualSize()); + trigger.next(); + } + }); + } + }); } + + flow(new NoRollbackFlow() { + String __name__ = "pull-volume-snapshot-on-primary-storage"; + + @Override + public void run(FlowTrigger trigger, Map data) { + if (online) { + PullVolumeSnapshotOnHypervisorMsg pmsg = new PullVolumeSnapshotOnHypervisorMsg(); + pmsg.setHostUuid(hostUuid); + pmsg.setVolume(VolumeInventory.valueOf(volume)); + pmsg.setSrcSnapshotParentPath(srcSnapshotParentPath); + pmsg.setSrcSnapshot(srcSnapshotInv); + pmsg.setDstSnapshot(dstSnapshotInv); + bus.makeTargetServiceIdByResourceUuid(pmsg, HostConstant.SERVICE_ID, hostUuid); + bus.send(pmsg, new CloudBusCallBack(completion) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + + PullVolumeSnapshotOnHypervisorReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } else { + PullVolumeSnapshotOnPrimaryStorageMsg pmsg = new PullVolumeSnapshotOnPrimaryStorageMsg(); + pmsg.setVolume(VolumeInventory.valueOf(volume)); + pmsg.setSrcSnapshotParentPath(srcSnapshotParentPath); + pmsg.setSrcSnapshot(srcSnapshotInv); + pmsg.setDstSnapshot(dstSnapshotInv); + bus.makeTargetServiceIdByResourceUuid(pmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply r) { + if (!r.isSuccess()) { + trigger.fail(r.getError()); + return; + } + PullVolumeSnapshotOnPrimaryStorageReply re = r.castReply(); + newInstallPathSize = re.getSize(); + updateDatabase(); + trigger.next(); + } + }); + } + } + + private void updateDatabase() { + ReleasePrimaryStorageSpaceMsg rmsg = new ReleasePrimaryStorageSpaceMsg(); + rmsg.setDiskSize(srcSnapshotInv.getSize()); + rmsg.setPrimaryStorageUuid(volume.getPrimaryStorageUuid()); + rmsg.setAllocatedInstallUrl(allocatedInstall); + rmsg.setNoOverProvisioning(true); + bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, volume.getPrimaryStorageUuid()); + bus.send(rmsg); + + if (Objects.equals(dstSnapshotInv.getUuid(), volume.getUuid())) { + volumeTree.updateDatabaseAfterPullToVolume(srcSnapshotInv); + return; + } + volumeTree.updateDatabaseAfterPull(srcSnapshotInv, dstSnapshotLeaf, newInstallPathSize); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } - bus.reply(msg, reply); + private void deleteVolumeSnapshotAndSyncVolumeSize(Completion completion) { + FlowChain chain = FlowChainBuilder.newShareFlowChain(); + chain.setName("delete-volume-snapshot-and-sync-volume-size"); + chain.then(new ShareFlow() { + @Override + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = String.format("delete-snapshot-%s-on-primary-storage", currentRoot.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + VolumeSnapshotPrimaryStorageDeletionMsg pmsg = new VolumeSnapshotPrimaryStorageDeletionMsg(); + pmsg.setUuid(currentRoot.getUuid()); + bus.makeTargetServiceIdByResourceUuid(pmsg, VolumeSnapshotConstant.SERVICE_ID, currentRoot.getPrimaryStorageUuid()); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + //TODO add gc + logger.warn(String.format("failed to delete snapshot[uuid:%s] on primary storage[uuid:%s], " + + "%s", currentRoot.getUuid(), currentRoot.getPrimaryStorageUuid(), reply.getError().getDetails())); + } + VolumeSnapshotVO vo = dbf.findByUuid(currentRoot.getUuid(), VolumeSnapshotVO.class); + cleanupInQueue(VolumeSnapshotInventory.valueOf(vo), new NoErrorCompletion() { + @Override + public void done() { + trigger.next(); + } + }); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("sync-volume-%s-size", volume.getUuid()); + + @Override + public void run(FlowTrigger trigger, Map data) { + SyncVolumeSizeMsg msg = new SyncVolumeSizeMsg(); + msg.setVolumeUuid(volume.getUuid()); + bus.makeTargetServiceIdByResourceUuid(msg, VolumeConstant.SERVICE_ID, volume.getUuid()); + bus.send(msg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + logger.warn(String.format("failed to sync volume[%s] size, because %s", volume.getUuid(), reply.getError())); + } + trigger.next(); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map data) { + completion.success(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map data) { + completion.fail(errCode); + } + }); + } + }).start(); + } + }); + } + }).start(); + } + + private void cleanupInQueue(VolumeSnapshotInventory volumeSnapshotInv, NoErrorCompletion completion) { + if (volumeSnapshotInv.getGroupUuid() == null) { + cleanupAfterDeleteSingleSnapshot(volumeSnapshotInv, new NoErrorCompletion() { + @Override + public void done() { completion.done(); } - } - }).error(new FlowErrorHandler(msg, completion) { + }); + return; + } + + new RunInQueue(String.format("cleanup-snapshot-on-volumeSnapshotGroup-%s", volumeSnapshotInv.getGroupUuid()), thdf, 1) + .name("cleanup-snapshot-on-volumeSnapshotGroup-in-queue").asyncBackup(completion) + .run(chain -> cleanupAfterDeleteSingleSnapshot(volumeSnapshotInv, new NoErrorCompletion(chain) { + @Override + public void done() { + completion.done(); + chain.next(); + } + })); + } + + private void cleanupAfterDeleteSingleSnapshot(VolumeSnapshotInventory volumeSnapshotInv, final NoErrorCompletion completion) { + boolean cleanup = new SQLBatchWithReturn() { @Override - public void handle(ErrorCode errCode, Map data) { - reply.setError(errCode); - bus.reply(msg, reply); - completion.done(); + protected Boolean scripts() { + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, volumeSnapshotInv.getUuid()).hardDelete(); + if (!q(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.treeUuid, volumeSnapshotInv.getTreeUuid()).isExists()) { + logger.debug(String.format("volume snapshot tree[uuid:%s] has no leaf, delete it", volumeSnapshotInv.getTreeUuid())); + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, volumeSnapshotInv.getTreeUuid()).hardDelete(); + } + return true; } - }).start(); + }.execute(); + + if (cleanup) { + ungroupAfterDeleteSingleSnapshot(volumeSnapshotInv); + } + + completion.done(); + } + + private void ungroupAfterDeleteSingleSnapshot(VolumeSnapshotInventory volumeSnapshotInv) { + if (volumeSnapshotInv.getGroupUuid() == null) { + return; + } + + SQL.New(VolumeSnapshotGroupRefVO.class).eq(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, volumeSnapshotInv.getUuid()) + .set(VolumeSnapshotGroupRefVO_.snapshotDeleted, true).update(); + long count = Q.New(VolumeSnapshotGroupRefVO.class) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotGroupUuid, volumeSnapshotInv.getGroupUuid()) + .eq(VolumeSnapshotGroupRefVO_.snapshotDeleted, false).count(); + if (count == 0) { + dbf.removeByPrimaryKey(volumeSnapshotInv.getGroupUuid(), VolumeSnapshotGroupVO.class); + logger.debug(String.format("snapshot group[uuid:%s] all volume snapshot has been deleted, " + + "delete snapshot group", volumeSnapshotInv.getGroupUuid())); + } } private void handle(final InstantiateDataVolumeFromVolumeSnapshotMsg msg) { @@ -1415,6 +2045,7 @@ public void run(MessageReply rly) { }); } + // The logic for cleaning up snapshots when deleting a snapshot chain private boolean cleanup() { List snapshots = currentLeaf.getDescendants(); @@ -1455,6 +2086,7 @@ protected Boolean scripts() { return cleanup; } + // The logic for cleaning up snapshot groups when deleting a snapshot chain private void ungroupAfterDeleted(List snapshots) { List uuids = snapshots.stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); SQL.New(VolumeSnapshotGroupRefVO.class).in(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, uuids) @@ -1851,40 +2483,32 @@ public String getName() { } private void handle(final APIRevertVolumeFromSnapshotMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return syncSignature; - } - - @Override - public void run(final SyncTaskChain chain) { - APIRevertVolumeFromSnapshotEvent evt = new APIRevertVolumeFromSnapshotEvent(msg.getId()); - - revert(msg, new Completion(evt, chain) { - @Override - public void success() { - bus.publish(evt); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - evt.setError(errorCode); - bus.publish(evt); - chain.next(); - } - }); - } - - @Override - public String getName() { - return String.format("revert-volume-%s-from-snapshot-%s", currentRoot.getVolumeUuid(), currentRoot.getUuid()); + APIRevertVolumeFromSnapshotEvent evt = new APIRevertVolumeFromSnapshotEvent(msg.getId()); + + RevertVolumeSnapshotMsg rmsg = new RevertVolumeSnapshotMsg(); + rmsg.setSnapshotUuid(msg.getSnapshotUuid()); + rmsg.setVolumeUuid(msg.getVolumeUuid()); + rmsg.setTreeUuid(msg.getTreeUuid()); + rmsg.setSession(msg.getSession()); + rmsg.setServiceId(msg.getServiceId()); + + VolumeSnapshotRevertOverlayVolumeMsg omsg = new VolumeSnapshotRevertOverlayVolumeMsg(); + omsg.setVolumeUuid(msg.getVolumeUuid()); + omsg.setMessage(rmsg); + bus.makeTargetServiceIdByResourceUuid(omsg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid()); + bus.send(omsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply reply) { + if (reply.isSuccess()) { + bus.publish(evt); + } else { + evt.setError(reply.getError()); + bus.publish(evt); + } } }); } - private void revert(final RevertVolumeSnapshotMessage msg, final Completion completion) { refreshVO(); final ErrorCode err = isOperationAllowed((Message) msg); @@ -1967,6 +2591,7 @@ public void run(MessageReply r) { }); if (msg instanceof RevertVolumeFromSnapshotGroupMsg) { + // TODO refactor this logic to group snapshot creator flow(new NoRollbackFlow() { String __name__ = "add-snapshot-to-group"; String newGroupUuid = ((RevertVolumeFromSnapshotGroupMsg) msg).getNewSnapshotGroupUuid(); @@ -2094,7 +2719,8 @@ public boolean skip(Map data) { @Override public void run(FlowTrigger trigger, Map data) { - if (!VolumeSnapshotGlobalConfig.SNAPSHOT_BEFORE_REVERTVOLUME.value(Boolean.class)) { + if (VolumeSnapshotGlobalConfig.ENABLE_FAST_REVERT.value(Boolean.class) + || !VolumeSnapshotGlobalConfig.SNAPSHOT_BEFORE_REVERTVOLUME.value(Boolean.class)) { VolumeInventory vol = VolumeInventory.valueOf(volume); vol.setSize(actualSize); vol.setInstallPath(oldVolumeInstallPath); @@ -2198,7 +2824,8 @@ public void handle(ErrorCode errCode, Map data) { private void deleteVolumeSnapshot(final DeleteVolumeSnapshotMessage msg, Completion completion) { final String issuer = VolumeSnapshotVO.class.getSimpleName(); - final List ctx = Arrays.asList(getSelfInventory()); + VolumeSnapshotDeletionStructs ctx = new VolumeSnapshotDeletionStructs( + Collections.singletonList(getSelfInventory()), msg.getDirection(), msg.getScope()); FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); chain.setName(String.format("delete-snapshot-%s", msg.getSnapshotUuid())); @@ -2288,35 +2915,24 @@ public void fail(ErrorCode errorCode) { }); } - private void handle(final MarkSnapshotAsVolumeMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return syncSignature; - } - - @Override - public void run(final SyncTaskChain chain) { + private void markSnapshotAsVolume(VolumeInventory volume,long volumeInstallPathSize, String newInstallPath, long newInstallPathSize) { refreshVO(); - MarkSnapshotAsVolumeReply reply = new MarkSnapshotAsVolumeReply(); if (!currentRoot.isLatest()) { - reply.setError(operr("current snapshot:%s is not latest snapshot, cannot mark as volume", currentRoot.getUuid())); - bus.reply(msg, reply); - chain.next(); - return; + throw new RuntimeException(String.format("current snapshot[uuid:%s] is not the latest snapshot, cannot mark it as volume", currentRoot.getUuid())); } new SQLBatch() { @Override protected void scripts() { - sql(VolumeVO.class).eq(VolumeVO_.uuid, msg.getVolumeUuid()) - .set(VolumeVO_.installPath, msg.getVolumePath()) - .set(VolumeVO_.actualSize, msg.getSize()) + sql(VolumeVO.class).eq(VolumeVO_.uuid, volume.getUuid()) + .set(VolumeVO_.installPath, newInstallPath) + .set(VolumeVO_.actualSize, newInstallPathSize) .update(); - sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, msg.getSnapshotUuid()) - .set(VolumeSnapshotVO_.primaryStorageInstallPath, null) - .set(VolumeSnapshotVO_.primaryStorageUuid, null) + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, currentRoot.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, volume.getInstallPath()) + .set(VolumeSnapshotVO_.size, volumeInstallPathSize) + .set(VolumeSnapshotVO_.latest, false) .update(); if (currentRoot.getParentUuid() != null) { @@ -2327,20 +2943,13 @@ protected void scripts() { currentRoot.getTreeUuid(), currentRoot.getParentUuid())); } + if (currentRoot.getParentUuid() == null) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, currentRoot.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + VolumeSnapshotReferenceUtils.updateReferenceAfterMarkSnapshotAsVolume(currentRoot); } }.execute(); - - cleanup(); - - bus.reply(msg, reply); - chain.next(); - } - - @Override - public String getName() { - return String.format("mark-snapshot-%s-as-volume", currentRoot.getUuid()); - } - }); } } diff --git a/storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java b/storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java new file mode 100644 index 00000000000..8aa9c70d66f --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/snapshot/VolumeTree.java @@ -0,0 +1,551 @@ +package org.zstack.storage.snapshot; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.Platform; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.core.db.SQLBatch; +import org.zstack.header.storage.snapshot.*; +import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO; +import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO_; +import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceVO; +import org.zstack.header.vm.VmInstanceState; +import org.zstack.header.volume.VolumeInventory; +import org.zstack.utils.CollectionUtils; +import org.zstack.utils.DebugUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.function.Function; +import org.zstack.utils.logging.CLogger; + +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * When building the VolumeTree, if the tree is current, then add the volume to the VolumeTree. + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class VolumeTree { + private static final CLogger logger = Utils.getLogger(VolumeTree.class); + + @Autowired + private DatabaseFacade dbf; + + private VolumeSnapshotLeaf root; + VolumeInventory volume; + List allSnapshots = new ArrayList<>(); + private boolean current; + + public boolean isCurrent() { + return current; + } + + // the aliveChainSnapshots represents a chain where the volume is located, but only if the VolumeTree contains that volume. + // If the VolumeTree does not contain the volume, then aliveChainInventory should be empty. + private List aliveChain = new ArrayList<>(); + + private static class VolumeSnapshotLeafInventory { + private VolumeSnapshotInventory inventory; + private String parentUuid; + private List children = new ArrayList<>(); + + public VolumeSnapshotInventory getInventory() { + return inventory; + } + + public void setInventory(VolumeSnapshotInventory inventory) { + this.inventory = inventory; + } + + public String getParentUuid() { + return parentUuid; + } + + public void setParentUuid(String parentUuid) { + this.parentUuid = parentUuid; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getStatus() { + return inventory.getStatus(); + } + } + + public static class VolumeSnapshotLeaf { + private VolumeSnapshotInventory inventory; + private VolumeSnapshotLeaf parent; + private List children = new ArrayList<>(); + private List descendants; + private List ancestors; + + public VolumeSnapshotInventory getInventory() { + return inventory; + } + + public void setInventory(VolumeSnapshotInventory inventory) { + this.inventory = inventory; + } + + public VolumeSnapshotLeaf getParent() { + return parent; + } + + public void setParent(VolumeSnapshotLeaf parent) { + this.parent = parent; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getUuid() { + return inventory.getUuid(); + } + + public void setUuid(String uuid) { + if (inventory == null) { + inventory = new VolumeSnapshotInventory(); + } + inventory.setUuid(uuid); + } + + private static void walkDownAll(VolumeSnapshotLeaf me, Consumer consumer) { + consumer.accept(me); + me.children.forEach(c -> walkDownAll(c, consumer)); + + } + + public void walkDownAll(Consumer consumer) { + walkDownAll(this, consumer); + } + + public VolumeTree toSubTree() { + VolumeTree tree = new VolumeTree(); + tree.root = this; + return tree; + } + + private static VolumeSnapshotLeaf walkUp(VolumeSnapshotLeaf leaf, Function func) { + if (func.call(leaf.inventory)) { + return leaf; + } + + if (leaf.getParent() == null) { + return null; + } + + return walkUp(leaf.getParent(), func); + } + + public VolumeSnapshotLeaf walkUp(Function func) { + if (func.call(inventory)) { + return this; + } + + if (getParent() == null) { + return null; + } + + return walkUp(getParent(), func); + } + + public VolumeSnapshotLeaf walkDown(Function func) { + return walkDown(this, func); + } + + private static VolumeSnapshotLeaf walkDown(VolumeSnapshotLeaf leaf, Function func) { + if (func.call(leaf.inventory)) { + return leaf; + } + + if (leaf.getChildren().isEmpty()) { + return null; + } + + for (VolumeSnapshotLeaf l : leaf.getChildren()) { + VolumeSnapshotLeaf ret = walkDown(l, func); + if (ret != null) { + return ret; + } + } + + return null; + } + + public List getDescendants() { + if (descendants == null) { + descendants = new ArrayList(); + walkDown(new Function() { + @Override + public Boolean call(VolumeSnapshotInventory arg) { + descendants.add(arg); + return false; + } + }); + } + + return descendants; + } + + public List getAncestors() { + if (ancestors == null) { + ancestors = new ArrayList(); + walkUp(new Function() { + @Override + public Boolean call(VolumeSnapshotInventory arg) { + ancestors.add(arg); + return false; + } + }); + } + + return ancestors; + } + + public VolumeSnapshotLeafInventory toLeafInventory(Set filterUuids) { + return doToLeafInventory(filterUuids); + } + + public VolumeSnapshotLeafInventory toLeafInventory() { + return doToLeafInventory(null); + } + + private VolumeSnapshotLeafInventory doToLeafInventory(Set filterUuids) { + VolumeSnapshotLeafInventory leafInventory = new VolumeSnapshotLeafInventory(); + leafInventory.setInventory(getInventory(filterUuids)); + if (parent != null) { + leafInventory.setParentUuid(parent.getUuid()); + } + + for (VolumeSnapshotLeaf leaf : children) { + leafInventory.getChildren().add(leaf.doToLeafInventory(filterUuids)); + } + + return leafInventory; + } + + private VolumeSnapshotInventory getInventory(Set filterUuids) { + if (filterUuids == null || filterUuids.contains(inventory.getUuid())) { + return inventory; + } else { + VolumeSnapshotInventory inv = new VolumeSnapshotInventory(); + inv.setUuid(inventory.getUuid()); + return inv; + } + } + + public List getChildrenVolumeSnapshotInventoryUuid() { + return children.stream().map(it -> it.getInventory().getUuid()).collect(Collectors.toList()); + } + + public String getStatus() { + return inventory.getStatus(); + } + } + + // TODO(clone) : When both chain cloning and single-node snapshot deletion are enabled, + // it is necessary to consider the dependency relationships of all snapshot nodes in the current snapshot tree within the VolumeSnapshotReferenceVO. + public static VolumeTree fromVOs(List vos, boolean current, VolumeInventory volumeInv) { + if (CollectionUtils.isEmpty(vos)) { + throw new IllegalArgumentException("VolumeSnapshotVO list cannot be null or empty"); + } + + List noParentVO = vos.stream().filter(it -> it.getParentUuid() == null).collect(Collectors.toList()); + if (noParentVO.size() > 1) { + throw new IllegalArgumentException(String.format("There are %d root snapshots on tree[uuid:%s]", + noParentVO.size(), vos.get(0).getTreeUuid())); + } + + List invs = VolumeSnapshotInventory.valueOf(vos); + + List latestSnapshotInv = invs.stream() + .filter(VolumeSnapshotInventory::isLatest).collect(Collectors.toList()); + if (latestSnapshotInv.size() > 1) { + throw new IllegalArgumentException(String.format("There are %d latest snapshots on tree[uuid:%s]", + latestSnapshotInv.size(), invs.get(0).getTreeUuid())); + } + + VolumeTree tree = new VolumeTree(); + tree.current = current; + tree.volume = volumeInv; + if (tree.current && latestSnapshotInv.size() == 1) { + VolumeSnapshotVO snapshotVO = new VolumeSnapshotVO(); + snapshotVO.setLatest(false); + snapshotVO.setName(String.format("volume-%s-%s", volumeInv.getName(), volumeInv.getUuid())); + snapshotVO.setUuid(volumeInv.getUuid()); + VolumeSnapshotInventory latestInv = latestSnapshotInv.get(0); + snapshotVO.setParentUuid(latestInv.getUuid()); + snapshotVO.setTreeUuid(latestInv.getTreeUuid()); + snapshotVO.setState(VolumeSnapshotState.Enabled); + snapshotVO.setStatus(VolumeSnapshotStatus.Ready); + snapshotVO.setPrimaryStorageInstallPath(volumeInv.getInstallPath()); + snapshotVO.setPrimaryStorageUuid(volumeInv.getPrimaryStorageUuid()); + invs.add(VolumeSnapshotInventory.valueOf(snapshotVO)); + } + + Map map = new HashMap<>(); + for (VolumeSnapshotInventory inv : invs) { + VolumeSnapshotLeaf leaf = map.get(inv.getUuid()); + if (leaf == null) { + leaf = new VolumeSnapshotLeaf(); + leaf.inventory = inv; + map.put(inv.getUuid(), leaf); + } else { + leaf.inventory = inv; + } + + if (inv.getParentUuid() != null) { + VolumeSnapshotLeaf parent = map.get(inv.getParentUuid()); + if (parent == null) { + parent = new VolumeSnapshotLeaf(); + parent.setUuid(inv.getParentUuid()); + map.put(parent.getUuid(), parent); + } + + parent.children.add(leaf); + leaf.parent = parent; + } else { + tree.root = leaf; + } + } + + if (tree.current) { + VolumeSnapshotLeaf leaf = tree.getSnapshotLeaf(volumeInv.getUuid()); + tree.aliveChain = leaf != null ? leaf.getAncestors() : new ArrayList<>(); + } + DebugUtils.Assert(tree.root != null, "why tree root is null???"); + tree.allSnapshots = invs; + return tree; + } + + private VolumeSnapshotLeaf findSnapshot(final List leafs, final Function func) { + for (VolumeSnapshotLeaf leaf : leafs) { + VolumeSnapshotLeaf ret = findSnapshot(leaf.children, func); + if (ret != null) { + return ret; + } + + if (func.call(leaf.getInventory())) { + return leaf; + } + } + + return null; + } + + private VolumeSnapshotLeaf findSnapshot(Function func) { + if (func.call(root.getInventory())) { + return root; + } + return findSnapshot(root.children, func); + } + + public VolumeSnapshotLeaf getSnapshotLeaf(String snapshotUuid) { + return findSnapshot(new Function() { + @Override + public Boolean call(VolumeSnapshotInventory arg) { + return arg.getUuid().equals(snapshotUuid); + } + }); + } + + public List getAliveChainSnapshotUuids() { + return aliveChain.stream().map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList()); + } + + public DeleteVolumeSnapshotDirection resolveDirection(String targetSnapshotUuid, String childSnapshotUuid, String initialDirection, + boolean targetSnapshotIsLatest, VmInstanceState vmState) { + boolean online = (vmState == VmInstanceState.Running || vmState == VmInstanceState.Paused) + && getAliveChainSnapshotUuids().contains(targetSnapshotUuid) && getAliveChainSnapshotUuids().contains(childSnapshotUuid); + + boolean shouldUseCommitStrategy = current && !targetSnapshotIsLatest && online; + + if (Objects.equals(initialDirection, DeleteVolumeSnapshotDirection.Pull.toString()) && shouldUseCommitStrategy) { + throw new IllegalArgumentException("the snapshot will be deleted by block 'commit', but the direction is 'pull', " + + "change the direction to 'commit' or 'auto'."); + } + + if (initialDirection == null) { + return DeleteVolumeSnapshotDirection.Commit; + } + + if (Objects.equals(initialDirection, DeleteVolumeSnapshotDirection.Auto.toString())) { + return shouldUseCommitStrategy ? + DeleteVolumeSnapshotDirection.Commit : + DeleteVolumeSnapshotDirection.Pull; + } + + return DeleteVolumeSnapshotDirection.fromString(initialDirection); + } + + public boolean isOnline(boolean treeIsCurrent, String targetSnapshotUuid, String childSnapshotUuid, VmInstanceState vmState) { + return treeIsCurrent && (vmState == VmInstanceState.Running || vmState == VmInstanceState.Paused) + && getAliveChainSnapshotUuids().contains(targetSnapshotUuid) && getAliveChainSnapshotUuids().contains(childSnapshotUuid); + } + + // TODO(clone) : When both chain cloning and single-node snapshot deletion are enabled, + // the following three functions must take into account the dependencies within the snapshot chain. + public void updateDatabaseAfterPullToVolume(VolumeSnapshotInventory srcSnapshotInv) { + new SQLBatch() { + @Override + protected void scripts() { + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, srcSnapshotInv.getUuid()) + .set(VolumeSnapshotVO_.latest, false).update(); + + if (srcSnapshotInv.getParentUuid() != null) { + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, srcSnapshotInv.getParentUuid()) + .set(VolumeSnapshotVO_.latest, true).update(); + logger.debug(String.format("reset latest snapshot of tree[uuid:%s] to snapshot[uuid:%s]", + srcSnapshotInv.getTreeUuid(), srcSnapshotInv.getParentUuid())); + } + + if (srcSnapshotInv.getParentUuid() == null) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + } + }.execute(); + } + + public void updateDatabaseAfterPull(VolumeSnapshotInventory srcSnapshotInv, VolumeTree.VolumeSnapshotLeaf dstSnapshotLeaf, long newInstallPathSize) { + VolumeSnapshotInventory dstSnapshotInv = dstSnapshotLeaf.getInventory(); + + new SQLBatch() { + @Override + protected void scripts() { + List descendantsUuid = dstSnapshotLeaf.getDescendants().stream().map(VolumeSnapshotInventory::getUuid) + .filter(uuid -> !Objects.equals(uuid, volume.getUuid())) + .collect(Collectors.toList()); + + List vos = q(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, descendantsUuid).list(); + vos.forEach(vo -> { + // update distance + vo.setDistance(vo.getDistance() - 1); + + if (Objects.equals(vo.getUuid(), dstSnapshotInv.getUuid())) { + // update parentUuid + vo.setParentUuid(srcSnapshotInv.getParentUuid()); + logger.debug(String.format("update the parent of snapshot[uuid:%s] to %s", dstSnapshotInv.getUuid(), srcSnapshotInv.getParentUuid())); + + vo.setSize(newInstallPathSize); + logger.debug(String.format("update the size of snapshot[uuid:%s] to %s", dstSnapshotInv.getUuid(), newInstallPathSize)); + } + }); + + VolumeSnapshotTreeVO newTree = null; + // create new tree and update treeUuid + if (srcSnapshotInv.getParentUuid() == null) { + newTree = new VolumeSnapshotTreeVO(); + newTree.setCurrent(descendantsUuid.contains(volume.getUuid())); + newTree.setVolumeUuid(volume.getUuid()); + newTree.setUuid(Platform.getUuid()); + newTree.setStatus(VolumeSnapshotTreeStatus.Completed); + if (getAliveChainSnapshotUuids().contains(dstSnapshotInv.getUuid())) { + newTree.setCurrent(true); + } + dbf.persist(newTree); + logger.debug(String.format("created new volume snapshot tree[uuid:%s]", newTree.getUuid())); + VolumeSnapshotTreeVO finalNewTree = newTree; + vos.forEach(vo -> vo.setTreeUuid(finalNewTree.getUuid())); + } + + dbf.updateCollection(vos); + + if (newTree != null && Objects.equals(dstSnapshotInv.getUuid(), volume.getUuid()) + && q(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()).count() == 1) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + } + }.execute(); + } + + public void updateDatabaseAfterCommit(VolumeTree.VolumeSnapshotLeaf srcSnapshotLeaf, VolumeSnapshotInventory dstSnapshotInv, long newInstallPathSize) { + VolumeSnapshotInventory srcSnapshotInv = srcSnapshotLeaf.getInventory(); + new SQLBatch() { + @Override + protected void scripts() { + List descendantsUuid = srcSnapshotLeaf.getDescendants().stream().map(VolumeSnapshotInventory::getUuid) + .filter(uuid -> !Objects.equals(uuid, srcSnapshotLeaf.getUuid())) + .filter(uuid -> !Objects.equals(uuid, volume.getUuid())) + .collect(Collectors.toList()); + + List vos = new ArrayList<>(); + if (!descendantsUuid.isEmpty()) { + vos = Q.New(VolumeSnapshotVO.class).in(VolumeSnapshotVO_.uuid, descendantsUuid).list(); + vos.forEach(vo -> { + // update distance + vo.setDistance(vo.getDistance() - 1); + }); + } + + VolumeSnapshotTreeVO newTree = null; + // create new tree and update treeUuid + if (dstSnapshotInv.getParentUuid() == null) { + newTree = new VolumeSnapshotTreeVO(); + newTree.setCurrent(descendantsUuid.contains(volume.getUuid())); + newTree.setVolumeUuid(volume.getUuid()); + newTree.setUuid(Platform.getUuid()); + newTree.setStatus(VolumeSnapshotTreeStatus.Completed); + if (getAliveChainSnapshotUuids().contains(srcSnapshotInv.getUuid())) { + newTree.setCurrent(true); + } + dbf.persist(newTree); + logger.debug(String.format("created new volume snapshot tree[uuid:%s]", newTree.getUuid())); + } + if (!vos.isEmpty() && newTree != null) { + VolumeSnapshotTreeVO finalNewTree = newTree; + vos.forEach(vo -> vo.setTreeUuid(finalNewTree.getUuid())); + dbf.updateCollection(vos); + } + + if (newTree != null && Objects.equals(srcSnapshotInv.getUuid(), volume.getUuid()) + && q(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, dstSnapshotInv.getTreeUuid()).count() == 1) { + sql(VolumeSnapshotTreeVO.class).eq(VolumeSnapshotTreeVO_.uuid, srcSnapshotInv.getTreeUuid()) + .set(VolumeSnapshotTreeVO_.current, false).update(); + } + + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, dstSnapshotInv.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, srcSnapshotInv.getPrimaryStorageInstallPath()) + .set(VolumeSnapshotVO_.size, srcSnapshotInv.getSize()).update(); + if (dstSnapshotInv.getGroupUuid() != null) { + sql(VolumeSnapshotGroupRefVO.class) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotGroupUuid, dstSnapshotInv.getGroupUuid()) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, dstSnapshotInv.getUuid()) + .set(VolumeSnapshotGroupRefVO_.volumeSnapshotInstallPath, srcSnapshotInv.getPrimaryStorageInstallPath()) + .update(); + } + + sql(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.uuid, srcSnapshotInv.getUuid()) + .set(VolumeSnapshotVO_.primaryStorageInstallPath, dstSnapshotInv.getPrimaryStorageInstallPath()) + .set(VolumeSnapshotVO_.size, newInstallPathSize) + .set(VolumeSnapshotVO_.distance, srcSnapshotInv.getDistance() - 1) + .set(VolumeSnapshotVO_.parentUuid, dstSnapshotInv.getParentUuid()) + .set(VolumeSnapshotVO_.treeUuid, newTree != null ? newTree.getUuid() : srcSnapshotInv.getTreeUuid()) + .update(); + logger.debug(String.format("update the parent of snapshot[uuid:%s] to %s", srcSnapshotInv.getUuid(), dstSnapshotInv.getParentUuid())); + + if (srcSnapshotInv.getGroupUuid() != null) { + sql(VolumeSnapshotGroupRefVO.class) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotGroupUuid, srcSnapshotInv.getGroupUuid()) + .eq(VolumeSnapshotGroupRefVO_.volumeSnapshotUuid, srcSnapshotInv.getUuid()) + .set(VolumeSnapshotGroupRefVO_.volumeSnapshotInstallPath, dstSnapshotInv.getPrimaryStorageInstallPath()) + .update(); + } + } + }.execute(); + } +} diff --git a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java index fc41db80347..4463fe97847 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/group/VolumeSnapshotGroupBase.java @@ -179,7 +179,6 @@ public String getName() { return "delete-snapshot-group"; } }); - } private void handleDelete(APIDeleteVolumeSnapshotGroupMsg msg, NoErrorCompletion completion) { @@ -187,6 +186,8 @@ private void handleDelete(APIDeleteVolumeSnapshotGroupMsg msg, NoErrorCompletion DeleteVolumeSnapshotGroupInnerMsg imsg = new DeleteVolumeSnapshotGroupInnerMsg(); imsg.setUuid(msg.getUuid()); imsg.setDeletionMode(msg.getDeletionMode()); + imsg.setScope(msg.getScope()); + imsg.setDirection(msg.getDirection()); bus.makeTargetServiceIdByResourceUuid(imsg, VolumeSnapshotConstant.SERVICE_ID, msg.getUuid()); overlaySend(imsg, new CloudBusCallBack(msg) { @Override @@ -218,7 +219,8 @@ private void handle(DeleteVolumeSnapshotGroupInnerMsg msg) { rmsg.setVolumeUuid(snapshot.getVolumeUuid()); rmsg.setTreeUuid(snapshot.getTreeUuid()); rmsg.setDeletionMode(msg.getDeletionMode()); - + rmsg.setScope(msg.getScope()); + rmsg.setDirection(msg.getDirection()); bus.makeTargetServiceIdByResourceUuid(rmsg, VolumeSnapshotConstant.SERVICE_ID, getResourceIdToRouteMsg(snapshot)); bus.send(rmsg, new CloudBusCallBack(compl) { @Override @@ -373,7 +375,8 @@ private void handle(RevertVmFromSnapshotGroupInnerMsg msg) { } final String finalNewGroupUuid = newGroup == null ? null : newGroup.getUuid(); - new While<>(snapshots).each((snapshot, compl) -> { + Integer concurrencyNum = VolumeSnapshotGlobalConfig.SNAPSHOT_GROUP_REVERT_CONCURRENCY.value(Integer.class); + new While<>(snapshots).step((snapshot, compl) -> { if (Q.New(VolumeVO.class).eq(VolumeVO_.uuid, snapshot.getVolumeUuid()).eq(VolumeVO_.type, VolumeType.Memory).isExists()) { compl.done(); return; @@ -394,7 +397,7 @@ public void run(MessageReply r) { compl.done(); } }); - }).run(new WhileDoneCompletion(msg) { + }, concurrencyNum).run(new WhileDoneCompletion(msg) { @Override public void done(ErrorCodeList errorCodeList) { bus.reply(msg, reply); diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java index 93ec04b6458..cb1bb6a657e 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceTreeBase.java @@ -6,6 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.ThreadFacade; @@ -25,6 +26,7 @@ import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceInventory; import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeInventory; import org.zstack.header.volume.VolumeVO; +import org.zstack.header.volume.VolumeVO_; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -108,7 +110,10 @@ private void deleteSnapshotRefLeaf(DeleteVolumeSnapshotReferenceLeafMsg msg, Com return; } - boolean rootDeleted = msg.getLeaf().getParentId() == null && !dbf.isExist(msg.getLeaf().getVolumeUuid(), VolumeVO.class); + boolean rootDeleted = msg.getLeaf().getParentId() == null && !Q.New(VolumeVO.class) + .eq(VolumeVO_.uuid, msg.getLeaf().getVolumeUuid()) + .eq(VolumeVO_.primaryStorageUuid, msg.getTree().getPrimaryStorageUuid()) + .isExists(); String endPath = rootDeleted ? self.getRootInstallUrl() : msg.getLeaf().getVolumeSnapshotInstallUrl(); String startPath = msg.getLeaf().getDirectSnapshotInstallUrl(); if (startPath.equals(endPath) && !rootDeleted) { diff --git a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java index fec4632715e..49662466a46 100644 --- a/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java +++ b/storage/src/main/java/org/zstack/storage/snapshot/reference/VolumeSnapshotReferenceUtils.java @@ -1,9 +1,13 @@ package org.zstack.storage.snapshot.reference; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.zstack.core.Platform; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.*; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.image.ImageConstant; import org.zstack.header.image.ImageInventory; import org.zstack.header.storage.primary.ImageCacheVO; @@ -25,11 +29,14 @@ import java.util.*; import java.util.stream.Collectors; +import static org.zstack.core.Platform.operr; + public class VolumeSnapshotReferenceUtils { private static final CLogger logger = Utils.getLogger(VolumeSnapshotReferenceUtils.class); - private static Function getResourceLocateHostUuidGetter; + private static Function getResourceLocateHostUuidGetter = resourceUuid -> null; + // FIXME: replace it with location url public static void setGetResourceLocateHostUuidGetter(Function getter) { VolumeSnapshotReferenceUtils.getResourceLocateHostUuidGetter = getter; } @@ -60,6 +67,7 @@ public static Map> getDirectReferencedSnapshotUuidsGroupByT )); } + // suppose that inner snapshot path is like: volumePath@snapshotId public static boolean isVolumeDirectlyReferenceByOthers(VolumeInventory volume) { return Q.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.volumeUuid, volume.getUuid()) .like(VolumeSnapshotReferenceVO_.volumeSnapshotInstallUrl, volume.getInstallPath() + "%%") @@ -75,33 +83,47 @@ public static String getVolumeInstallUrlBackingOtherVolume(String volumeUuid) { return null; } - public static List getVolumeInstallUrlsReferenceByOtherVolumes(String volumeUuid) { - return getVolumeReferenceRef(volumeUuid).stream() - .map(VolumeSnapshotReferenceVO::getVolumeSnapshotInstallUrl).distinct() - .collect(Collectors.toList()); - } - // get volume snapshotUuids referenced by other volumes directly or indirectly + // FIXME split different primary storage snapshot reference public static Set getVolumeAllSnapshotsReferencedByOtherVolumes(String volumeUuid) { - List refVolumeSnapshotUuids = getVolumeReferenceRef(volumeUuid).stream() - .map(VolumeSnapshotReferenceVO::getVolumeSnapshotUuid).distinct() - .collect(Collectors.toList()); - if (refVolumeSnapshotUuids.isEmpty()) { + Set refSnapshotUuids = getVolumeReferenceRef(volumeUuid).stream() + .map(VolumeSnapshotReferenceVO::getVolumeSnapshotUuid) + .collect(Collectors.toSet()); + if (refSnapshotUuids.isEmpty()) { return Collections.emptySet(); } List allSnapshots = Q.New(VolumeSnapshotVO.class).eq(VolumeSnapshotVO_.volumeUuid, volumeUuid).list(); + // snapshotUuid in VolumeSnapshotReferenceVO may not exist in VolumeSnapshotVO, + // maybe because the snapshot has been deleted db only after volume migration, + // so we need to filter them out + refSnapshotUuids.retainAll(allSnapshots.stream().map(VolumeSnapshotVO::getUuid).collect(Collectors.toSet())); + if (refSnapshotUuids.isEmpty()) { + return Collections.emptySet(); + } - Map> treeSnapshotsMap = allSnapshots.stream().collect(Collectors.groupingBy(VolumeSnapshotVO::getTreeUuid)); - List refVolumeSnapshotUuidsInTree = new ArrayList<>(); - for (VolumeSnapshotVO refSnapshot : allSnapshots.stream().filter(sp -> refVolumeSnapshotUuids.contains(sp.getUuid())).collect(Collectors.toList())) { - refVolumeSnapshotUuidsInTree.add(refSnapshot.getUuid()); - VolumeSnapshotTree tree = VolumeSnapshotTree.fromVOs(treeSnapshotsMap.get(refSnapshot.getTreeUuid())); - VolumeSnapshotTree.SnapshotLeaf snapshotLeaf = tree.findSnapshot(arg -> arg.getUuid().equals(refSnapshot.getUuid())); - refVolumeSnapshotUuidsInTree.addAll(snapshotLeaf.getAncestors().stream() - .map(VolumeSnapshotInventory::getUuid).collect(Collectors.toList())); + Set allRefSnapshotUuids = new HashSet<>(refSnapshotUuids); + Map trees = allSnapshots.stream() + .collect(Collectors.groupingBy(VolumeSnapshotVO::getTreeUuid, Collectors.toList())) + .values().stream() + .collect(Collectors.toMap( + snaps -> snaps.get(0).getTreeUuid(), + VolumeSnapshotTree::fromVOs + )); + + List refSnapshots = allSnapshots.stream() + .filter(sp -> refSnapshotUuids.contains(sp.getUuid())) + .collect(Collectors.toList()); + for (VolumeSnapshotVO refSnapshot : refSnapshots) { + Set ancestorUuids = trees.get(refSnapshot.getTreeUuid()) + .findSnapshot(refSnapshot.getUuid()) + .getAncestors().stream() + .map(VolumeSnapshotInventory::getUuid) + .collect(Collectors.toSet()); + allRefSnapshotUuids.addAll(ancestorUuids); } - return new HashSet<>(refVolumeSnapshotUuidsInTree); + + return allRefSnapshotUuids; } public static List getReferenceVolume(String volumeUuid) { @@ -234,6 +256,7 @@ protected VolumeSnapshotReferenceTreeVO scripts() { VolumeVO vol = databaseFacade.getEntityManager().find(VolumeVO.class, baseSnapshot.getVolumeUuid(), LockModeType.PESSIMISTIC_WRITE); VolumeSnapshotReferenceTreeVO tree = Q.New(VolumeSnapshotReferenceTreeVO.class) .eq(VolumeSnapshotReferenceTreeVO_.rootVolumeUuid, baseSnapshot.getVolumeUuid()) + .eq(VolumeSnapshotReferenceTreeVO_.primaryStorageUuid, baseSnapshot.getPrimaryStorageUuid()) .find(); if (tree != null) { return tree; @@ -251,13 +274,20 @@ protected VolumeSnapshotReferenceTreeVO scripts() { } private static VolumeSnapshotReferenceTreeVO getOrBuildChainSnapshotRefTree(VolumeSnapshotVO baseSnapshot, String baseImageUuid) { + String hostUuid = getResourceLocateHostUuidGetter.call(baseSnapshot.getVolumeUuid()); return new SQLBatchWithReturn() { @Override protected VolumeSnapshotReferenceTreeVO scripts() { databaseFacade.getEntityManager().find(VolumeSnapshotTreeVO.class, baseSnapshot.getTreeUuid(), LockModeType.PESSIMISTIC_WRITE); - VolumeSnapshotReferenceTreeVO tree = Q.New(VolumeSnapshotReferenceTreeVO.class) + Q q = Q.New(VolumeSnapshotReferenceTreeVO.class) .eq(VolumeSnapshotReferenceTreeVO_.rootVolumeSnapshotTreeUuid, baseSnapshot.getTreeUuid()) - .find(); + .eq(VolumeSnapshotReferenceTreeVO_.primaryStorageUuid, baseSnapshot.getPrimaryStorageUuid()); + + if (hostUuid != null) { + q.eq(VolumeSnapshotReferenceTreeVO_.hostUuid, hostUuid); + } + + VolumeSnapshotReferenceTreeVO tree = q.find(); if (tree != null) { return tree; } @@ -273,7 +303,7 @@ protected VolumeSnapshotReferenceTreeVO scripts() { tree.setRootVolumeSnapshotUuid(t.get(0, String.class)); tree.setRootInstallUrl(t.get(1, String.class)); tree.setPrimaryStorageUuid(baseSnapshot.getPrimaryStorageUuid()); - tree.setHostUuid(getResourceLocateHostUuidGetter.call(baseSnapshot.getVolumeUuid())); + tree.setHostUuid(hostUuid); return persist(tree); } }.execute(); @@ -333,6 +363,7 @@ public static void cleanTemporaryImageReference(List images) { }); } + // FIXME: consider path and psUuid public static List filterStaleImageCache(List ids) { if (CollectionUtils.isEmpty(ids)) { return Collections.emptyList(); @@ -340,7 +371,8 @@ public static List filterStaleImageCache(List ids) { return SQL.New("select c.id from ImageCacheVO c" + " where c.id in (:ids)" + - " and c.imageUuid not in (select tree.rootImageUuid from VolumeSnapshotReferenceTreeVO tree)", Long.class) + " and c.imageUuid not in (select tree.rootImageUuid from VolumeSnapshotReferenceTreeVO tree" + + " where tree.rootImageUuid is not null)", Long.class) .param("ids", ids) .list(); } @@ -370,6 +402,65 @@ public static void handleVolumeDeletion(VolumeInventory volume) { } } + /*** + * handle volume or snapshot install path change, it MUST BE called in a TRANSACTION context, and the caller should + * ensure the volume or snapshot install path will be changed in this transaction. the whole API process MUST BE + * idempotent and safely interrupted without adverse effects. + * @param volumeUuid the volume install url changed, contains volume and snapshot + * @param oldAndNewPaths key is old path, value is new path + */ + public static void handleVolumeInstallUrlChange(String volumeUuid, Map oldAndNewPaths) { + if (!TransactionSynchronizationManager.isActualTransactionActive()) { + throw new CloudRuntimeException("handleVolumeInstallUrlChange must be called in a transaction context, " + + "and you should ensure the volume or snapshot install path will be changed in this transaction." + + "the whole API process MUST BE idempotent and safely interrupted without adverse effects."); + } + + if (MapUtils.isEmpty(oldAndNewPaths)) { + return; + } + + List refVols = getReferenceVolume(volumeUuid); + if (!refVols.isEmpty()) { + List infos = refVols.stream().map(v -> String.format("uuid:%s, name:%s", v.getUuid(), v.getName())).collect(Collectors.toList()); + throw new OperationFailureException(operr(" volume[uuid: %s] has been referenced by other volumes [%s], " + + "can not change install path before flatten them and their descendants ", volumeUuid, infos.toString())); + } + + VolumeSnapshotReferenceVO ref = getVolumeBackingRef(volumeUuid); + if (ref == null) { + return; + } + if (oldAndNewPaths.containsKey(ref.getReferenceInstallUrl())) { + SQL.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.id, ref.getId()) + .set(VolumeSnapshotReferenceVO_.referenceInstallUrl, oldAndNewPaths.get(ref.getReferenceInstallUrl())) + .update(); + + logger.debug(String.format("update volume snapshot reference[referUuid:%s, referVolumeUuid:%s] install path from %s to %s", + ref.getReferenceUuid(), ref.getReferenceVolumeUuid(), ref.getReferenceInstallUrl(), oldAndNewPaths.get(ref.getReferenceInstallUrl()))); + } else { + logger.warn(String.format("volume snapshot reference[referUuid:%s, referVolumeUuid:%s] install path %s not in oldAndNewPaths", + ref.getReferenceUuid(), ref.getReferenceVolumeUuid(), ref.getReferenceInstallUrl())); + } + } + + public static void handleVolumeOverwrite(VolumeInventory originVolume, String newVolumeUuid) { + if (!TransactionSynchronizationManager.isActualTransactionActive()) { + throw new CloudRuntimeException("handleVolumeUuidChange must be called in a transaction context, " + + "and you should ensure the volume or snapshot install path will be changed in this transaction." + + "the whole API process MUST BE idempotent and safely interrupted without adverse effects."); + } + + VolumeSnapshotReferenceVO ref = getVolumeBackingRef(originVolume.getUuid()); + if (ref != null && ref.getReferenceUuid().equals(originVolume.getUuid()) + && ref.getReferenceInstallUrl().equals(originVolume.getInstallPath()) + && ref.getReferenceType().equals(VolumeVO.class.getSimpleName())) { + SQL.New(VolumeSnapshotReferenceVO.class).eq(VolumeSnapshotReferenceVO_.id, ref.getId()) + .set(VolumeSnapshotReferenceVO_.referenceVolumeUuid, newVolumeUuid) + .update(); + } + } + private static void deleteAndRedirectSnapshotRef(VolumeSnapshotReferenceVO ref) { new SQLBatch() { @Override @@ -437,7 +528,15 @@ private static void deleteSnapshotRef(VolumeSnapshotReferenceVO ref) { private static void deleteSnapshotRefLeafInTree(VolumeSnapshotReferenceTreeVO tree, VolumeSnapshotReferenceVO ref) { boolean referenceRedirected = !ref.getDirectSnapshotUuid().equals(ref.getVolumeSnapshotUuid()); - if (referenceRedirected || !Q.New(VolumeVO.class).eq(VolumeVO_.uuid, ref.getVolumeUuid()).isExists()) { + boolean backingVolumeDeletedInDb = SQL.New("select vol.uuid from VolumeVO vol, VolumeSnapshotReferenceTreeVO tree" + + " where vol.uuid = :volUuid" + + " and tree.uuid = :treeUuid" + + " and vol.primaryStorageUuid = tree.primaryStorageUuid", String.class) + .param("volUuid", ref.getVolumeUuid()) + .param("treeUuid", ref.getTreeUuid()) + .find() == null; + + if (referenceRedirected || backingVolumeDeletedInDb) { if (tree == null) { tree = Q.New(VolumeSnapshotReferenceTreeVO.class).eq(VolumeSnapshotReferenceTreeVO_.uuid, ref.getTreeUuid()).find(); } diff --git a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java index 926063df1eb..6254e518957 100755 --- a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java @@ -25,6 +25,7 @@ import org.zstack.header.vm.VmInstanceSpec.ImageSpec; import org.zstack.header.volume.*; import org.zstack.identity.AccountManager; +import org.zstack.utils.CollectionUtils; import org.zstack.utils.Utils; import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; @@ -33,6 +34,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.*; +import java.util.stream.Collectors; public class InstantiateVolumeForNewCreatedVmExtension implements PreVmInstantiateResourceExtensionPoint { private static final CLogger logger = Utils.getLogger(InstantiateVolumeForNewCreatedVmExtension.class); @@ -187,8 +189,21 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) } List msgs = new ArrayList<>(); + Map> volumeTagsMap = Optional.ofNullable(spec.getVolumeSpecs()) + .orElse(Collections.emptyList()) + .stream() + .collect(Collectors.toMap( + VmInstanceSpec.VolumeSpec::getAssociatedVolumeUuid, + vspec -> vspec.getTags() != null ? vspec.getTags() : Collections.emptyList() + )); + for (VolumeInventory volume : spec.getDestDataVolumes()) { - msgs.add(fillMsg(new InstantiateVolumeMsg(), volume, spec)); + InstantiateVolumeMsg dmsg = fillMsg(new InstantiateVolumeMsg(), volume, spec); + List tags = volumeTagsMap.get(volume.getUuid()); + if (!CollectionUtils.isEmpty(tags)) { + dmsg.setSystemTags(tags); + } + msgs.add(dmsg); } for (VolumeInventory volume : spec.getDestCacheVolumes()) { @@ -208,9 +223,12 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) } else if (image.getInventory() != null && ImageMediaType.RootVolumeTemplate.toString().equals(image.getInventory().getMediaType())) { InstantiateVolumeMsg rmsg = fillMsg(new InstantiateRootVolumeMsg(), spec.getDestRootVolume(), spec); ((InstantiateRootVolumeMsg) rmsg).setTemplateSpec(image); + rmsg.setSystemTags(spec.getRootVolumeSystemTags()); msgs.add(rmsg); } else { - msgs.add(fillMsg(new InstantiateVolumeMsg(), spec.getDestRootVolume(), spec)); + InstantiateVolumeMsg rmsg = fillMsg(new InstantiateVolumeMsg(), spec.getDestRootVolume(), spec); + rmsg.setSystemTags(spec.getRootVolumeSystemTags()); + msgs.add(rmsg); } if (spec.getDataVolumeTemplateUuids() != null) { diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index 390e79c54fd..c9790563260 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -16,7 +16,9 @@ import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.defer.Defer; import org.zstack.core.defer.Deferred; -import org.zstack.core.thread.*; +import org.zstack.core.thread.ChainTask; +import org.zstack.core.thread.SyncTaskChain; +import org.zstack.core.thread.ThreadFacade; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.core.workflow.SimpleFlowChain; @@ -33,9 +35,6 @@ import org.zstack.header.message.*; import org.zstack.header.storage.primary.*; import org.zstack.header.storage.snapshot.*; -import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupInventory; -import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO; -import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupVO; import org.zstack.header.storage.snapshot.group.*; import org.zstack.header.tag.SystemTagVO; import org.zstack.header.tag.SystemTagVO_; @@ -47,9 +46,10 @@ import org.zstack.identity.AccountManager; import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg; import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply; +import org.zstack.storage.primary.PrimaryStorageDeleteBitGC; import org.zstack.storage.primary.PrimaryStorageGlobalConfig; -import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.storage.snapshot.group.VolumeSnapshotGroupOperationValidator; +import org.zstack.storage.snapshot.reference.VolumeSnapshotReferenceUtils; import org.zstack.tag.SystemTagCreator; import org.zstack.tag.TagManager; import org.zstack.utils.CollectionUtils; @@ -58,9 +58,11 @@ import org.zstack.utils.Utils; import org.zstack.utils.function.ForEachFunction; import org.zstack.utils.logging.CLogger; +import org.zstack.utils.path.PathUtil; import javax.persistence.TypedQuery; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.zstack.core.Platform.*; @@ -164,8 +166,6 @@ private void handleLocalMessage(Message msg) { handle((FlattenVolumeMsg) msg); } else if (msg instanceof CancelFlattenVolumeMsg) { handle((CancelFlattenVolumeMsg) msg); - } else if (msg instanceof UndoSnapshotCreationMsg) { - handle((UndoSnapshotCreationMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -912,18 +912,8 @@ public void setup() { @Override public void run(FlowTrigger trigger, Map data) { - new While<>(exts).each((ext, c) -> ext.volumeBeforeExpunge(inv, new Completion(c) { - @Override - public void success() { - c.done(); - } - - @Override - public void fail(ErrorCode errorCode) { - logger.debug(String.format("failed to execute extension, because %s", errorCode.getDetails())); - c.done(); - } - })).run(new WhileDoneCompletion(trigger) { + new While<>(exts).each((ext, c) -> ext.volumeBeforeExpunge(inv, c)) + .run(new WhileDoneCompletion(trigger) { @Override public void done(ErrorCodeList errorCodeList) { trigger.next(); @@ -1239,6 +1229,7 @@ public void run(MessageReply reply) { if (deletionPolicy == VolumeDeletionPolicy.Direct) { flow(new NoRollbackFlow() { + final List allowedStatuses = Arrays.asList(VolumeStatus.Ready, VolumeStatus.Migrating); String __name__ = "delete-volume-from-primary-storage"; @Override @@ -1249,8 +1240,11 @@ public boolean skip(Map data) { @Override public void run(final FlowTrigger trigger, Map data) { - if (self.getStatus() == VolumeStatus.Ready && - self.getPrimaryStorageUuid() != null) { + if (allowedStatuses.contains(self.getStatus()) && self.getPrimaryStorageUuid() != null) { + if (self.getStatus() == VolumeStatus.Migrating) { + self.setInstallPath(PathUtil.normalizePathWithoutQuery(self.getInstallPath())); + } + DeleteVolumeOnPrimaryStorageMsg dmsg = new DeleteVolumeOnPrimaryStorageMsg(); dmsg.setVolume(getSelfInventory()); dmsg.setUuid(self.getPrimaryStorageUuid()); @@ -1427,6 +1421,7 @@ protected void scripts() { .set(VolumeVO_.rootImageUuid, volume.getRootImageUuid()) .set(VolumeVO_.primaryStorageUuid, volume.getPrimaryStorageUuid()) .set(VolumeVO_.actualSize, volume.getActualSize()) + .set(VolumeVO_.protocol, volume.getProtocol()) .update(); sql(VolumeVO.class) @@ -1436,6 +1431,7 @@ protected void scripts() { .set(VolumeVO_.rootImageUuid, transientVolume.getRootImageUuid()) .set(VolumeVO_.primaryStorageUuid, transientVolume.getPrimaryStorageUuid()) .set(VolumeVO_.actualSize, transientVolume.getActualSize()) + .set(VolumeVO_.protocol, transientVolume.getProtocol()) .update(); pluginRgty.getExtensionList(OverwriteVolumeExtensionPoint.class).forEach(it -> @@ -1794,7 +1790,9 @@ public void run(MessageReply reply) { ChangeVolumeTypeOnPrimaryStorageReply cr = reply.castReply(); newRootSnapshots.addAll(cr.getSnapshots()); newRootVol = cr.getVolume(); - installPathsToGc.put(newRootVol, cr.getInstallPathToGc()); + if (cr.getInstallPathToGc() != null) { + installPathsToGc.put(newRootVol, cr.getInstallPathToGc()); + } trigger.next(); } }); @@ -1824,7 +1822,9 @@ public void run(MessageReply reply) { ChangeVolumeTypeOnPrimaryStorageReply cr = reply.castReply(); oldRootSnapshots.addAll(cr.getSnapshots()); oldRootVol = cr.getVolume(); - installPathsToGc.put(oldRootVol, cr.getInstallPathToGc()); + if (cr.getInstallPathToGc() != null) { + installPathsToGc.put(oldRootVol, cr.getInstallPathToGc()); + } trigger.next(); } }); @@ -1840,6 +1840,8 @@ public void run(FlowTrigger trigger, Map data) { @Override protected void scripts() { VmInstanceVO vm = findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class); + Map oldRootVolOldAndNewInstallPaths = new HashMap<>(); + Map newRootVolOldAndNewInstallPaths = new HashMap<>(); VolumeVO oldRootVolumeVO = vm.getRootVolume(); VolumeVO newRootVolumeVO = vm.getAllVolumes().stream().filter(it -> it.getUuid().equals(msg.getVolumeUuid())) @@ -1847,11 +1849,13 @@ protected void scripts() { operr("volume[uuid%s] should be attached.") )); + oldRootVolOldAndNewInstallPaths.put(oldRootVolumeVO.getInstallPath(), oldRootVol.getInstallPath()); oldRootVolumeVO.setType(VolumeType.Data); oldRootVolumeVO.setInstallPath(oldRootVol.getInstallPath()); oldRootVolumeVO.setDeviceId(newRootVolumeVO.getDeviceId()); merge(oldRootVolumeVO); + newRootVolOldAndNewInstallPaths.put(newRootVolumeVO.getInstallPath(), newRootVol.getInstallPath()); newRootVolumeVO.setType(VolumeType.Root); newRootVolumeVO.setInstallPath(newRootVol.getInstallPath()); newRootVolumeVO.setDeviceId(0); @@ -1859,6 +1863,7 @@ protected void scripts() { for (VolumeSnapshotInventory newRootSnapshot : newRootSnapshots) { VolumeSnapshotVO snapshot = findByUuid(newRootSnapshot.getUuid(), VolumeSnapshotVO.class); + newRootVolOldAndNewInstallPaths.put(newRootSnapshot.getPrimaryStorageInstallPath(), newRootSnapshot.getPrimaryStorageInstallPath()); snapshot.setVolumeType(VolumeType.Root.toString()); snapshot.setPrimaryStorageInstallPath(newRootSnapshot.getPrimaryStorageInstallPath()); merge(snapshot); @@ -1866,11 +1871,20 @@ protected void scripts() { for (VolumeSnapshotInventory oldRootSnapshot : oldRootSnapshots) { VolumeSnapshotVO snapshot = findByUuid(oldRootSnapshot.getUuid(), VolumeSnapshotVO.class); + oldRootVolOldAndNewInstallPaths.put(oldRootSnapshot.getPrimaryStorageInstallPath(), oldRootSnapshot.getPrimaryStorageInstallPath()); snapshot.setVolumeType(VolumeType.Data.toString()); snapshot.setPrimaryStorageInstallPath(oldRootSnapshot.getPrimaryStorageInstallPath()); merge(snapshot); } + // TODO use extension + oldRootVolOldAndNewInstallPaths.entrySet().removeIf(entry -> entry.getKey().equals(entry.getValue())); + newRootVolOldAndNewInstallPaths.entrySet().removeIf(entry -> entry.getKey().equals(entry.getValue())); + VolumeSnapshotReferenceUtils.handleVolumeInstallUrlChange(oldRootVolumeVO.getUuid(), + oldRootVolOldAndNewInstallPaths); + VolumeSnapshotReferenceUtils.handleVolumeInstallUrlChange(newRootVolumeVO.getUuid(), + newRootVolOldAndNewInstallPaths); + vm.setRootVolumeUuid(newRootVolumeVO.getUuid()); merge(vm); } @@ -1882,6 +1896,11 @@ protected void scripts() { flow(new NoRollbackFlow() { String __name__ = "unlink-volumes-old-install-path"; + @Override + public boolean skip(Map data) { + return installPathsToGc.isEmpty(); + } + @Override public void run(FlowTrigger trigger, Map data) { new While<>(installPathsToGc.entrySet()).each((entry, compl) -> { @@ -2014,16 +2033,23 @@ public void run(FlowTrigger trigger, Map data) { new SQLBatch() { @Override protected void scripts() { + Map oldAndNewInstallPaths = new HashMap<>(); + oldAndNewInstallPaths.put(self.getInstallPath(), changedVolume.getInstallPath()); self.setType(msg.getType()); self.setInstallPath(changedVolume.getInstallPath()); merge(self); for (VolumeSnapshotInventory changedSnapshot : changedSnapshots) { VolumeSnapshotVO snapshot = findByUuid(changedSnapshot.getUuid(), VolumeSnapshotVO.class); + oldAndNewInstallPaths.put(snapshot.getPrimaryStorageInstallPath(), changedSnapshot.getPrimaryStorageInstallPath()); snapshot.setVolumeType(msg.getType().toString()); snapshot.setPrimaryStorageInstallPath(changedSnapshot.getPrimaryStorageInstallPath()); merge(snapshot); } + + // TODO use extension + oldAndNewInstallPaths.entrySet().removeIf(entry -> entry.getKey().equals(entry.getValue())); + VolumeSnapshotReferenceUtils.handleVolumeInstallUrlChange(self.getUuid(), oldAndNewInstallPaths); } }.execute(); trigger.next(); @@ -2033,6 +2059,11 @@ protected void scripts() { flow(new NoRollbackFlow() { String __name__ = "unlink-volume-old-install-path"; + @Override + public boolean skip(Map data) { + return installPathToGc == null; + } + @Override public void run(FlowTrigger trigger, Map data) { UnlinkBitsOnPrimaryStorageMsg umsg = new UnlinkBitsOnPrimaryStorageMsg(); @@ -2933,6 +2964,8 @@ public void rollback(FlowRollback trigger, Map data) { DeleteVolumeSnapshotGroupInnerMsg imsg = new DeleteVolumeSnapshotGroupInnerMsg(); imsg.setUuid(((VolumeSnapshotGroupInventory) data.get(SNAPSHOT_GROUP_INV)).getUuid()); imsg.setDeletionMode(DeletionMode.Permissive); + imsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + imsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); bus.makeTargetServiceIdByResourceUuid(imsg, VolumeSnapshotConstant.SERVICE_ID, imsg.getUuid()); VolumeSnapshotGroupOverlayMsg omsg = new VolumeSnapshotGroupOverlayMsg(); omsg.setVmInstanceUuid(self.getVmInstanceUuid()); @@ -3390,212 +3423,29 @@ public void run(MessageReply reply) { }); } - private void undoSnapShotCreation(UndoSnapshotCreationMsg msg, ReturnValueCompletion completion) { - UndoSnapshotCreationReply reply = new UndoSnapshotCreationReply(); - VolumeSnapshotVO snapShot = dbf.findByUuid(msg.getSnapShot().getUuid(), VolumeSnapshotVO.class); - if (snapShot == null) { - logger.info(String.format("snapshot:%s has been deleted", msg.getSnapShot().getUuid())); - reply.setVolume(getSelfInventory()); - completion.success(reply); - return; - } - - FlowChain chain = FlowChainBuilder.newShareFlowChain(); - // currently, we only deal with overlay commit to snapshot - // TODO expand msg properties to support intermediate commit - chain.setName(String.format("undo-snapshot-snapshot-%s-creation", snapShot.getUuid())); - chain.then(new ShareFlow() { - String originVolumePath = self.getInstallPath(); - String newVolumeInstallPath; - long size; - - @Override - public void setup() { - flow(new NoRollbackFlow() { - String __name__ = "undo-snapshot-creation-on-primary-storage"; - - @Override - public void run(FlowTrigger trigger, Map data) { - UndoSnapshotCreationOnPrimaryStorageMsg bmsg = new UndoSnapshotCreationOnPrimaryStorageMsg(); - bmsg.setVolume(getSelfInventory()); - bmsg.setDstPath(snapShot.getPrimaryStorageInstallPath()); - bmsg.setSrcPath(originVolumePath); - bmsg.setSnapshot(VolumeSnapshotInventory.valueOf(snapShot)); - bmsg.setVmUuid(self.getVmInstanceUuid()); - bmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - bus.makeTargetServiceIdByResourceUuid(bmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(bmsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - trigger.fail(reply.getError()); - return; - } - - UndoSnapshotCreationOnPrimaryStorageReply treply = (UndoSnapshotCreationOnPrimaryStorageReply) reply; - newVolumeInstallPath = treply.getNewVolumeInstallPath(); - size = treply.getSize(); - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "delete-origin-volume-bits"; - - @Override - public boolean skip(Map data) { - return originVolumePath.equals(newVolumeInstallPath); - } - - @Override - public void run(FlowTrigger trigger, Map data) { - DeleteVolumeBitsOnPrimaryStorageMsg dmsg = new DeleteVolumeBitsOnPrimaryStorageMsg(); - dmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - dmsg.setInstallPath(originVolumePath); - dmsg.setSize(self.getSize()); - dmsg.setBitsType(VolumeVO.class.getSimpleName()); - dmsg.setBitsUuid(self.getUuid()); - dmsg.setHypervisorType(VolumeFormat.getMasterHypervisorTypeByVolumeFormat(getSelfInventory().getFormat()).toString()); - dmsg.setFolder(false); - dmsg.setFromRecycle(true); - bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(dmsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - if (reply.getError().isError(VolumeErrors.VOLUME_IN_USE)) { - logger.warn(String.format("unable to delete path:%s right now", originVolumePath)); - } - - trigger.fail(reply.getError()); - return; - } - - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "update-db-install-path"; - - @Override - public boolean skip(Map data) { - return originVolumePath.equals(newVolumeInstallPath); - } - - @Override - public void run(FlowTrigger trigger, Map data) { - MarkSnapshotAsVolumeMsg mmsg = new MarkSnapshotAsVolumeMsg(); - mmsg.setVolumeUuid(self.getUuid()); - mmsg.setSnapshotUuid(snapShot.getUuid()); - mmsg.setSize(size); - mmsg.setVolumePath(newVolumeInstallPath); - mmsg.setTreeUuid(snapShot.getTreeUuid()); - bus.makeTargetServiceIdByResourceUuid(mmsg, VolumeSnapshotConstant.SERVICE_ID, snapShot.getUuid()); - bus.send(mmsg, new CloudBusCallBack(trigger) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.warn(String.format("mark snapshot:%s as volume failed", snapShot.getUuid())); - trigger.fail(reply.getError()); - return; - } - - trigger.next(); - } - }); - } - }); - - flow(new NoRollbackFlow() { - String __name__ = "release-origin-volume-size"; - - @Override - public void run(FlowTrigger trigger, Map data) { - RecalculatePrimaryStorageCapacityMsg rmsg = new RecalculatePrimaryStorageCapacityMsg(); - rmsg.setPrimaryStorageUuid(self.getPrimaryStorageUuid()); - bus.makeTargetServiceIdByResourceUuid(rmsg, PrimaryStorageConstant.SERVICE_ID, self.getPrimaryStorageUuid()); - bus.send(rmsg); - trigger.next(); - } - }); - - done(new FlowDoneHandler(completion) { - @Override - public void handle(Map data) { - refreshVO(); - reply.setVolume(getSelfInventory()); - completion.success(reply); - } - }); - - error(new FlowErrorHandler(completion) { - @Override - public void handle(ErrorCode errCode, Map data) { - completion.fail(errCode); - } - }); - } - }).start(); - } - - private void handle(UndoSnapshotCreationMsg msg) { - thdf.chainSubmit(new ChainTask(msg) { - @Override - public String getSyncSignature() { - return String.format("volume-%s-undo-snapshot-creation", self.getUuid()); - } - - @Override - public void run(final SyncTaskChain chain) { - undoSnapShotCreation(msg, new ReturnValueCompletion(chain) { - - @Override - public void success(UndoSnapshotCreationReply returnValue) { - bus.reply(msg, returnValue); - chain.next(); - } - - @Override - public void fail(ErrorCode errorCode) { - UndoSnapshotCreationReply reply = new UndoSnapshotCreationReply(); - reply.setError(errorCode); - bus.reply(msg, reply); - chain.next(); - } - }); - } - - @Override - public String getName() { - return String.format("volume-%s-undo-snapshot-creation", self.getUuid()); - } - }); - } - private void handle(APIUndoSnapshotCreationMsg msg) { APIUndoSnapshotCreationEvent evt = new APIUndoSnapshotCreationEvent(msg.getId()); VolumeSnapshotVO snapShot = dbf.findByUuid(msg.getSnapShotUuid(), VolumeSnapshotVO.class); - UndoSnapshotCreationMsg vmsg = new UndoSnapshotCreationMsg(); - vmsg.setVmInstanceUuid(self.getVmInstanceUuid()); - vmsg.setVolumeUuid(msg.getVolumeUuid()); - vmsg.setSnapShot(VolumeSnapshotInventory.valueOf(snapShot)); - bus.makeTargetServiceIdByResourceUuid(vmsg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid()); - bus.send(vmsg, new CloudBusCallBack(msg) { + DeleteVolumeSnapshotMsg dmsg = new DeleteVolumeSnapshotMsg(); + dmsg.setTreeUuid(snapShot.getTreeUuid()); + dmsg.setVolumeUuid(snapShot.getVolumeUuid()); + dmsg.setSnapshotUuid(snapShot.getUuid()); + dmsg.setDeletionMode(APIDeleteMessage.DeletionMode.Permissive); + dmsg.setScope(DeleteVolumeSnapshotScope.Single.toString()); + dmsg.setDirection(DeleteVolumeSnapshotDirection.Commit.toString()); + + bus.makeTargetServiceIdByResourceUuid(dmsg, VolumeSnapshotConstant.SERVICE_ID, snapShot.getUuid()); + bus.send(dmsg, new CloudBusCallBack(msg) { @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - evt.setError(reply.getError()); + public void run(MessageReply r) { + if (!r.isSuccess()) { + evt.setError(r.getError()); bus.publish(evt); return; } - UndoSnapshotCreationReply gr = reply.castReply(); - evt.setInventory(gr.getVolume()); + VolumeVO volumeVO = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, snapShot.getVolumeUuid()).find(); + evt.setInventory(VolumeInventory.valueOf(volumeVO)); bus.publish(evt); } }); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java b/storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java new file mode 100644 index 00000000000..0821d2c41b7 --- /dev/null +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeConfigsGetter.java @@ -0,0 +1,35 @@ +package org.zstack.storage.volume; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.volume.VolumeConfigs; +import org.zstack.header.volume.VolumeConfigsExtensionPoint; + +import java.util.List; + +/** + * @ Author : yh.w + * @ Date : Created in 11:00 2025/2/5 + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class VolumeConfigsGetter { + + @Autowired + private PluginRegistry pluginRgty; + + public VolumeConfigs getConfigs(String volUuid) { + VolumeConfigs cfs = new VolumeConfigs(); + List exts = pluginRgty.getExtensionList(VolumeConfigsExtensionPoint.class); + if (exts.isEmpty()) { + return cfs; + } + + for (VolumeConfigsExtensionPoint ext : exts) { + ext.setVolumeConfigs(cfs, volUuid); + } + + return cfs; + } +} diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java index fe0a7dc4187..76e8bc229a8 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -66,7 +66,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import static org.zstack.header.host.HostStatus.Connected; @@ -143,6 +142,8 @@ private void handleLocalMessage(Message msg) { handle((BatchSyncManagedActiveVolumeSizeMsg) msg); } else if (msg instanceof BatchSyncActiveVolumeSizeOnHostMsg) { handle((BatchSyncActiveVolumeSizeOnHostMsg) msg); + } else if (msg instanceof CreateDataVolumeMsg) { + handle((CreateDataVolumeMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -349,7 +350,7 @@ public void run(final FlowTrigger trigger, Map data) { } if (vvo.isShareable()) { - amsg.setPossiblePrimaryStorageTypes(PrimaryStorageType.getSupportFeaturesTypes(PrimaryStorageType::isSupportSharedVolume)); + amsg.setRequiredFeatures(Collections.singleton(PrimaryStorageFeature.SHARED_VOLUME)); } bus.makeLocalServiceId(amsg, PrimaryStorageConstant.SERVICE_ID); @@ -1008,8 +1009,8 @@ public void run(MessageReply reply) { }); } - private void handle(APICreateDataVolumeMsg msg) { - APICreateDataVolumeEvent evt = new APICreateDataVolumeEvent(msg.getId()); + private void handle(CreateDataVolumeMsg msg) { + CreateVolumeReply reply = new CreateVolumeReply(); pluginRgty.getExtensionList(CreateDataVolumeExtensionPoint.class).forEach(extensionPoint -> { extensionPoint.preCreateVolume(msg); }); @@ -1027,7 +1028,7 @@ private void handle(APICreateDataVolumeMsg msg) { vo.setActualSize(0L); vo.setType(VolumeType.Data); vo.setStatus(VolumeStatus.NotInstantiated); - vo.setAccountUuid(msg.getSession().getAccountUuid()); + vo.setAccountUuid(msg.getAccountUuid()); if (msg.getSystemTags() != null) { Iterator iterators = msg.getSystemTags().iterator(); @@ -1060,7 +1061,10 @@ protected VolumeVO scripts() { } }.execute(); - tagMgr.createTagsFromAPICreateMessage(msg, finalVo1.getUuid(), VolumeVO.class.getSimpleName()); + if (msg.getApiMsg() != null) { + tagMgr.createTagsFromAPICreateMessage(msg.getApiMsg(), finalVo1.getUuid(), VolumeVO.class.getSimpleName()); + } + for (CreateDataVolumeExtensionPoint ext : exts) { ext.afterCreateVolume(vo); } @@ -1079,9 +1083,9 @@ protected VolumeVO scripts() { new FireVolumeCanonicalEvent().fireVolumeStatusChangedEvent(null, VolumeInventory.valueOf(vo)); VolumeInventory inv = VolumeInventory.valueOf(vo); - evt.setInventory(inv); + reply.setInventory(inv); logger.debug(String.format("Successfully created data volume[name:%s, uuid:%s, size:%s]", inv.getName(), inv.getUuid(), inv.getSize())); - bus.publish(evt); + bus.reply(msg, reply); return; } @@ -1093,15 +1097,42 @@ protected VolumeVO scripts() { bus.makeTargetServiceIdByResourceUuid(imsg, VolumeConstant.SERVICE_ID, vo.getUuid()); VolumeVO finalVo = vo; bus.send(imsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply r) { + InstantiateVolumeReply cr = r.castReply(); + if (!cr.isSuccess()) { + dbf.remove(finalVo); + reply.setError(cr.getError()); + } else { + reply.setInventory(cr.getVolume()); + } + bus.reply(msg, reply); + } + }); + } + + private void handle(APICreateDataVolumeMsg msg) { + APICreateDataVolumeEvent evt = new APICreateDataVolumeEvent(msg.getId()); + CreateDataVolumeMsg cmsg = new CreateDataVolumeMsg(); + cmsg.setAccountUuid(msg.getSession().getAccountUuid()); + cmsg.setDiskSize(msg.getDiskSize()); + cmsg.setName(msg.getName()); + cmsg.setResourceUuid(msg.getResourceUuid()); + cmsg.setSystemTags(msg.getSystemTags()); + cmsg.setDiskOfferingUuid(msg.getDiskOfferingUuid()); + cmsg.setPrimaryStorageUuid(msg.getPrimaryStorageUuid()); + cmsg.setDescription(msg.getDescription()); + cmsg.setApiMsg(msg); + bus.makeLocalServiceId(cmsg, VolumeConstant.SERVICE_ID); + bus.send(cmsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply reply) { + CreateVolumeReply cr = reply.castReply(); if (!reply.isSuccess()) { - dbf.remove(finalVo); evt.setError(reply.getError()); } else { - evt.setInventory(((InstantiateVolumeReply) reply).getVolume()); + evt.setInventory(cr.getInventory()); } - bus.publish(evt); } }); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java index 5903931018b..d20cebd9592 100644 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java @@ -3,10 +3,10 @@ import org.zstack.header.core.NonCloneable; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.tag.TagDefinition; -import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.volume.VolumeVO; import org.zstack.tag.EphemeralSystemTag; import org.zstack.tag.PatternedSystemTag; +import org.zstack.tag.SystemTag; /** * Created by miao on 12/23/16. @@ -21,7 +21,6 @@ public class VolumeSystemTags { public static String VOLUME_PROVISIONING_STRATEGY_TOKEN = "volumeProvisioningStrategy"; public static PatternedSystemTag VOLUME_PROVISIONING_STRATEGY = new PatternedSystemTag(String.format("volumeProvisioningStrategy::{%s}", VOLUME_PROVISIONING_STRATEGY_TOKEN), VolumeVO.class); - public static String PRIMARY_STORAGE_VOLUME_PROVISIONING_STRATEGY_TOKEN = "primaryStorageVolumeProvisioningStrategy"; public static PatternedSystemTag PRIMARY_STORAGE_VOLUME_PROVISIONING_STRATEGY = new PatternedSystemTag(String.format("primaryStorageVolumeProvisioningStrategy::{%s}", PRIMARY_STORAGE_VOLUME_PROVISIONING_STRATEGY_TOKEN), PrimaryStorageVO.class); @@ -43,6 +42,14 @@ public class VolumeSystemTags { @NonCloneable public static EphemeralSystemTag FLATTEN = new EphemeralSystemTag("volume::flatten"); + @NonCloneable + public static EphemeralSystemTag FORMAT_QCOW2 = new EphemeralSystemTag("volume::format::qcow2"); + + @NonCloneable + public static EphemeralSystemTag NO_ZERO_FILLED_VOLUME = new EphemeralSystemTag("volume::noZeroFilled"); + public static String VOLUME_QOS_TOKEN = "qos"; public static PatternedSystemTag VOLUME_QOS = new PatternedSystemTag(String.format("%s::{%s}", VOLUME_QOS_TOKEN, VOLUME_QOS_TOKEN), VolumeVO.class); + + public static SystemTag FAST_REVERT = new SystemTag("fast::revert", VolumeVO.class); } diff --git a/tag/pom.xml b/tag/pom.xml index 6fcb961de9e..1ea0b24c986 100755 --- a/tag/pom.xml +++ b/tag/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java b/tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java new file mode 100644 index 00000000000..9ba80b05b51 --- /dev/null +++ b/tag/src/main/java/org/zstack/tag/EphemeralPatternSystemTag.java @@ -0,0 +1,13 @@ +package org.zstack.tag; + +import org.zstack.header.tag.TagConstant; + +public class EphemeralPatternSystemTag extends PatternedSystemTag { + public EphemeralPatternSystemTag(String tagFormat, Class resourceClass) { + super(String.format("%s::%s", TagConstant.EPHEMERAL_TAG_PREFIX, tagFormat), resourceClass); + } + + public String getTagFormatWithoutEphemeralPrefix() { + return tagFormat.substring(String.format("%s::", TagConstant.EPHEMERAL_TAG_PREFIX).length()); + } +} diff --git a/tag/src/main/java/org/zstack/tag/TagManagerImpl.java b/tag/src/main/java/org/zstack/tag/TagManagerImpl.java index 04245ec336f..b3c916391a2 100755 --- a/tag/src/main/java/org/zstack/tag/TagManagerImpl.java +++ b/tag/src/main/java/org/zstack/tag/TagManagerImpl.java @@ -94,7 +94,13 @@ private void initSystemTags() throws IllegalAccessException { f.getDeclaringClass(), f.getName())); } - if (PatternedSystemTag.class.isAssignableFrom(f.getType())) { + if (EphemeralPatternSystemTag.class.isAssignableFrom(f.getType())) { + EphemeralPatternSystemTag ptag = new EphemeralPatternSystemTag(((EphemeralPatternSystemTag) stag).getTagFormatWithoutEphemeralPrefix(), stag.getResourceClass()); + ptag.setValidators(stag.getValidators()); + f.set(null, ptag); + systemTags.add(ptag); + stag = ptag; + } else if (PatternedSystemTag.class.isAssignableFrom(f.getType())) { PatternedSystemTag ptag = new PatternedSystemTag(stag.getTagFormat(), stag.getResourceClass()); ptag.setValidators(stag.getValidators()); f.set(null, ptag); diff --git a/test/pom.xml b/test/pom.xml index d1881f18656..9a40ae9864c 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -9,7 +9,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. test diff --git a/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy b/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy index a02602cc64d..94f1fb161d0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/console/ConsoleProxyCase.groovy @@ -195,6 +195,14 @@ class ConsoleProxyCase extends SubCase { } ConsoleProxyAgentVO agent = dbf.listAll(ConsoleProxyAgentVO)[0] + + updateConsoleProxyAgent { + uuid = agent.uuid + consoleProxyOverriddenIp = "127.0.0.2" + } + agent = dbf.reload(agent) + assert agent.consoleProxyOverriddenIp == "127.0.0.2" + updateConsoleProxyAgent { uuid = agent.uuid consoleProxyOverriddenIp = "127.0.0.1" diff --git a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy index 4b19fab9251..a15b6ca72f0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/ElaborationCase.groovy @@ -86,10 +86,14 @@ class ElaborationCase extends SubCase { def err = operr("certificate has expired or is not yet valid") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "Error message: The current system time has expired for ImageStore certificate. Possible reason: ImageStore server system time or certificate is modified." + assert err.messages.message_en != null + assert err.messages.message_cn == null err = operr("The state of vm[uuid:%s] is %s. Only these state[Running,Stopped] is allowed to update cpu or memory.", Platform.uuid, "Rebooting") as ErrorCode assert err.elaboration != null assert err.elaboration.trim() == "Error message: Only VMs with the status [Running, Stopped] support CPU/memory update. Current status: Rebooting." + assert err.messages.message_en != null + assert err.messages.message_cn == null err = operr("test for missed error") as ErrorCode assert err.elaboration == null diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy index 675c6b5a4e6..2e756f5ad37 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBus3Case.groovy @@ -1,9 +1,14 @@ package org.zstack.test.integration.core.cloudbus +import org.zstack.core.CoreGlobalProperty import org.zstack.core.Platform import org.zstack.core.cloudbus.* import org.zstack.core.db.DatabaseFacade +import org.zstack.core.thread.SyncThread +import org.zstack.core.thread.ThreadFacade import org.zstack.header.AbstractService +import org.zstack.header.core.FutureCompletion +import org.zstack.header.core.progress.ChainInfo import org.zstack.header.errorcode.OperationFailureException import org.zstack.header.errorcode.SysErrors import org.zstack.header.managementnode.ManagementNodeInventory @@ -22,6 +27,9 @@ import java.util.concurrent.TimeUnit import java.util.function.Consumer class CloudBus3Case extends SubCase { + AbstractService service + CloudBus bus + @Override void clean() { } @@ -222,16 +230,13 @@ class CloudBus3Case extends SubCase { def qmsg = new APIQueryVmInstanceMsg() qmsg.setTimeout(1L) - bus.makeLocalServiceId(qmsg, SERVICE_ID) bus.makeServiceIdByManagementNodeId(qmsg, SERVICE_ID, "some-fake-uuid") MessageReply r = bus.call(qmsg) assert r.error.isError(SysErrors.TIMEOUT) qmsg = new APIQueryVmInstanceMsg() - qmsg.setTimeout(2L) - bus.makeLocalServiceId(qmsg, SERVICE_ID) - bus.makeServiceIdByManagementNodeId(qmsg, SERVICE_ID, "some-fake-uuid") + bus.makeServiceIdByManagementNodeId(qmsg, SERVICE_ID, "some-fake-uuid2") expect(OperationFailureException.class) { bus.call(qmsg) @@ -240,10 +245,224 @@ class CloudBus3Case extends SubCase { bus.unregisterService(service) } + void testFutureCompletionSend() { + CloudBus bus = bean(CloudBus.class) + String SERVICE_ID = "testFutureCompletionSend" + + if (service == null) { + service = new AbstractService() { + @Override + void handleMessage(Message msg) { + bus.reply(msg, new MessageReply()) + } + + @Override + String getId() { + return bus.makeLocalServiceId(SERVICE_ID) + } + + @Override + boolean start() { + return true + } + + @Override + boolean stop() { + return true + } + } + + bus.registerService(service) + } + + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(msg, SERVICE_ID) + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert completion.isSuccess() + assert !completion.isTimeout() + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(nrMsg, SERVICE_ID) + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert completion2.isSuccess() + assert !completion2.isTimeout() + retryInSecs { + assert replyHolder[0] != null + assert replyHolder[0].isSuccess() + } + } + + void testFutureCompletionSendToNonExistService() { + CloudBus bus = bean(CloudBus.class) + String NON_EXIST_SERVICE_ID = "NonExistService" + Platform.uuid + + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(msg, NON_EXIST_SERVICE_ID) + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert completion.isSuccess() + + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + bus.makeLocalServiceId(nrMsg, NON_EXIST_SERVICE_ID) + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert completion2.isSuccess() + retryInSecs { + assert replyHolder[0] != null + assert !replyHolder[0].isSuccess() + } + } + + void testFutureCompletionSendTimeout() { + CloudBus bus = bean(CloudBus.class) + String SERVICE_ID = "testFutureCompletionSendTimeout" + + def service = new AbstractService() { + @Override + void handleMessage(Message msg) { + // Do not reply to simulate timeout + try { + Thread.sleep(3000) + } catch (InterruptedException e) { + e.printStackTrace() + } + } + + @Override + String getId() { + return bus.makeLocalServiceId(SERVICE_ID) + } + + @Override + boolean start() { + return true + } + + @Override + boolean stop() { + return true + } + } + + bus.registerService(service) + + // test timeout (Message msg) + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + msg.setTimeout(1) + bus.makeLocalServiceId(msg, SERVICE_ID) + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert completion.isSuccess() + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + nrMsg.setTimeout(1) + bus.makeLocalServiceId(nrMsg, SERVICE_ID) + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert completion2.isSuccess() + retryInSecs { + assert replyHolder[0] != null + assert !replyHolder[0].isSuccess() + assert replyHolder[0].error.isError(SysErrors.TIMEOUT) + } + + bus.unregisterService(service) + } + + void testFutureCompletionSendToMissingNode() { + CloudBus bus = bean(CloudBus.class) + String SERVICE_ID = "testFutureCompletionSendToMissingNode" + + StartVmInstanceMsg msg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + msg.setTimeout(2) + bus.makeServiceIdByManagementNodeId(msg, SERVICE_ID, "fake-management-node-uuid") + FutureCompletion completion = bus.send(msg) + completion.await(5000L) + assert !completion.isSuccess() + + MessageReply[] replyHolder = new MessageReply[1] + NeedReplyMessage nrMsg = new StartVmInstanceMsg(vmInstanceUuid: Platform.uuid) + nrMsg.setTimeout(2) + bus.makeServiceIdByManagementNodeId(nrMsg, SERVICE_ID, "fake-management-node-uuid") + FutureCompletion completion2 = bus.send(nrMsg, new CloudBusCallBack(null) { + @Override + void run(MessageReply reply) { + replyHolder[0] = reply + } + }) + completion2.await(5000L) + assert !completion2.isSuccess() + assert completion2.getErrorCode() != null + + retryInSecs { + assert replyHolder[0] != null + assert !replyHolder[0].isSuccess() + // TODO + // assert replyHolder[0].error.isError(SysErrors.MANAGEMENT_NODE_UNAVAILABLE_ERROR) + } + } + + void testSendQueue() { + def threads = [] + 1.upto(50) { i -> + Thread t = Thread.start { + new MessageSender().sendMsg() + } + threads << t + } + + ThreadFacade thdf = bean(ThreadFacade.class) + + ChainInfo info = thdf.getChainTaskInfo("http-send-in-queue") + assert info.runningTask.size() <= 1 + sleep(100) + info = thdf.getChainTaskInfo("http-send-in-queue") + assert info.runningTask.size() <= 1 + + threads.each { it.join() } + } + @Override void test() { + bus = bean(CloudBus.class) + testStepSend() testManagementNodeGone() testSendToMissingNode() + testFutureCompletionSend() + testFutureCompletionSendToNonExistService() + testFutureCompletionSendTimeout() + testFutureCompletionSendToMissingNode() + CloudBusGlobalProperty.HTTP_ALWAYS = true + + testFutureCompletionSend() + testFutureCompletionSendToNonExistService() + testFutureCompletionSendTimeout() + testFutureCompletionSendToMissingNode() + + testSendQueue() + bus.unregisterService(service) + CloudBusGlobalProperty.HTTP_ALWAYS = false } } diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy index 44fa4def7e0..e3ab4170478 100644 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/CloudBusCase.groovy @@ -2,11 +2,13 @@ package org.zstack.test.integration.core.cloudbus import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBusCallBack +import org.zstack.core.cloudbus.CloudBusGlobalProperty import org.zstack.core.cloudbus.CloudBusIN import org.zstack.core.errorcode.ErrorFacade import org.zstack.core.thread.AsyncThread import org.zstack.header.AbstractService import org.zstack.header.errorcode.ErrorCodeList +import org.zstack.header.errorcode.SysErrors import org.zstack.header.message.Message import org.zstack.header.message.MessageReply import org.zstack.testlib.SkipTestSuite @@ -76,6 +78,8 @@ class CloudBusCase extends SubCase{ def r = new MessageReply() r.setError(errf.stringToOperationError("fake first error", [operr("origin error")])) bus.reply(msg, r) + } else if (msg instanceof FakeNeedReplyMessage4) { + // no reply } } @@ -126,6 +130,28 @@ class CloudBusCase extends SubCase{ assert r.error instanceof ErrorCodeList assert r.error.causes[0] instanceof ErrorCodeList assert r.error.causes[0].causes[0] instanceof ErrorCodeList + + CloudBusGlobalProperty.SYNC_CALL_TIMEOUT = TimeUnit.MINUTES.toMillis(1) + def msg4 = new FakeNeedReplyMessage4() + bus.makeTargetServiceIdByResourceUuid(msg4, servId, Platform.getUuid()) + def reply = bus.call(msg4) + assert !reply.isSuccess() + assert reply.getError().isError(SysErrors.TIMEOUT) + + List msgs = new ArrayList<>() + for (final def i in (1..5)) { + def m = new FakeNeedReplyMessage4() + bus.makeTargetServiceIdByResourceUuid(m, servId, Platform.getUuid()) + msgs.add(m) + } + def messageReplies = bus.call(msgs) + assert messageReplies.size() == 5 + for (final def rr in messageReplies) { + assert !rr.isSuccess() + assert rr.getError().isError(SysErrors.TIMEOUT) + } + + CloudBusGlobalProperty.SYNC_CALL_TIMEOUT = TimeUnit.MINUTES.toMillis(15) } @Override diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java new file mode 100644 index 00000000000..9a89029cf05 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/FakeNeedReplyMessage4.java @@ -0,0 +1,6 @@ +package org.zstack.test.integration.core.cloudbus; + +import org.zstack.header.message.NeedReplyMessage; + +public class FakeNeedReplyMessage4 extends NeedReplyMessage { +} diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy index 2b7a0a7c2f3..5edf88e951d 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/ManagementNodeNotFoundHandlerCase.groovy @@ -3,10 +3,12 @@ package org.zstack.test.integration.core.cloudbus import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus import org.zstack.core.cloudbus.CloudBusGlobalConfig +import org.zstack.core.cloudbus.DeadMessageManager import org.zstack.core.cloudbus.DeadMessageManagerImpl import org.zstack.core.cloudbus.EventFacade import org.zstack.core.db.DatabaseFacade import org.zstack.header.AbstractService +import org.zstack.header.core.FutureCompletion import org.zstack.header.managementnode.ManagementNodeCanonicalEvent import org.zstack.header.managementnode.ManagementNodeInventory import org.zstack.header.managementnode.ManagementNodeState @@ -22,6 +24,8 @@ import org.zstack.testlib.SubCase import java.util.concurrent.TimeUnit class ManagementNodeNotFoundHandlerCase extends SubCase { + DeadMessageManagerImpl mgr + @Override void clean() { } @@ -33,7 +37,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { @Override void environment() { - DeadMessageManagerImpl mgr = bean(DeadMessageManagerImpl.class) + mgr = bean(DeadMessageManagerImpl.class) mgr.managementNodeNotFoundHandlers.invalidateAll() mgr.managementNodeNotFoundHandlers.cleanUp() @@ -46,7 +50,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { ManagementNodeVO vo = new ManagementNodeVO( hostName: "127.0.0.10", // mock a future heartbeat - heartBeat: new Date(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1)).toTimestamp(), + heartBeat: new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5)).toTimestamp(), uuid: mgmtUuid, port: 8989, state: ManagementNodeState.RUNNING @@ -74,6 +78,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { def secondNodeService = new AbstractService() { @Override void handleMessage(Message msg) { + logger.debug("received message[${msg.id}] on service[${getId()}]") message = msg } @@ -95,17 +100,18 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { StartVmInstanceReply reply = new StartVmInstanceReply() bus.makeServiceIdByManagementNodeId(reply, secondServiceName, secondNodeUuid) - bus.send(reply) + FutureCompletion c = bus.send(reply) assert message == null bus.registerService(secondNodeService) + c.await() + assert !mgr.managementNodeNotFoundHandlers.asMap().values().message.contains(reply) Closure cleanup = mockAManagementNode(secondNodeUuid) - retryInSecs { - assert message == null - } + sleep(1000) + assert message == null cleanup() bus.unregisterService(secondNodeService) @@ -120,6 +126,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { def secondNodeService = new AbstractService() { @Override void handleMessage(Message msg) { + logger.debug("received message[${msg.id}] on service[${getId()}]") message = msg } @@ -141,17 +148,17 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { StartVmInstanceMsg msg = new StartVmInstanceMsg() bus.makeServiceIdByManagementNodeId(msg, secondServiceName, secondNodeUuid) - bus.send(msg) + FutureCompletion c = bus.send(msg) assert message == null bus.registerService(secondNodeService) - + c.await() + assert !mgr.managementNodeNotFoundHandlers.asMap().values().message.contains(msg) Closure cleanup = mockAManagementNode(secondNodeUuid) - retryInSecs { - assert message == null - } + sleep(1000) + assert message == null cleanup() bus.unregisterService(secondNodeService) @@ -166,6 +173,7 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { def secondNodeService = new AbstractService() { @Override void handleMessage(Message msg) { + logger.debug("received message[${msg.id}] on service[${getId()}]") message = msg } @@ -190,12 +198,15 @@ class ManagementNodeNotFoundHandlerCase extends SubCase { StartVmInstanceReply reply = new StartVmInstanceReply() bus.makeServiceIdByManagementNodeId(reply, secondServiceName, secondNodeUuid) - bus.send(reply) + FutureCompletion c = bus.send(reply) assert message == null bus.registerService(secondNodeService) + // send is a async operation, so we need to wait a bit + c.await() + assert mgr.managementNodeNotFoundHandlers.asMap().values().message.contains(reply) Closure cleanup = mockAManagementNode(secondNodeUuid) retryInSecs { diff --git a/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java new file mode 100644 index 00000000000..24aabd81056 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/core/cloudbus/MessageSender.java @@ -0,0 +1,43 @@ +package org.zstack.test.integration.core.cloudbus; + +import org.zstack.core.Platform; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.thread.SyncTask; +import org.zstack.core.thread.SyncThread; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.core.FutureCompletion; +import org.zstack.header.vm.StartVmInstanceMsg; + +public class MessageSender { + + void sendMsg() { + CloudBus bus = Platform.getComponentLoader().getComponent(CloudBus.class); + ThreadFacade thread = Platform.getComponentLoader().getComponent(ThreadFacade.class); + + thread.syncSubmit(new SyncTask() { + @Override + public Void call() throws Exception { + StartVmInstanceMsg msg = new StartVmInstanceMsg(); + bus.makeLocalServiceId(msg, "testFutureCompletionSend"); + FutureCompletion completion = bus.send(msg); + completion.await(5000L); + return null; + } + + @Override + public String getName() { + return "MessageSender.sendMsg"; + } + + @Override + public int getSyncLevel() { + return 1; + } + + @Override + public String getSyncSignature() { + return getName(); + } + }); + } +} diff --git a/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy b/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy index f125a2a3247..fb03e56b403 100755 --- a/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/core/config/GlobalConfigCase.groovy @@ -1,11 +1,10 @@ package org.zstack.test.integration.core.config -import org.zstack.core.config.GlobalConfigException import org.zstack.compute.vm.VmGlobalConfig import org.zstack.core.Platform import org.zstack.core.cloudbus.EventFacade -import org.zstack.core.config.GlobalConfig import org.zstack.core.config.GlobalConfigCanonicalEvents +import org.zstack.core.config.GlobalConfigException import org.zstack.core.config.GlobalConfigFacadeImpl import org.zstack.core.config.GlobalConfigVO import org.zstack.core.config.GlobalConfigVO_ @@ -17,16 +16,17 @@ import org.zstack.core.db.UpdateQuery import org.zstack.header.vm.APICreateVmNicMsg import org.zstack.image.ImageGlobalConfig import org.zstack.kvm.KVMGlobalConfig -import org.zstack.sdk.GlobalConfigInventory -import org.zstack.sdk.UpdateGlobalConfigAction -import org.zstack.sdk.GetGlobalConfigOptionsResult +import org.zstack.sdk.* import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase +import java.util.concurrent.TimeUnit + import static org.zstack.utils.CollectionDSL.e import static org.zstack.utils.CollectionDSL.map import static org.zstack.utils.StringDSL.s + /** * Created by miao on 17-5-4. */ @@ -55,6 +55,7 @@ class GlobalConfigCase extends SubCase { @Override void test() { env.create { + testSdk() testTolerateDatabaseDirtyData() testUpdateIntegerConfigWithFloatValue() testFloatPointNumberTolerance() @@ -70,6 +71,47 @@ class GlobalConfigCase extends SubCase { } } + void testSdk() { + def zone = env.inventoryByName("zone") as ZoneInventory + + int port = 8989 + String WEB_HOOK_PATH = "http://127.0.0.1:$port/sdk/webook" + + def config = new ZSConfig.Builder() + .setHostname("127.0.0.1") + .setPort(port) + .setDefaultPollingInterval(100, TimeUnit.MILLISECONDS) + .setDefaultPollingTimeout(300000, TimeUnit.MILLISECONDS) + .setReadTimeout(10, TimeUnit.MINUTES) + .setWriteTimeout(10, TimeUnit.MINUTES) + .build() + + LogInByAccountAction a = new LogInByAccountAction(); + a.accountName = "admin" + a.password = "password" + a.call(); + + a = new LogInByAccountAction(); + a.accountName = "admin" + a.password = "password" + a.call(); + + ApiResult r = ZSClient.callWithConfig(a, config) + a = new LogInByAccountAction(); + a.accountName = "admin" + a.password = "password" + a.call(); + ZSClient.callWithConfig(a, ZSClient.getConfig()) + + CreateClusterAction ca = new CreateClusterAction(); + ca.name = "cluster" + ca.zoneUuid = zone.getUuid() + ca.hypervisorType = "KVM" + ca.sessionId = adminSession() + + ZSClient.callWithConfig(ca, config) + } + void testGetConfigOptions() { testGetValidValue() testGetNumberRange() @@ -82,8 +124,8 @@ class GlobalConfigCase extends SubCase { name = KVMGlobalConfig.NESTED_VIRTUALIZATION.name } as GetGlobalConfigOptionsResult - // there are 27 valid values for category "vm.cpuMode" from KVMGlobalConfig.java - assert configOptions.options.validValue.size() == 28 + // there are 29 valid values for category "vm.cpuMode" from KVMGlobalConfig.java + assert configOptions.options.validValue.size() == 29 } void testGetNumberRange() { @@ -202,7 +244,7 @@ class GlobalConfigCase extends SubCase { conditions = ["category=${KVMGlobalConfig.RESERVED_MEMORY_CAPACITY.category}","name=${KVMGlobalConfig.RESERVED_MEMORY_CAPACITY.name}"] }[0] assert KVMGlobalConfig.RESERVED_MEMORY_CAPACITY.value(int.class) == 10 - + resetGlobalConfig {} diff --git a/test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy b/test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy new file mode 100644 index 00000000000..d243e7fb5d9 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/db/schema/QueryMoreCase.groovy @@ -0,0 +1,142 @@ +package org.zstack.test.integration.db.schema + +import org.zstack.core.db.Q +import org.zstack.header.host.HostVO +import org.zstack.header.host.HostVO_ +import org.zstack.header.identity.AccountResourceRefVO +import org.zstack.header.identity.AccountResourceRefVO_ +import org.zstack.header.vm.VmInstanceVO +import org.zstack.header.vm.VmInstanceVO_ +import org.zstack.sdk.HostInventory +import org.zstack.sdk.VmInstanceInventory +import org.zstack.test.integration.ZStackTest +import org.zstack.test.integration.identity.Env +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase + +class QueryMoreCase extends SubCase { + EnvSpec env + + VmInstanceInventory vm + HostInventory host + + @Override + void setup() { + useSpring(ZStackTest.springSpec) + } + + @Override + void environment() { + env = Env.oneVmBasicEnv() + } + + @Override + void test() { + env.create { + prepare() + testBasicQueryMode() + } + } + + void prepare() { + vm = env.inventoryByName("vm") as VmInstanceInventory + host = env.inventoryByName("kvm") as HostInventory + } + + void testBasicQueryMode() { + def q = Q.New(VmInstanceVO.class, HostVO.class) + .table0() + .eq(VmInstanceVO_.uuid, vm.uuid) + .eq(VmInstanceVO_.hostUuid).table1(HostVO_.uuid) + .table1() + .select(HostVO_.@name) + .orderByDesc(HostVO_.uuid) + + assert q.toString() == "select t1.name from VmInstanceVO t0,HostVO t1 where t0.uuid=:p0 and t0.hostUuid=t1.uuid order by t1.uuid DESC" + def list = q.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] == "kvm" + + def q2 = Q.New(HostVO.class) + .select(HostVO_.@name) + .in(HostVO_.uuid, + Q.New(VmInstanceVO.class) + .select(VmInstanceVO_.hostUuid) + .eq(VmInstanceVO_.uuid, vm.uuid) + ) + .orderByDesc(HostVO_.uuid) + + assert q2.toString() == "select t0.name from HostVO t0 where t0.uuid in (select t1.hostUuid from VmInstanceVO t1 where t1.uuid=:p0) order by t0.uuid DESC" + list = q2.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] == "kvm" + + def q3 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .select(VmInstanceVO_.clusterUuid) + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .eq(VmInstanceVO_.type, "UserVm") + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q3.toString() == "select t0.clusterUuid from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type=:p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + list = q3.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] == vm.clusterUuid + + def q4 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .selectThisTable() + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .eq(VmInstanceVO_.type, "UserVm") + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q4.toString() == "select t0 from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type=:p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + list = q4.list() + logger.info(list.toString()) + + assert list.size() == 1 + assert list[0] instanceof VmInstanceVO + assert (list[0] as VmInstanceVO).uuid == vm.uuid + + def q5 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .selectCountThisTable() + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .eq(VmInstanceVO_.type, "UserVm") + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q5.toString() == "select count(t0) from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type=:p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + long count = q5.count() + assert count == 1L + + def q6 = Q.New(VmInstanceVO.class, AccountResourceRefVO.class) + .table0() + .selectThisTable() + .eq(VmInstanceVO_.uuid).table1(AccountResourceRefVO_.resourceUuid) + .in(VmInstanceVO_.type, ["UserVm", "ApplianceVm"]) + .table1() + .eq(AccountResourceRefVO_.accountUuid, env.session.accountUuid) + + assert q6.toString() == "select t0 from VmInstanceVO t0,AccountResourceRefVO t1 where t0.type in :p0 and t1.accountUuid=:p1 and t0.uuid=t1.resourceUuid" + list = q6.list() + logger.info(list.toString()) + + assert list.size() == 2 // a VM, a router + assert list.every { it instanceof VmInstanceVO } + assert list.any { (it as VmInstanceVO).uuid == vm.uuid } + } + + @Override + void clean() { + env.delete() + } +} diff --git a/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy b/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy new file mode 100644 index 00000000000..7c27df0be61 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/image/ImageGroupOperationsCase.groovy @@ -0,0 +1,303 @@ +package org.zstack.test.integration.image + +import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q +import org.zstack.header.image.ImageBackupStorageRefVO +import org.zstack.header.image.ImageDeletionPolicyManager +import org.zstack.header.image.ImageGroupRefVO +import org.zstack.header.image.ImageGroupVO +import org.zstack.header.image.ImageVO +import org.zstack.header.vm.VmInstanceState +import org.zstack.header.vm.VmInstanceVO +import org.zstack.header.vm.VmInstanceVO_ +import org.zstack.image.ImageGlobalConfig +import org.zstack.sdk.DiskOfferingInventory +import org.zstack.sdk.HostInventory +import org.zstack.sdk.ImageInventory +import org.zstack.sdk.SftpBackupStorageInventory +import org.zstack.sdk.VmInstanceInventory +import org.zstack.sdk.VolumeInventory +import org.zstack.sdk.ImageGroupInventory +import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.test.integration.ZStackTest +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase +import org.zstack.utils.data.SizeUnit + +class ImageGroupOperationsCase extends SubCase { + EnvSpec env + DatabaseFacade dbf + VmInstanceInventory vm + DiskOfferingInventory diskOffering + SftpBackupStorageInventory bs + HostInventory host + ImageInventory rimage + ImageInventory dimage + + @Override + void setup() { + useSpring(ZStackTest.springSpec) + } + + @Override + void environment() { + env = env { + instanceOffering { + name = "instanceOffering" + memory = SizeUnit.GIGABYTE.toByte(8) + cpu = 4 + } + + diskOffering { + name = "diskOffering" + diskSize = SizeUnit.GIGABYTE.toByte(2) + } + + sftpBackupStorage { + name = "sftp" + url = "/sftp" + username = "username" + password = "password" + hostname = "hostname1" + + image { + name = "image" + url = "http://somehost/boot.iso" + format = "iso" + } + + image { + name = "image1" + url = "http://somehost/boot.iso" + } + } + + sftpBackupStorage { + name = "sftp1" + url = "/sftp1" + username = "username" + password = "password" + hostname = "hostname2" + + image { + name = "image" + url = "http://somehost/boot.iso" + format = "iso" + } + + image { + name = "image1" + url = "http://somehost/boot.iso" + } + } + + zone { + name = "zone" + description = "test" + + cluster { + name = "cluster" + hypervisorType = "KVM" + + kvm { + name = "kvm" + managementIp = "localhost" + username = "root" + password = "password" + } + + attachPrimaryStorage("local") + attachL2Network("l2") + } + + localPrimaryStorage { + name = "local" + url = "/local_ps" + } + + l2NoVlanNetwork { + name = "l2" + physicalInterface = "eth0" + + l3Network { + name = "l3" + + ip { + startIp = "192.168.100.10" + endIp = "192.168.100.100" + netmask = "255.255.255.0" + gateway = "192.168.100.1" + } + } + } + attachBackupStorage("sftp") + attachBackupStorage("sftp1") + } + + vm { + name = "vm" + useInstanceOffering("instanceOffering") + useImage("image1") + useL3Networks("l3") + } + } + } + + @Override + void test() { + env.create { + vm = env.inventoryByName("vm") as VmInstanceInventory + diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory + bs = env.inventoryByName("sftp") as SftpBackupStorageInventory + host = env.inventoryByName("kvm") as HostInventory + rimage = env.inventoryByName("image") as ImageInventory + + testCreateImageGroup() + } + } + + void testCreateImageGroup() { + VolumeInventory volume = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + } as VolumeInventory + + attachDataVolumeToVm { + volumeUuid = volume.uuid + vmInstanceUuid = vm.uuid + } + + VolumeSnapshotInventory rsnap = createVolumeSnapshot { + name = "snap-root" + volumeUuid = vm.rootVolumeUuid + } as VolumeSnapshotInventory + + VolumeSnapshotInventory dsnap = createVolumeSnapshot { + name = "snap-data" + volumeUuid = volume.uuid + } as VolumeSnapshotInventory + + stopVmInstance { + uuid = vm.uuid + } + assert Q.New(VmInstanceVO.class).eq(VmInstanceVO_.state, VmInstanceState.Stopped).eq(VmInstanceVO_.uuid, vm.uuid).isExists() + + dimage = createDataVolumeTemplateFromVolume { + name = "data-image" + volumeUuid = volume.uuid + backupStorageUuids = [bs.uuid] + } as ImageInventory + + ImageGroupInventory group = createImageGroupFromVmInstance { + vmInstanceUuid = vm.uuid + name = "imageGroup" + } as ImageGroupInventory + + queryImageGroup { + } + + queryImageGroupRef { + + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 1 + assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageVO.class).count() == 7 + } + + expungeImageGroup { + uuid = group.uuid + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 0 + assert Q.New(ImageGroupRefVO.class).count() == 0 + assert Q.New(ImageVO.class).count() == 5 + } + + ImageGroupInventory group2 = createImageGroupFromImage { + rootVolumeTemplateUuid = rimage.uuid + dataVolumeTemplateUuids = [dimage.uuid] + name = "imageGroup2" + } as ImageGroupInventory + + queryImageGroup { + } + + queryImageGroupRef { + + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 1 + assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageBackupStorageRefVO.class).count() == 5 + assert Q.New(ImageVO.class).count() == 5 + } + + ImageInventory cimage = cloneImage { + imageUuid = rimage.uuid + } as ImageInventory + + retryInSecs { + assert Q.New(ImageBackupStorageRefVO.class).count() == 6 + assert Q.New(ImageVO.class).count() == 6 + } + + // Simulate the policy for deleting an image from an image group. + ImageGlobalConfig.DELETION_POLICY.updateValue(ImageDeletionPolicyManager.ImageDeletionPolicy.Direct.toString()) + deleteImage { + uuid = cimage.uuid + } + + retryInSecs { + assert Q.New(ImageBackupStorageRefVO.class).count() == 5 + assert Q.New(ImageVO.class).count() == 5 + } + + expungeImageGroup { + uuid = group2.uuid + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 0 + assert Q.New(ImageGroupRefVO.class).count() == 0 + assert Q.New(ImageVO.class).count() == 3 + } + + ImageGroupInventory group3 = createImageGroupFromSnapshot { + rootVolumeSnapshotUuid = rsnap.uuid + dataVolumeSnapshotUuids = [dsnap.uuid] + name = "imageGroup3" + } as ImageGroupInventory + + queryImageGroup { + } + + queryImageGroupRef { + + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 1 + assert Q.New(ImageGroupRefVO.class).count() == 2 + assert Q.New(ImageVO.class).count() == 5 + } + + expungeImageGroup { + uuid = group3.uuid + } + + retryInSecs { + assert Q.New(ImageGroupVO.class).count() == 0 + assert Q.New(ImageGroupRefVO.class).count() == 0 + assert Q.New(ImageVO.class).count() == 3 + } + } + + @Override + void clean() { + env.delete() + } +} diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy index b8c046775a2..8a66fb0827d 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/capacity/CheckHostCapacityWhenAddHostCase.groovy @@ -1,14 +1,17 @@ package org.zstack.test.integration.kvm.capacity import org.springframework.http.HttpEntity +import org.zstack.core.db.Q +import org.zstack.header.allocator.HostCapacityVO +import org.zstack.header.allocator.HostCapacityVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant import org.zstack.kvm.KVMGlobalConfig import org.zstack.sdk.AddKVMHostAction +import org.zstack.sdk.ClusterInventory import org.zstack.sdk.GetCpuMemoryCapacityResult import org.zstack.test.integration.kvm.KvmTest import org.zstack.test.integration.kvm.host.HostEnv -import org.zstack.sdk.ClusterInventory import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit @@ -64,7 +67,7 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { clusterUuids = [cluster.uuid] } - KVMGlobalConfig.RESERVED_CPU_CAPACITY.updateValue(result.availableCpu) + KVMGlobalConfig.RESERVED_CPU_CAPACITY.updateValue(76) createVmInstance { name = "vm" @@ -73,6 +76,16 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { instanceOfferingUuid = instanceOffering.uuid clusterUuid = cluster.uuid } + + expect(AssertionError.class) { + createVmInstance { + name = "4c-vm" + imageUuid = image.uuid + l3NetworkUuids = [l3.uuid] + instanceOfferingUuid = instanceOffering.uuid + clusterUuid = cluster.uuid + } + } } void testCheckCapacityWhenAddHost() { @@ -81,6 +94,7 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { env.afterSimulator(KVMConstant.KVM_HOST_CAPACITY_PATH) { rsp, HttpEntity e -> rsp as KVMAgentCommands.HostCapacityResponse + rsp.setCpuCoreNum(20) rsp.setTotalMemory(SizeUnit.GIGABYTE.toByte(10)) return rsp } @@ -101,6 +115,11 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { res = action.call() assert res.error == null + retryInSecs { + Integer cpuCoreNum = Q.New(HostCapacityVO.class).eq(HostCapacityVO_.uuid, res.value.getInventory().uuid).select(HostCapacityVO_.cpuCoreNum).findValue() + assert cpuCoreNum == 20 + } + deleteHost { uuid = res.value.inventory.uuid } @@ -131,3 +150,4 @@ class CheckHostCapacityWhenAddHostCase extends SubCase { env.delete() } } + diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy index 9caf5c1c08d..f8f2666163f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ConnectHostMultiTimesCase.groovy @@ -106,7 +106,9 @@ class ConnectHostMultiTimesCase extends SubCase { stateEvent = HostStateEvent.enable } - assert count == 1 + retryInSecs { + assert count == 1 + } cleanup() retryInSecs { diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy index 25697e33f4d..1709790ab08 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/KVMPingCase.groovy @@ -6,6 +6,7 @@ import org.zstack.compute.host.HostManagerImpl import org.zstack.compute.host.HostReconnectTask import org.zstack.compute.host.HostTrackImpl import org.zstack.core.cloudbus.CloudBus +import org.zstack.core.config.GlobalConfigFacadeImpl import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.core.NoErrorCompletion @@ -13,6 +14,7 @@ import org.zstack.header.errorcode.SysErrors import org.zstack.header.host.* import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant +import org.zstack.kvm.KVMGlobalConfig import org.zstack.kvm.KVMReconnectHostTask import org.zstack.sdk.ClusterInventory import org.zstack.sdk.HostInventory @@ -27,6 +29,7 @@ import java.util.concurrent.TimeUnit class KVMPingCase extends SubCase { EnvSpec env CloudBus bus + GlobalConfigFacadeImpl gcf @Override void clean() { @@ -100,6 +103,8 @@ class KVMPingCase extends SubCase { env.afterSimulator(KVMConstant.KVM_PING_PATH) { KVMAgentCommands.PingResponse rsp, HttpEntity e -> KVMAgentCommands.PingCmd cmd = JSONObjectUtil.toObject(e.getBody(), KVMAgentCommands.PingCmd.class) + assert cmd.kvmagentPhysicalMemoryUsageAlarmThreshold == gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_ALARM_THRESHOLD.getName(), Long.class); + assert cmd.kvmagentPhysicalMemoryUsageHardLimit == gcf.getConfigValue(KVMGlobalConfig.CATEGORY, KVMGlobalConfig.KVMAGENT_PHYSICAL_MEMORY_USAGE_HARD_LIMIT.getName(), Long.class); if (cmd.hostUuid == kvm1.uuid && !pingSuccess) { throw new RuntimeException("failure on purpose") @@ -458,6 +463,7 @@ class KVMPingCase extends SubCase { @Override void test() { bus = bean(CloudBus.class) + gcf = bean(GlobalConfigFacadeImpl.class) env.create { HostGlobalConfig.PING_HOST_INTERVAL.updateValue(1) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy index d03a1051f76..d07cf6df6db 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/ReconnectHostCase.groovy @@ -1,22 +1,26 @@ package org.zstack.test.integration.kvm.host +import org.springframework.http.HttpEntity +import org.springframework.web.util.UriComponentsBuilder +import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.host.* +import org.zstack.header.rest.RESTConstant +import org.zstack.header.rest.RESTFacade import org.zstack.header.vm.VmInstanceState -import org.zstack.kvm.KVMAgentCommands -import org.zstack.kvm.KVMConstant -import org.zstack.kvm.KVMHostVO -import org.zstack.kvm.KVMHostVO_ +import org.zstack.kvm.* import org.zstack.sdk.HostInventory import org.zstack.sdk.VmInstanceInventory import org.zstack.test.integration.kvm.Env import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase -import org.zstack.utils.Utils -import org.zstack.utils.logging.CLogger +import org.zstack.utils.gson.JSONObjectUtil + +import static org.zstack.utils.CollectionDSL.e +import static org.zstack.utils.CollectionDSL.map /** * Created by MaJin on 2017-05-01. @@ -24,7 +28,7 @@ import org.zstack.utils.logging.CLogger class ReconnectHostCase extends SubCase { EnvSpec env HostInventory host - private final static CLogger logger = Utils.getLogger(ReconnectHostCase.class) + RESTFacade restf static RECONNECT_TIME = 10 @Override @@ -41,10 +45,12 @@ class ReconnectHostCase extends SubCase { void test() { env.create { host = env.inventoryByName("kvm") + restf = bean(RESTFacade.class) testReconnectHostVmState() testReconnectFailureHostVmState() testUpdateHostDuringConnecting() testChangeHostConnectionState() + testInstallHostShutdownHookCmd() } } @@ -53,6 +59,67 @@ class ReconnectHostCase extends SubCase { env.delete() } + void testInstallHostShutdownHookCmd() { + Boolean installHostShutdownHook = null + env.afterSimulator(KVMConstant.KVM_CONNECT_PATH) { KVMAgentCommands.AgentResponse rsp, HttpEntity e -> + def connectCmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ConnectCmd.class) + if (connectCmd.hostUuid.equals(host.uuid)) { + installHostShutdownHook = connectCmd.installHostShutdownHook + } + return rsp + } + + reconnectHost { + uuid = host.uuid + } + + assert !installHostShutdownHook + + KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.updateValue(true) + + reconnectHost { + uuid = host.uuid + } + + assert installHostShutdownHook + + KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.updateValue(KVMGlobalConfig.INSTALL_HOST_SHUTDOWN_HOOK.getDefaultValue()) + + env.cleanAfterSimulatorHandlers() + + def isChangeStatus = false + KVMAgentCommands.ReportHostStopEventCmd cmd = new KVMAgentCommands.ReportHostStopEventCmd() + cmd.hostUuid = Platform.getUuid() + + env.message(ChangeHostStatusMsg.class) { ChangeHostStatusMsg msg, CloudBus bus -> + isChangeStatus = true + ChangeHostStatusReply r = new ChangeHostStatusReply() + bus.reply(msg, r) + } + + Map header = map(e(RESTConstant.COMMAND_PATH, KVMConstant.KVM_REPORT_HOST_STOP_EVENT)) + UriComponentsBuilder ub = UriComponentsBuilder.fromHttpUrl(restf.getBaseUrl()) + ub.path(RESTConstant.COMMAND_CHANNEL_PATH) + String url = ub.build().toUriString() + restf.syncJsonPost(url, JSONObjectUtil.toJsonString(cmd), header, String.class) + + retryInSecs { + assert isChangeStatus + } + + isChangeStatus = false + cmd.hostUuid = null + restf.syncJsonPost(url, JSONObjectUtil.toJsonString(cmd), header, String.class) + + expect(AssertionError.class) { + retryInSecs { + assert isChangeStatus + } + } + + env.cleanMessageHandlers() + } + void testUpdateHostDuringConnecting() { boolean called env.simulator(KVMConstant.KVM_CONNECT_PATH) { diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy index 1728b728419..b3280d60ce8 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/nic/MigrateVmSetDefaultRuleCase.groovy @@ -196,9 +196,9 @@ class MigrateVmSetDefaultRuleCase extends SubCase { retryInSecs { assert cmd != null - assert cmd.skipIpv6 == false + assert cmd.disableIp6Tables == false assert ccmd != null - assert ccmd.skipIpv6 == false + assert ccmd.disableIp6Tables == false } } } diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy index 7210b96c294..6aa816d4b2e 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/GetCandidatePrimaryStorageCase.groovy @@ -1,5 +1,7 @@ package org.zstack.test.integration.kvm.vm +import org.zstack.configuration.DiskOfferingSystemTags +import org.zstack.configuration.InstanceOfferingSystemTags import org.zstack.core.db.Q import org.zstack.header.network.service.NetworkServiceType import org.zstack.header.storage.primary.PrimaryStorageCapacityVO @@ -10,6 +12,7 @@ import org.zstack.sdk.DiskOfferingInventory import org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmAction import org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmResult import org.zstack.sdk.ImageInventory +import org.zstack.sdk.InstanceOfferingInventory import org.zstack.sdk.L3NetworkInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.test.integration.kvm.KvmTest @@ -17,6 +20,9 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit +import static org.zstack.utils.CollectionDSL.e +import static org.zstack.utils.CollectionDSL.map + /** * Created by MaJin on 2017-08-19. */ @@ -101,7 +107,9 @@ class GetCandidatePrimaryStorageCase extends SubCase{ totalMem = SizeUnit.GIGABYTE.toByte(320) } - attachPrimaryStorage("smp") + attachPrimaryStorage("local") + attachPrimaryStorage("local2") + attachPrimaryStorage("local3") attachL2Network("l2") } @@ -119,9 +127,19 @@ class GetCandidatePrimaryStorageCase extends SubCase{ attachL2Network("l2") } - smpPrimaryStorage { - name = "smp" - url = "/opt/smp" + localPrimaryStorage { + name = "local" + url = "/opt/local" + } + + localPrimaryStorage { + name = "local2" + url = "/opt/local2" + } + + localPrimaryStorage { + name = "local3" + url = "/opt/local3" } cephPrimaryStorage { @@ -201,11 +219,12 @@ class GetCandidatePrimaryStorageCase extends SubCase{ imageOnSftp = env.inventoryByName("image-on-sftp") as ImageInventory imageOnCeph = env.inventoryByName("image-on-ceph") as ImageInventory l3 = env.inventoryByName("l3") as L3NetworkInventory - ps = env.inventoryByName("smp") as PrimaryStorageInventory + ps = env.inventoryByName("local") as PrimaryStorageInventory disk = env.inventoryByName("diskOffering") as DiskOfferingInventory iso = env.inventoryByName("iso") as ImageInventory testGetPsForCreatingVm() testGetCephPsCandidate() + testGetInstanceOfferingRelatedPs() } } @@ -214,13 +233,97 @@ class GetCandidatePrimaryStorageCase extends SubCase{ env.delete() } - void testGetPsForCreatingVm(){ + void testGetInstanceOfferingRelatedPs() { + def local2 = env.inventoryByName("local2") as PrimaryStorageInventory + def local3 = env.inventoryByName("local3") as PrimaryStorageInventory + String instanceOfferingConfig = "{\n" + + " \"allocate\": {\n" + + " \"primaryStorage\": {\n" + + " \"type\": \"LocalStorage\", \n" + + " \"uuid\": ${local2.uuid} \n" + + " }\n" + + " }\n" + + "}" + + InstanceOfferingInventory instanceOffering = createInstanceOffering { + name = "instanceOffering" + cpuNum = 1 + memorySize = SizeUnit.GIGABYTE.toByte(1) + systemTags = [ + InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG.instantiateTag(map( + e(InstanceOfferingSystemTags.INSTANCE_OFFERING_USER_CONFIG_TOKEN, instanceOfferingConfig) + )) + ] + } + + String diskOfferingConfig = "{\n" + + " \"allocate\": {\n" + + " \"primaryStorage\": {\n" + + " \"type\": \"LocalStorage\", \n" + + " \"uuid\": ${local3.uuid} \n" + + " }\n" + + " }\n" + + "}" + + DiskOfferingInventory diskOffering = createDiskOffering { + name = "diskOffering" + diskSize = SizeUnit.GIGABYTE.toByte(1) + systemTags = [ + DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG.instantiateTag(map( + e(DiskOfferingSystemTags.DISK_OFFERING_USER_CONFIG_TOKEN, diskOfferingConfig) + )) + ] + } + + 5.times { + def result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 3 + + result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + rootDiskOfferingUuid = diskOffering.uuid + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.get(0).uuid == local3.uuid + + result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + instanceOfferingUuid = instanceOffering.uuid + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.get(0).uuid == local2.uuid + + result = getCandidatePrimaryStoragesForCreatingVm { + imageUuid = imageOnSftp.uuid + l3NetworkUuids = [l3.uuid] + instanceOfferingUuid = instanceOffering.uuid + dataDiskOfferingUuids = [diskOffering.uuid] + } as GetCandidatePrimaryStoragesForCreatingVmResult + + assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.get(0).uuid == local2.uuid + assert result.dataVolumePrimaryStorages.size() == 1 + def dataVolumePrimaryStorages = result.dataVolumePrimaryStorages.get(diskOffering.uuid) as List + assert dataVolumePrimaryStorages.size() == 1 + assert dataVolumePrimaryStorages.get(0).uuid == local3.uuid + } + } + + void testGetPsForCreatingVm() { GetCandidatePrimaryStoragesForCreatingVmResult result = getCandidatePrimaryStoragesForCreatingVm { imageUuid = imageOnSftp.uuid l3NetworkUuids = [l3.uuid] } as GetCandidatePrimaryStoragesForCreatingVmResult - assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.size() == 3 assert result.dataVolumePrimaryStorages.size() == 0 result = getCandidatePrimaryStoragesForCreatingVm { @@ -229,7 +332,7 @@ class GetCandidatePrimaryStorageCase extends SubCase{ l3NetworkUuids = [l3.uuid] } as GetCandidatePrimaryStoragesForCreatingVmResult - assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.size() == 3 assert result.dataVolumePrimaryStorages.size() == 0 result = getCandidatePrimaryStoragesForCreatingVm { @@ -239,7 +342,7 @@ class GetCandidatePrimaryStorageCase extends SubCase{ l3NetworkUuids = [l3.uuid] } as GetCandidatePrimaryStoragesForCreatingVmResult - assert result.rootVolumePrimaryStorages.size() == 1 + assert result.rootVolumePrimaryStorages.size() == 3 assert result.dataVolumePrimaryStorages.size() == 1 GetCandidatePrimaryStoragesForCreatingVmAction a = new GetCandidatePrimaryStoragesForCreatingVmAction() diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy index e911baa1588..1a2d55ce57c 100755 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmDestroyingCase.groovy @@ -3,6 +3,7 @@ package org.zstack.test.integration.kvm.vm import org.springframework.http.HttpEntity import org.zstack.core.cloudbus.CloudBus import org.zstack.core.db.Q +import org.zstack.core.db.SQL import org.zstack.core.errorcode.ErrorFacade import org.zstack.header.host.CheckVmStateOnHypervisorMsg import org.zstack.header.host.CheckVmStateOnHypervisorReply @@ -21,6 +22,7 @@ import org.zstack.sdk.DestroyVmInstanceAction import org.zstack.sdk.VmInstanceInventory import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec +import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil @@ -165,6 +167,7 @@ class VmDestroyingCase extends SubCase { simulatorEnv() testDestroyingVmWillBeSetToDestroyedIfDestroyingFailButVmSyncMsgReturnStopped() testRecover() + testStartFail() testDestroyingVmWillBeSetToDestroyedIfDestroyingFailButVmSyncMsgReturnStopped() testExpunge() } @@ -232,6 +235,52 @@ class VmDestroyingCase extends SubCase { env.cleanSimulatorAndMessageHandlers() } + void testStartFail() { + stopVmInstance { + uuid = vm.uuid + } + + VmInstanceVO vo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vo.state == VmInstanceState.Stopped + + env.message(CheckVmStateOnHypervisorMsg.class) { CheckVmStateOnHypervisorMsg msg, CloudBus bus -> + def reply = new CheckVmStateOnHypervisorReply() + def list = new HashMap() + list.put(vm.uuid, VmInstanceState.Paused.toString()) + reply.setStates(list) + reply.success = true + bus.reply(msg, reply) + } + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { KVMAgentCommands.StartVmResponse rsp, HttpEntity e -> + throw new HttpError(403, "on purpose") + } + + expect(AssertionError.class) { + startVmInstance { + uuid = vm.uuid + } + } + + retryInSecs { + vo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vo.state == VmInstanceState.Paused + } + + env.cleanSimulatorAndMessageHandlers() + + SQL.New(VmInstanceVO).eq(VmInstanceVO_.uuid, vm.uuid).set(VmInstanceVO_.state, VmInstanceState.Stopped).update() + + startVmInstance { + uuid = vm.uuid + } + + retryInSecs { + vo = dbFindByUuid(vm.uuid, VmInstanceVO.class) + assert vo.state == VmInstanceState.Running + } + } + void testExpunge() { assert Q.New(VolumeVO.class).eq(VolumeVO_.uuid, vm.rootVolumeUuid) .select(VolumeVO_.status) diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy index 4c1dcb583ea..a909c7bdae4 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/VmSetVendorCase.groovy @@ -9,13 +9,16 @@ import org.zstack.kvm.KVMSystemTags import org.zstack.network.securitygroup.SecurityGroupConstant import org.zstack.network.service.virtualrouter.VirtualRouterConstant import org.zstack.resourceconfig.ResourceConfigFacade +import org.zstack.sdk.GlobalConfigInventory import org.zstack.sdk.VmInstanceInventory import org.zstack.test.integration.kvm.KvmTest import org.zstack.testlib.EnvSpec +import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil +import static org.zstack.kvm.KVMConstant.KVM_HOST_FACT_PATH import static org.zstack.utils.CollectionDSL.e import static org.zstack.utils.CollectionDSL.map @@ -23,7 +26,7 @@ class VmSetVendorCase extends SubCase { EnvSpec env VmInstanceInventory vm ResourceConfigFacade rcf - def cpuModelName = "hygon" + def hygonCpuModelName = "hygon" @Override void clean() { @@ -87,7 +90,7 @@ class VmSetVendorCase extends SubCase { username = "root" password = "password" systemTags = [ - KVMSystemTags.CPU_MODEL_NAME.instantiateTag(map(e(KVMSystemTags.CPU_MODEL_NAME_TOKEN, cpuModelName))) + KVMSystemTags.CPU_MODEL_NAME.instantiateTag(map(e(KVMSystemTags.CPU_MODEL_NAME_TOKEN, hygonCpuModelName))) ] } @@ -160,6 +163,12 @@ class VmSetVendorCase extends SubCase { @Override void test() { + env.afterSimulator(KVM_HOST_FACT_PATH) { KVMAgentCommands.HostFactResponse rsp -> + rsp.cpuModelName = hygonCpuModelName + rsp.hostCpuModelName = hygonCpuModelName + return rsp + } + env.create { rcf = bean(ResourceConfigFacade.class) vm = env.inventoryByName("vm") as VmInstanceInventory @@ -173,6 +182,18 @@ class VmSetVendorCase extends SubCase { def l3 = env.inventoryByName("l3") def instance = env.inventoryByName("instanceOffering") + GlobalConfigInventory originCpuModel = queryGlobalConfig { + conditions = ["category=${VmGlobalConfig.CATEGORY}", "name=${VmGlobalConfig.VM_CPUID_VENDOR.name}"] + }[0] as GlobalConfigInventory + + assert originCpuModel != null + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { KVMAgentCommands.StartVmResponse rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.StartVmCmd.class) + assert cmd.vmCpuVendorId == "AuthenticAMD" + return rsp + } + def vm1 = createVmInstance { name = "vm1" imageUuid = image.uuid @@ -180,7 +201,27 @@ class VmSetVendorCase extends SubCase { instanceOfferingUuid = instance.uuid } - assert rcf.getResourceConfigValue(VmGlobalConfig.VM_CPUID_VENDOR, vm1.uuid, String.class) == "AuthenticAMD" + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = VmGlobalConfig.VM_CPUID_VENDOR.name + value = "None" + } + + env.afterSimulator(KVMConstant.KVM_START_VM_PATH) { KVMAgentCommands.StartVmResponse rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.StartVmCmd.class) + assert cmd.vmCpuVendorId == "None" + return rsp + } + + rebootVmInstance { + uuid = vm1.uuid + } + + updateGlobalConfig { + category = VmGlobalConfig.CATEGORY + name = VmGlobalConfig.VM_CPUID_VENDOR.name + value = "AuthenticAMD" + } updateResourceConfig { name = VmGlobalConfig.VM_CPUID_VENDOR.name @@ -193,7 +234,11 @@ class VmSetVendorCase extends SubCase { uuid = vm1.uuid } - assert rcf.getResourceConfigValue(VmGlobalConfig.VM_CPUID_VENDOR, vm1.uuid, String.class) == "None" + updateGlobalConfig { + name = VmGlobalConfig.VM_CPUID_VENDOR.name + category = VmGlobalConfig.CATEGORY + value = originCpuModel.value + } destroyVmInstance { uuid = vm1.uuid diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy index c42058ef4fb..5fca7dff6b2 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/vm/migrate/MigrateVmFromDestitonHostCase.groovy @@ -5,9 +5,6 @@ import org.springframework.http.HttpEntity import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.Constants -import org.zstack.header.host.HostStatus -import org.zstack.header.host.HostVO -import org.zstack.header.host.HostVO_ import org.zstack.header.longjob.LongJobState import org.zstack.header.longjob.LongJobVO import org.zstack.header.longjob.LongJobVO_ @@ -27,7 +24,6 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil - /** * Created by shixin.ruan on 2018/02/10. */ @@ -287,6 +283,17 @@ class MigrateVmFromDestitonHostCase extends SubCase { MigrateVmAction.Result ret = action.call() assert ret.error != null + + // test migrate disable auto-converge + KVMGlobalConfig.MIGRATE_AUTO_CONVERGE.updateValue(true) + migrateVm { + vmInstanceUuid = vm1.uuid + hostUuid = host.uuid + strategy = "no-converge" + downTime = 300 + } + + assert !cmd.autoConverge } private void migrateUnknownVm(String destHostUuid) { diff --git a/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy b/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy index 1c4510aa77d..1ea4832ae4b 100644 --- a/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/longjob/AddImageLongJobCase.groovy @@ -4,36 +4,28 @@ import com.google.gson.Gson import org.springframework.http.HttpEntity import org.zstack.core.Platform import org.zstack.core.cloudbus.CloudBus -import org.zstack.core.config.GlobalConfigVO -import org.zstack.core.config.GlobalConfigVO_ import org.zstack.core.db.Q -import org.zstack.core.db.SQL import org.zstack.core.timeout.ApiTimeoutGlobalProperty -import org.zstack.header.image.APIAddImageMsg -import org.zstack.header.image.ImageConstant -import org.zstack.header.image.ImagePlatform -import org.zstack.header.image.ImageVO +import org.zstack.header.image.* +import org.zstack.header.longjob.LongJobState import org.zstack.header.longjob.LongJobVO import org.zstack.header.longjob.LongJobVO_ -import org.zstack.header.longjob.LongJobState import org.zstack.header.storage.backup.DownloadImageMsg import org.zstack.header.storage.backup.DownloadImageReply -import org.zstack.header.storage.primary.APIAttachPrimaryStorageToClusterMsg import org.zstack.longjob.LongJobGlobalConfig -import org.zstack.sdk.* +import org.zstack.sdk.BackupStorageInventory +import org.zstack.sdk.LongJobInventory +import org.zstack.sdk.UpdateGlobalConfigAction import org.zstack.storage.backup.sftp.SftpBackupStorageCommands import org.zstack.storage.backup.sftp.SftpBackupStorageConstant import org.zstack.test.integration.ZStackTest import org.zstack.test.integration.storage.Env import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase -import org.zstack.utils.SizeUtils import org.zstack.utils.TimeUtils import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil -import javax.persistence.metamodel.SingularAttribute - /** * Created by camile on 2/5/18. */ @@ -102,13 +94,14 @@ class AddImageLongJobCase extends SubCase { timeout = cmd.getTimeout() //DownloadImageMsg LongJobVO vo = Q.New(LongJobVO.class).eq(LongJobVO_.description, myDescription).find() + assert Q.New(ImageVO.class).eq(ImageVO_.@name, "TinyLinux-1byte").select(ImageVO_.actualSize).findValue() != 0 assert vo.state == LongJobState.Running flag += 1 return rsp } APIAddImageMsg msg = new APIAddImageMsg() - msg.setName("TinyLinux") + msg.setName("TinyLinux-1byte") msg.setBackupStorageUuids(Collections.singletonList(bs.uuid)) msg.setUrl("http://192.168.1.20/share/images/tinylinux.qcow2") msg.setFormat(ImageConstant.QCOW2_FORMAT_STRING) diff --git a/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy b/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy index 9e773ed0848..7875ab9beb5 100644 --- a/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/longjob/VolumeSnapshotOperationLongJobCase.groovy @@ -9,6 +9,7 @@ import org.zstack.header.storage.snapshot.APIRevertVolumeFromSnapshotMsg import org.zstack.sdk.LongJobInventory import org.zstack.sdk.VmInstanceInventory import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.storage.primary.local.LocalStorageKvmBackend import org.zstack.test.integration.ZStackTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase @@ -166,6 +167,15 @@ class VolumeSnapshotOperationLongJobCase extends SubCase { def id = Platform.getUuid() + env.afterSimulator(LocalStorageKvmBackend.REVERT_SNAPSHOT_PATH) { rsp -> + expectError { + startVmInstance { + uuid = vm.uuid + } + } + return rsp + } + def job = submitLongJob { jobName = msg.getClass().getSimpleName() jobData = gson.toJson(msg) diff --git a/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy index 9cd7f36ad50..aec27dd7fe1 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/hostNetwork/GetLldpInfoCase.groovy @@ -3,11 +3,13 @@ package org.zstack.test.integration.network.hostNetwork import org.springframework.http.HttpEntity import org.zstack.core.Platform import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO import org.zstack.network.hostNetworkInterface.lldp.LldpConstant import org.zstack.network.hostNetworkInterface.lldp.LldpInfoStruct import org.zstack.network.hostNetworkInterface.lldp.LldpKvmAgentCommands +import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefVO_ import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpVO import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpVO_ import org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefVO @@ -130,7 +132,7 @@ class GetLldpInfoCase extends SubCase { reply.lldpInfo.chassisId = "mac 00:1e:08:1d:05:ba" reply.lldpInfo.timeToLive = 120 reply.lldpInfo.managementAddress = "172.25.2.4" - reply.lldpInfo.systemName = "BM-MN-3" + reply.lldpInfo.systemName = "JBM1-1F-11-34U-DC0FF-CESHI-93180-S01.vivo.xyz" reply.lldpInfo.systemDescription = "CentecOS software, E530, Version 7.4.7 Copyright (C) 2004-2021 Centec Networks Inc. All Rights Reserved." reply.lldpInfo.systemCapabilities = "Bridge, on Router, on" reply.lldpInfo.portId = "ifname eth-0-5" @@ -145,8 +147,11 @@ class GetLldpInfoCase extends SubCase { interfaceUuid = TEST_UUID } as GetHostNetworkInterfaceLldpResult + assert ms.lldp.systemName == "JBM1-1F-11-34U-DC0FF-CESHI-93180-S01.vivo.xyz" assert ms.lldp.portId == "ifname eth-0-5" + assert Q.New(HostNetworkInterfaceLldpRefVO.class).eq(HostNetworkInterfaceLldpRefVO_.systemName, "JBM1-1F-11-34U-DC0FF-CESHI-93180-S01.vivo.xyz").isExists() + HostNetworkInterfaceVO vo1 = new HostNetworkInterfaceVO(); vo1.setUuid(TEST_UUID_2) vo1.setHostUuid(host2.getUuid()) diff --git a/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy index 8da469adb97..638be7b693d 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/l3network/ipv6/IPv6EipCase.groovy @@ -143,10 +143,10 @@ class IPv6EipCase extends SubCase { assert cmd.eip.vmBridgeName == "br_eth0" cmd = null + // usedIpUuid will detect automatically eip6 = attachEip { eipUuid = eip6.uuid vmNicUuid = nic.uuid - usedIpUuid = ipv6.uuid } assert cmd.eip.vmBridgeName == "br_eth0" assert eip6.guestIp == ipv6.ip diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy index d4370f43897..d5f0c01eb14 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanCase.groovy @@ -7,7 +7,7 @@ import org.zstack.kvm.KVMConstant import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanKvmAgentCommands import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolConstant import org.zstack.sdk.* -import org.zstack.sdnController.header.SdnControllerConstant +import org.zstack.header.network.sdncontroller.SdnControllerConstant import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy index 4997d76921a..3f12fbd43d0 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/HardwareVxlanPoolCase.groovy @@ -2,7 +2,7 @@ package org.zstack.test.integration.network.sdnController import org.zstack.core.db.DatabaseFacade import org.zstack.sdk.* -import org.zstack.sdnController.header.SdnControllerConstant +import org.zstack.header.network.sdncontroller.SdnControllerConstant import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy index 0bc371e5434..c07c9c3314c 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerCase.groovy @@ -1,9 +1,21 @@ package org.zstack.test.integration.network.sdnController +import org.springframework.http.HttpEntity import org.zstack.core.db.DatabaseFacade -import org.zstack.sdk.* -import org.zstack.sdnController.header.SdnControllerConstant -import org.zstack.sdnController.header.SdnControllerVO +import org.zstack.core.db.Q +import org.zstack.header.network.sdncontroller.SdnControllerVO +import org.zstack.sdk.ClusterInventory +import org.zstack.sdk.H3cSdnControllerTenantInventory +import org.zstack.sdk.L2NetworkInventory +import org.zstack.sdk.L2VxlanNetworkPoolInventory +import org.zstack.sdk.SdnControllerInventory +import org.zstack.sdk.ZoneInventory +import org.zstack.sdnController.SdnControllerGlobalConfig +import org.zstack.sdnController.SdnControllerSystemTags +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands +import org.zstack.header.network.sdncontroller.SdnControllerConstant +import org.zstack.sdnController.header.H3cSdnControllerTenantVO +import org.zstack.sdnController.header.H3cSdnControllerTenantVO_ import org.zstack.header.network.l3.L3NetworkConstant import org.zstack.sdnController.h3cVcfc.H3cVcfcSdnControllerSystemTags import org.zstack.testlib.EnvSpec @@ -33,6 +45,9 @@ class SdnControllerCase extends SubCase { env.create { dbf = bean(DatabaseFacade.class) testSdnControllerApi() + testH3cV2ControllerApi() + testSdnControllerPing() + testSdnControllerReconnect() } } @@ -41,6 +56,109 @@ class SdnControllerCase extends SubCase { env.delete() } + void testH3cV2ControllerApi() { + def zone = env.inventoryByName("zone") as ZoneInventory + def cluster = env.inventoryByName("cluster") as ClusterInventory + String h3cVdsUuid = "abdssef" + String inputTenantUuid = "adddddc" + String sVni = "400" + String eVni = "500" + + SdnControllerInventory sdn2 = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn1" + ip = "192.168.1.1" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2 + systemTags = [String.format("vdsUuid::%s", h3cVdsUuid), String.format("tenantUuid::%s", inputTenantUuid), String.format("startVni::%s::endVni::%s", sVni, eVni)] + } + + testPullSdnControllerTenant(sdn2) + } + + void testPullSdnControllerTenant(SdnControllerInventory sdn) { + // Test pull tenant operation (only supported by H3C VCFC V2) + // 1. First pull tenant information + def result = pullSdnControllerTenant { + uuid = sdn.uuid + } as List + + assert result.size() > 0 + + // 2. Query tenant records in database + def tenantVOs = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdn.uuid) + .list() + + // Should have 3 tenant records based on mock data + assert tenantVOs.size() == 3 + + // Verify Test tenant data + def testTenantRecords = tenantVOs.findAll { it.tenantUuid == "03e01b37-8440-471a-aa8f-8d1fb8cc1381" } + assert testTenantRecords.size() == 1 + assert testTenantRecords[0].tenantName == "Test" + assert testTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE + assert testTenantRecords[0].vdsUuid == "eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc" + assert testTenantRecords[0].vdsName == "Test_VDS" + + // Verify default tenant data + def defaultTenantRecords = tenantVOs.findAll { it.tenantUuid == "ffffffff-0000-0000-0000-000000000001" } + assert defaultTenantRecords.size() == 1 + assert defaultTenantRecords[0].tenantName == "default" + assert defaultTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE + assert defaultTenantRecords[0].vdsUuid == "ffffffff-0000-0000-0000-000000000001" + assert defaultTenantRecords[0].vdsName == "Default_VDS" + + // Verify sr tenant data + def srTenantRecords = tenantVOs.findAll { it.tenantUuid == "c9d49b6f-d2cd-4636-b9d4-be0f9c9c7783" } + assert srTenantRecords.size() == 1 + assert srTenantRecords[0].tenantName == "sr" + assert srTenantRecords[0].state == SdnControllerConstant.H3C_SDN_CONTROLLER_TENANT_STATE_ENABLE + assert srTenantRecords[0].vdsUuid == "ffffffff-0000-0000-0000-000000000001" + // Verify vdsName is correctly retrieved from VDS simulator + assert srTenantRecords[0].vdsName == "Default_VDS" + + // 3. Pull again to verify idempotency + def result2 = pullSdnControllerTenant { + uuid = sdn.uuid + } as List + + assert result2.size() == 3 + + // Verify database record count unchanged + def tenantVOs2 = Q.New(H3cSdnControllerTenantVO.class) + .eq(H3cSdnControllerTenantVO_.sdnControllerUuid, sdn.uuid) + .list() + assert tenantVOs2.size() == 3 + + // 4. Test unsupported controller version + // Create a V1 controller + SdnControllerInventory sdnV1 = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn-v1" + ip = "192.168.1.2" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V1 + systemTags = ["vdsUuid::test-vds-uuid"] + } + + // Pull tenant operation should fail for V1 controller + expectError { + pullSdnControllerTenant { + uuid = sdnV1.uuid + } + } + + removeSdnController { + uuid = sdnV1.uuid + } + removeSdnController { + uuid = sdn.uuid + } + } + void testSdnControllerApi() { def zone = env.inventoryByName("zone") as ZoneInventory def cluster = env.inventoryByName("cluster") as ClusterInventory @@ -54,7 +172,7 @@ class SdnControllerCase extends SubCase { addSdnController { vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER name = "sdn2" - ip = "127.1.1.1" + ip = "192.168.1.1" userName = "user" password = "password" } @@ -63,7 +181,7 @@ class SdnControllerCase extends SubCase { SdnControllerInventory sdn2 = addSdnController { vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER name = "sdn1" - ip = "127.1.1.1" + ip = "192.168.1.1" userName = "user" password = "password" systemTags = [String.format("vdsUuid::%s", h3cVdsUuid), String.format("tenantUuid::%s", inputTenantUuid), String.format("startVni::%s::endVni::%s", sVni, eVni)] @@ -75,17 +193,27 @@ class SdnControllerCase extends SubCase { H3cVcfcSdnControllerSystemTags.H3C_TENANT_UUID_TOKEN) assert tenantUuid != null assert tenantUuid == inputTenantUuid - List> vniRanges = H3cVcfcSdnControllerSystemTags.H3C_VNI_RANGE.getTokensOfTagsByResourceUuid(sdn2.uuid) + List> vniRanges = SdnControllerSystemTags.VNI_RANGE.getTokensOfTagsByResourceUuid(sdn2.uuid) assert vniRanges.size() > 0 - /* this result depends on the simulator */ - assert sdn2.vniRanges.size() == 3 + + /* can not add controller with same ip again */ + expectError { + addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn2" + ip = "192.168.1.1" + userName = "user" + password = "password" + systemTags = [String.format("vdsUuid::%s", h3cVdsUuid), String.format("tenantUuid::%s", inputTenantUuid), String.format("startVni::%s::endVni::%s", sVni, eVni)] + } + } updateSdnController { uuid = sdn2.uuid name = "sdn2" description = "sdn2" } - SdnControllerVO vo = dbf.findByUuid(sdn2.uuid, SdnControllerVO.class) + SdnControllerVO vo = dbf.findByUuid(sdn2.uuid, SdnControllerVO.class) assert vo.name == "sdn2" assert vo.description == "sdn2" @@ -184,7 +312,7 @@ class SdnControllerCase extends SubCase { deleteL2Network { delegate.uuid = softPool.getUuid() } - + //AbstractVniAllocatorStrategy allocateRequiredVni: out of vni range expectError { createL2HardwareVxlanNetwork { @@ -242,4 +370,137 @@ class SdnControllerCase extends SubCase { vxlanNetworks = queryL2Network {conditions=["type=" + SdnControllerConstant.HARDWARE_VXLAN_NETWORK_TYPE]} assert vxlanNetworks.size() == 0 } + + void testSdnControllerPing() { + // Setup mock simulator for successful controller creation + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "init-token-12345" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Create H3C V2 SDN controller + SdnControllerInventory sdn = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn-ping-test" + ip = "192.168.1.10" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2 + } + + // Verify initial status is Connected + assert sdn.status == org.zstack.sdk.SdnControllerStatus.Connected + + // Set ping interval to 1 second for testing + SdnControllerGlobalConfig.PING_INTERVAL.updateValue(1) + + // Mock token retrieval failure to simulate ping failure + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = null + return rsp + } + + // Wait for ping failure, status should change to Disconnected + retryInSecs(10) { + SdnControllerInventory currentSdn = querySdnController { conditions = ["uuid=${sdn.uuid}".toString()] }[0] + assert currentSdn.status == org.zstack.sdk.SdnControllerStatus.Disconnected + } + + // Mock token retrieval success to simulate ping recovery + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "test-token-12345" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Wait for ping success, status should change to Connected + retryInSecs(10) { + SdnControllerInventory currentSdn = querySdnController { conditions = ["uuid=${sdn.uuid}".toString()] }[0] + assert currentSdn.status == org.zstack.sdk.SdnControllerStatus.Connected + } + + // Cleanup + removeSdnController { + uuid = sdn.uuid + } + } + + void testSdnControllerReconnect() { + // Setup mock simulator for successful controller creation + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "init-token-67890" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Create H3C V2 SDN controller + SdnControllerInventory sdn = addSdnController { + vendorType = SdnControllerConstant.H3C_VCFC_CONTROLLER + name = "sdn-reconnect-test" + ip = "192.168.1.20" + userName = "user" + password = "password" + vendorVersion = SdnControllerConstant.H3C_VCFC_VENDOR_VERSION_V2 + } + + // Verify initial status is Connected + assert sdn.status == org.zstack.sdk.SdnControllerStatus.Connected + + // Mock successful token retrieval for reconnect + boolean reconnectCalled = false + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + reconnectCalled = true + def rsp = new H3cVcfcV2Commands.LoginRsp() + rsp.record = new H3cVcfcV2Commands.LoginReply() + rsp.record.token = "reconnect-token-67890" + rsp.record.userName = "user" + rsp.record.domainName = "default" + return rsp + } + + // Manually trigger reconnect + reconnectSdnController { + sdnControllerUuid = sdn.uuid + } + + // Verify reconnect called token retrieval + assert reconnectCalled + + // Verify status remains Connected + SdnControllerInventory currentSdn = querySdnController { conditions = ["uuid=${sdn.uuid}".toString()] }[0] + assert currentSdn.status == org.zstack.sdk.SdnControllerStatus.Connected + + // Test reconnect failure scenario + reconnectCalled = false + env.simulator(H3cVcfcV2Commands.H3C_VCFC_GET_TOKEN) { HttpEntity e, EnvSpec spec -> + reconnectCalled = true + throw new RuntimeException("Connection failed") + } + + // Manually trigger reconnect, expect failure + expect(AssertionError.class) { + reconnectSdnController { + sdnControllerUuid = sdn.uuid + } + } + + // Verify reconnect called token retrieval + assert reconnectCalled + + // Cleanup + removeSdnController { + uuid = sdn.uuid + } + } } diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy index c7e47480afa..725e997d374 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SdnControllerEnv.groovy @@ -80,7 +80,7 @@ class SdnControllerEnv { sdnController { vendorType = "H3C VCFC" name = "h3c" - ip = "127.0.0.1" + ip = "192.168.0.1" userName = "user" password = "password" systemTags = ["vdsUuid::234567"] diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy index 141813024d1..8e28757ba5a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerCase.groovy @@ -1,6 +1,7 @@ package org.zstack.test.integration.network.sdnController import org.zstack.core.db.DatabaseFacade +import org.zstack.header.network.sdncontroller.SdnControllerVO import org.zstack.sdk.* import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant import org.zstack.sugonSdnController.controller.api.types.MacAddressesType @@ -8,7 +9,6 @@ import org.zstack.sugonSdnController.controller.api.types.Project import org.zstack.sugonSdnController.controller.api.types.VirtualMachineInterface import org.zstack.sugonSdnController.controller.api.ApiSerializer import org.zstack.sugonSdnController.controller.api.TfCommands -import org.zstack.sdnController.header.SdnControllerVO import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase diff --git a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy index 00623ff866b..57c9ff3dcb8 100644 --- a/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/network/sdnController/SugonSdnControllerEnv.groovy @@ -84,7 +84,7 @@ class SugonSdnControllerEnv { sdnController { vendorType = "TF" name = "tf" - ip = "127.0.0.1" + ip = "192.168.0.1" userName = "user" password = "password" } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy index 71d579c459c..dd346c6eb24 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/loadbalancer/OperateLoadBalancerCase.groovy @@ -17,6 +17,7 @@ import org.zstack.sdk.L3NetworkInventory import org.zstack.sdk.LoadBalancerInventory import org.zstack.sdk.LoadBalancerListenerInventory import org.zstack.sdk.SystemTagInventory +import org.zstack.sdk.TagInventory import org.zstack.sdk.VipInventory import org.zstack.sdk.VirtualRouterOfferingInventory import org.zstack.sdk.VirtualRouterVmInventory @@ -296,14 +297,32 @@ class OperateLoadBalancerCase extends SubCase { assert Q.New(VipNetworkServicesRefVO.class).eq(VipNetworkServicesRefVO_.vipUuid, vip.getUuid()).select(VipNetworkServicesRefVO_.serviceType).findValue() == VipUseForList.LB_NETWORK_SERVICE_TYPE assert Q.New(VipPeerL3NetworkRefVO.class).eq(VipPeerL3NetworkRefVO_.vipUuid, vip.getUuid()).count() == 0 + List httpAlgos = ["deflate","gzip", "raw-deflate"] + List httpAlgosInput = ["deflate","gzip", "raw-deflate\n"] def listener = createLoadBalancerListener { loadBalancerUuid = lb.uuid name = "listener" instancePort = 22 loadBalancerPort = 22 - protocol = LoadBalancerConstants.LB_PROTOCOL_TCP + protocol = LoadBalancerConstants.LB_PROTOCOL_HTTP + httpCompressAlgos = httpAlgosInput } as LoadBalancerListenerInventory + String httpAlgosTag = String.join(" ", httpAlgos) + List tags = querySystemTag { + conditions = [ + "resourceUuid=${listener.uuid}", + "tag=httpCompressAlgos::${httpAlgosTag}".toString() + ]} + assert tags.size() == 1 + httpAlgosTag = String.join(" ", httpAlgosInput) + tags = querySystemTag { + conditions = [ + "resourceUuid=${listener.uuid}", + "tag=httpCompressAlgos::${httpAlgosTag}".toString() + ]} + assert tags.size() == 0 + def result = getCandidateVmNicsForLoadBalancer { listenerUuid = listener.uuid } as List diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy index db262f5b196..ed9a2736c5f 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/AddSecurityGroupRuleOptimizedCase.groovy @@ -172,7 +172,8 @@ class AddSecurityGroupRuleOptimizedCase extends SubCase { errorRule.protocol = "TCP" errorRule.startPort = null errorRule.endPort = null - errorRule.dstPortRange = "1,2,3,4,5,6-7,8-10,11-12" + // The current security group allows a maximum of 50 ports (ver:5.4.0) + errorRule.dstPortRange = "1,2,3,4,5,6,7,8,9,10,11,12,13,14-16,17" expect(AssertionError) { addSecurityGroupRule { securityGroupUuid = sg1.uuid diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy index 27064ffc76d..ad29787ef1e 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleCase.groovy @@ -374,7 +374,7 @@ class ChangeSecurityGroupRuleCase extends SubCase { r.description = 'ingress-rule-1' r.ipVersion = 4 r.dstPortRange = '300-400' - r.srcIpRange = '3.3.3.3' + r.srcIpRange = '3.3.3.0/24\n' r.protocol = 'TCP' sg4 = addSecurityGroupRule { @@ -629,6 +629,55 @@ class ChangeSecurityGroupRuleCase extends SubCase { assert rule2.dstPortRange == '400-500' } + void testStripSpaceTabNewLineFromRule() { + SecurityGroupRuleAO r = new SecurityGroupRuleAO() + r.type = "Egress" + r.description = "testStripSpaceTabNewLine" + r.ipVersion = 4 + r.dstPortRange = "433, 8888" + r.dstIpRange = "1.1.1.1, 2.2.2.2, 3.3.3.0/24" + r.protocol = "TCP" + + sg2 = addSecurityGroupRule { + securityGroupUuid = sg2.uuid + rules = [r] + } + + SecurityGroupRuleInventory rule = sg2.rules.find { it.description == "testStripSpaceTabNewLine" } + + SQL.New(SecurityGroupRuleVO.class).eq(SecurityGroupRuleVO_.securityGroupUuid, sg2.uuid) + .eq(SecurityGroupRuleVO_.uuid, rule.uuid) + .set(SecurityGroupRuleVO_.dstPortRange, "433, \n \t8888\n") + .set(SecurityGroupRuleVO_.dstIpRange, "\t1.1.1.1, \n2.2.2.2, \t \n3.3.3.0/24 \n") + .update() + + KVMAgentCommands.ApplySecurityGroupRuleCmd cmd = null + env.afterSimulator(KVMSecurityGroupBackend.SECURITY_GROUP_APPLY_RULE_PATH) { rsp, HttpEntity e -> + cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ApplySecurityGroupRuleCmd.class) + return rsp + } + + addVmNicToSecurityGroup{ + securityGroupUuid = sg2.uuid + vmNicUuids = [vm2.vmNics.get(0).uuid] + } + + Boolean find = false + retryInSecs(100) { + assert cmd != null : "ApplySecurityGroupRuleCmd not received" + for (ruleTOLists in cmd.ruleTOs.values()) { + for (ruleTO in ruleTOLists) { + if (ruleTO.dstIpRange == "1.1.1.1,2.2.2.2,3.3.3.0/24" && ruleTO.dstPortRange == "433,8888" ) { + find = true + break + } + } + } + assert find : "RuleTOs not found with expected dstIpRange and dstPortRange" + } + } + + @Override void clean() { env.delete() @@ -676,5 +725,6 @@ class ChangeSecurityGroupRuleCase extends SubCase { testChangeRuleDuplicate() testChangeRuleParamLimit() testChangeRuleWithOldRules() + testStripSpaceTabNewLineFromRule() } } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy index b3973997a7f..326010c36e5 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ChangeSecurityGroupRuleStateCase.groovy @@ -72,9 +72,9 @@ class ChangeSecurityGroupRuleStateCase extends SubCase { ip4Rules = cmd.ruleTOs.get(sg1.uuid) assert ip4Rules.size() == 12 - assert ip4Rules.find {it.priority == 1 && it.type == "Ingress" && it.state == "Enabled"} - assert ip4Rules.find {it.priority == 3 && it.type == "Ingress" && it.state == "Enabled"} - assert ip4Rules.find {it.priority == 5 && it.type == "Ingress" && it.state == "Enabled"} + assert ip4Rules.find {it.priority == 1 && it.ruleType == "Ingress" && it.state == "Enabled"} + assert ip4Rules.find {it.priority == 3 && it.ruleType == "Ingress" && it.state == "Enabled"} + assert ip4Rules.find {it.priority == 5 && it.ruleType == "Ingress" && it.state == "Enabled"} } cmd = null diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy index 48b96e35899..28d94f110b7 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/CreateSystemtagWithSecurityGroupCase.groovy @@ -44,8 +44,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { void testCreateVmWithSystemtag() { KVMAgentCommands.ApplySecurityGroupRuleCmd cmd = null + Set allCmds = [] as Set env.afterSimulator(KVMSecurityGroupBackend.SECURITY_GROUP_APPLY_RULE_PATH) { rsp, HttpEntity e -> cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ApplySecurityGroupRuleCmd.class) + if (cmd.vmNicTOs != null && !cmd.vmNicTOs.isEmpty()) { + allCmds << cmd + } return rsp } @@ -64,11 +68,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.get(0).priority == 1 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm1.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm1.vmNics[0].uuid } } cmd = null + allCmds = [] vm2 = createVmInstance { name = "vm2" @@ -84,11 +89,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg2.uuid }.priority == 2 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid } } cmd = null + allCmds = [] createSystemTag { resourceType = VmInstanceVO.class.simpleName @@ -107,15 +113,19 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg3.uuid }.priority == 3 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm2.vmNics[0].uuid } } } void testAttachNicWithSystemtag() { KVMAgentCommands.ApplySecurityGroupRuleCmd cmd = null + Set allCmds = [] as Set env.afterSimulator(KVMSecurityGroupBackend.SECURITY_GROUP_APPLY_RULE_PATH) { rsp, HttpEntity e -> cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.ApplySecurityGroupRuleCmd.class) + if (cmd.vmNicTOs != null && !cmd.vmNicTOs.isEmpty()) { + allCmds << cmd + } return rsp } @@ -133,11 +143,12 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg3.uuid }.priority == 1 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.get(0).vmNicUuid == vm3.vmNics[0].uuid + assert allCmds != null + assert allCmds.find { it.vmNicTOs.get(0).vmNicUuid == vm3.vmNics[0].uuid } } cmd = null + allCmds = [] attachSecurityGroupToL3Network { securityGroupUuid = sg3.uuid @@ -155,8 +166,8 @@ class CreateSystemtagWithSecurityGroupCase extends SubCase { assert refvos.find { it.securityGroupUuid == sg3.uuid }.priority == 1 retryInSecs { - assert cmd != null - assert cmd.vmNicTOs.size() == 2 + assert allCmds != null + assert allCmds.find { it.vmNicTOs.size() == 2 } } } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy new file mode 100644 index 00000000000..641f941a595 --- /dev/null +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/SecurityGroupAccountCase.groovy @@ -0,0 +1,145 @@ +package org.zstack.test.integration.networkservice.provider.flat.securitygroup + +import org.zstack.network.securitygroup.APIAddSecurityGroupRuleMsg.SecurityGroupRuleAO +import org.zstack.sdk.AccountInventory +import org.zstack.sdk.L3NetworkInventory +import org.zstack.sdk.SecurityGroupInventory +import org.zstack.sdk.SessionInventory +import org.zstack.sdk.VmInstanceInventory +import org.zstack.test.integration.networkservice.provider.NetworkServiceProviderTest +import org.zstack.test.integration.networkservice.provider.virtualrouter.VirtualRouterNetworkServiceEnv +import org.zstack.testlib.EnvSpec +import org.zstack.testlib.SubCase + +class SecurityGroupAccountCase extends SubCase { + EnvSpec env + + L3NetworkInventory l3Net + VmInstanceInventory vm1, vm2, vm3, vm4 + SecurityGroupInventory sg1, sg2, sg3, sg4 + SessionInventory session1 + AccountInventory user1 + + void testDeleteSecurityGroupCase1() { + addVmNicToSecurityGroup { + securityGroupUuid = sg1.uuid + vmNicUuids = [vm1.vmNics[0].uuid] + } + addVmNicToSecurityGroup { + securityGroupUuid = sg2.uuid + vmNicUuids = [vm1.vmNics[0].uuid] + } + addVmNicToSecurityGroup { + securityGroupUuid = sg3.uuid + vmNicUuids = [vm1.vmNics[0].uuid] + } + + addVmNicToSecurityGroup { + securityGroupUuid = sg4.uuid + vmNicUuids = [vm4.vmNics[0].uuid] + } + + SecurityGroupRuleAO r = new SecurityGroupRuleAO() + r.type = 'Egress' + r.description = 'sg4-egress-rule-1' + r.protocol = 'TCP' + r.dstPortRange = '40-400' + sg4 = addSecurityGroupRule { + sessionId = session1.uuid + securityGroupUuid = sg4.uuid + remoteSecurityGroupUuids = [sg2.uuid] + rules = [r] + } + + r.protocol = 'UDP' + r.dstPortRange = '50-500' + r.description = 'sg4-egress-rule-2' + sg4 = addSecurityGroupRule { + sessionId = session1.uuid + securityGroupUuid = sg4.uuid + rules = [r] + priority = -1 + } + } + + @Override + void clean() { + env.delete() + } + + @Override + void setup() { + useSpring(NetworkServiceProviderTest.springSpec) + } + + @Override + void environment() { + env = VirtualRouterNetworkServiceEnv.fourVmThreeHostNoEipForSecurityGroupEnv() + } + + @Override + void test() { + env.create { + l3Net = env.inventoryByName("l3") as L3NetworkInventory + vm1 = env.inventoryByName("vm1") as VmInstanceInventory // vm1 in host1 + vm2 = env.inventoryByName("vm2") as VmInstanceInventory // vm2 in host2 + vm3 = env.inventoryByName("vm3") as VmInstanceInventory // vm3 in host3 + vm4 = env.inventoryByName("vm4") as VmInstanceInventory // vm4 in host3 + + user1 = createAccount { + name = "user1" + password = "password" + } as AccountInventory + + session1 = logInByAccount { + accountName = user1.name + password = "password" + } + sg1 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-1" + ipVersion = 4 + } as SecurityGroupInventory + + sg2 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-2" + ipVersion = 6 + } as SecurityGroupInventory + + sg3 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-3" + ipVersion = 4 + } as SecurityGroupInventory + + sg4 = createSecurityGroup { + sessionId = session1.uuid + name = "sg-4" + ipVersion = 6 + } as SecurityGroupInventory + + attachSecurityGroupToL3Network { + securityGroupUuid = sg1.uuid + l3NetworkUuid = l3Net.uuid + } + attachSecurityGroupToL3Network { + securityGroupUuid = sg2.uuid + l3NetworkUuid = l3Net.uuid + } + attachSecurityGroupToL3Network { + securityGroupUuid = sg3.uuid + l3NetworkUuid = l3Net.uuid + } + attachSecurityGroupToL3Network { + securityGroupUuid = sg4.uuid + l3NetworkUuid = l3Net.uuid + } + } + + testDeleteSecurityGroupCase1() + deleteAccount { + uuid = user1.uuid + } + } +} diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy index 4a1b5a553e3..dcb01f9dafe 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/securitygroup/ValidateSecurityGroupRuleCase.groovy @@ -107,6 +107,41 @@ class ValidateSecurityGroupRuleCase extends SubCase { assert e.code == SecurityGroupErrors.RULE_IP_FIELD_ERROR.toString() } + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Ingress" + protocol = "TCP" + allowedCidr = "3.168.1.100, 33.168.1.0/24\n" + startPort = 500 + endPort = 600 + } + + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Ingress" + protocol = "TCP" + srcIpRange = "3.168.1.0/24,\n33.168.1.0/24" + startPort = 500 + endPort = 600 + } + + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Egress" + protocol = "TCP" + dstIpRange = "3.168.1.0/24,\n33.168.1.0/24" + startPort = 500 + endPort = 600 + } + + validateSecurityGroupRule { + securityGroupUuid = sg1.uuid + type = "Egress" + protocol = "TCP" + allowedCidr = "3.168.1.0/24,\n33.168.1.0/24" + dstPortRange = "111-500\t\n" + } + SecurityGroupRuleAO r = new SecurityGroupRuleAO() r.type = "Ingress" r.ipVersion = 4 diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy index a5a67d96a1e..68038204981 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/flat/userdata/TestUserDataBatchApllyCase.groovy @@ -1,7 +1,9 @@ package org.zstack.test.integration.networkservice.provider.flat.userdata import org.springframework.http.HttpEntity +import org.zstack.header.network.l3.L3NetworkType import org.zstack.header.network.service.NetworkServiceType +import org.zstack.header.vm.VmInstanceVO import org.zstack.network.service.eip.EipConstant import org.zstack.network.service.flat.FlatNetworkServiceConstant import org.zstack.network.service.flat.FlatUserdataBackend @@ -135,6 +137,11 @@ class TestUserDataBatchApllyCase extends SubCase { imageUuid = image.uuid l3NetworkUuids = [l31.uuid] } + createSystemTag { + resourceUuid = vm1.uuid + resourceType = VmInstanceVO.class.getSimpleName() + tag = "hostname::kvm" + } VmNicInventory nic1 = vm1.vmNics.get(0) VmInstanceInventory vm2 = createVmInstance { @@ -143,6 +150,11 @@ class TestUserDataBatchApllyCase extends SubCase { imageUuid = image.uuid l3NetworkUuids = [l31.uuid] } + createSystemTag { + resourceUuid = vm2.uuid + resourceType = VmInstanceVO.class.getSimpleName() + tag = "hostname::kvm" + } VmNicInventory nic2 = vm2.vmNics.get(0) VmInstanceInventory vm3 = createVmInstance { @@ -151,6 +163,11 @@ class TestUserDataBatchApllyCase extends SubCase { imageUuid = image.uuid l3NetworkUuids = [l32.uuid] } + createSystemTag { + resourceUuid = vm3.uuid + resourceType = VmInstanceVO.class.getSimpleName() + tag = "hostname::kvm" + } VmNicInventory nic3 = vm3.vmNics.get(0) FlatUserdataBackend.BatchApplyUserdataCmd cmd = null @@ -168,6 +185,20 @@ class TestUserDataBatchApllyCase extends SubCase { assert to.vmIp == nic1.ip || to.vmIp == nic2.ip || to.vmIp == nic3.ip assert to.netmask == nic1.netmask || to.netmask == nic2.netmask || to.netmask == nic3.netmask assert to.l3NetworkUuid == nic1.l3NetworkUuid || to.l3NetworkUuid == nic2.l3NetworkUuid || to.l3NetworkUuid == nic3.l3NetworkUuid + assert to.metadata.vmUuid == vm1.uuid || to.metadata.vmUuid == vm2.uuid || to.metadata.vmUuid == vm3.uuid + assert to.metadata.mac == nic1.mac || to.metadata.mac == nic2.mac || to.metadata.mac == nic3.mac + assert to.metadata.vmHostname == host.name + assert to.metadata.regionName +// assert to.metadata.dnsServersIp +// assert to.metadata.vpcId + + for (FlatUserdataBackend.NetworkInterfaceDetails nid : to.networkInterfaces) { + assert nid.ip == nic1.ip || nid.ip == nic2.ip || nid.ip == nic3.ip + assert nid.netmask == nic1.netmask || nid.netmask == nic2.netmask || nid.netmask == nic3.netmask + assert nid.gateway == nic1.gateway || nid.gateway == nic2.gateway || nid.gateway == nic3.gateway + assert nid.macAddress == nic1.mac || nid.macAddress == nic2.mac || nid.macAddress == nic3.mac + assert nid.vpcCidrBlock == l31.ipRanges.get(0).networkCidr || nid.vpcCidrBlock == l32.ipRanges.get(0).networkCidr + } } FlatUserdataBackend.CleanupUserdataCmd ccmd = null diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy index 2dfa0991753..1b606f4fa09 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/LoadBalancerServerGroupVmCycleCase.groovy @@ -246,49 +246,23 @@ class LoadBalancerServerGroupVmCycleCase extends SubCase{ return rsp } - /* stop vm will refresh lb backedn */ + /* stop vm will not refresh lb backedn */ stopVmInstance { uuid = vm2.uuid } - assert refreshLbCmd != null - assert refreshLbCmd.lbs.size() == 2 - for (VirtualRouterLoadBalancerBackend.LbTO t : refreshLbCmd.lbs) { - if (t.listenerUuid == lb22.uuid) { - assert t.nicIps.size() == 1 - assert t.nicIps.get(0) == nic1.ip - } else { - assert t.nicIps.size() == 1 - assert t.nicIps.get(0) == nic3.ip - } - } + assert refreshLbCmd == null - /* start vm will refresh lb backend */ + /* start vm will not refresh lb backend */ startVmInstance { uuid = vm2.uuid } - assert refreshLbCmd != null - assert refreshLbCmd.lbs.size() == 2 - for (VirtualRouterLoadBalancerBackend.LbTO t : refreshLbCmd.lbs) { - if (t.listenerUuid == lb22.uuid) { - assert t.nicIps.size() == 2 - } else { - assert t.nicIps.size() == 2 - } - } + assert refreshLbCmd == null - /* start vm will refresh lb backend */ + /* start vm will not refresh lb backend */ rebootVmInstance { uuid = vm2.uuid } - assert refreshLbCmd != null - assert refreshLbCmd.lbs.size() == 2 - for (VirtualRouterLoadBalancerBackend.LbTO t : refreshLbCmd.lbs) { - if (t.listenerUuid == lb22.uuid) { - assert t.nicIps.size() == 2 - } else { - assert t.nicIps.size() == 2 - } - } + assert refreshLbCmd == null /* destroy vm will refresh lb backend */ destroyVmInstance { @@ -332,7 +306,7 @@ class LoadBalancerServerGroupVmCycleCase extends SubCase{ } assert refreshLbCmd == null - /* start will refrevrsh lb backend */ + /* start will refresh lb backend */ startVmInstance { uuid = vr.uuid } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy index 55e7b5bd66f..92d8714625b 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/RefreshLoadBalancerCase.groovy @@ -214,13 +214,12 @@ class RefreshLoadBalancerCase extends SubCase { return rsp } + // stop vm will not refresh lb stopVmInstance { uuid = vm.uuid } - // listeners with same nic on same load balance only refresh rules one time - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 def vm2 = env.inventoryByName("vm2") as VmInstanceInventory @@ -236,8 +235,7 @@ class RefreshLoadBalancerCase extends SubCase { uuid = vm2.uuid } - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 // one lb doesn't have nic removeVmNicFromLoadBalancer { @@ -253,12 +251,13 @@ class RefreshLoadBalancerCase extends SubCase { cmd = null count = 0 + // start vm will not refresh lb either startVmInstance { uuid = vm.uuid } - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 + // no load balancer rules won't refresh rules removeVmNicFromLoadBalancer { @@ -273,8 +272,8 @@ class RefreshLoadBalancerCase extends SubCase { uuid = vm.uuid } - assert count == 1 - assert cmd.lbs.size() == 3 + assert count == 0 + VipInventory vip2 = createVip { @@ -316,7 +315,6 @@ class RefreshLoadBalancerCase extends SubCase { uuid = vm.uuid } - assert countInvoked == 2 - assert rulesSize == 4 + assert countInvoked == 0 } } diff --git a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy index ed4d8288ca6..86b0ce9a5f8 100644 --- a/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/networkservice/provider/virtualrouter/loadbalancer/VirtualRouterLoadBalancerListenerCase.groovy @@ -147,6 +147,11 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ name = "lb" useVip("pubL3") } + + lb { + name = "lb2" + useVip("pubL3") + } } vm { @@ -182,6 +187,8 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ testOperateLBRedirectRuleCase() testValidateLBRedirectAclCase() testOperateLBRedirectAclCase() + testDeleteAclWithMultipleListenersCase() + testAclStatusRollbackCase() } } @@ -1130,6 +1137,12 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ AccessControlListInventory acl8 = createAccessControlList { name = "redirect-acl-test-7-8" } + + acl8 = updateAccessControlList { + uuid = acl8.uuid + name = "redirect-acl-test-7-8-update" + description = "redirect-acl-test-7-8-update" + } AccessControlListEntryInventory redirectRule3 = addAccessControlListRedirectRule { name = "redirect rule" domain = "*.zstack.io" @@ -1305,6 +1318,140 @@ class VirtualRouterLoadBalancerListenerCase extends SubCase{ } + private void testDeleteAclWithMultipleListenersCase() { + def load = env.inventoryByName("lb2") as LoadBalancerInventory + def vm = env.inventoryByName("vm") as VmInstanceInventory + def l3 = env.inventoryByName("l3") as L3NetworkInventory + VirtualRouterLoadBalancerBackend.RefreshLbCmd cmd = null + int refreshCount = 0 + env.afterSimulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity e -> + cmd = JSONObjectUtil.toObject(e.body, VirtualRouterLoadBalancerBackend.RefreshLbCmd.class) + refreshCount++ + return rsp + } + + // Create multiple listeners associated with the same load balancer + List listeners = new ArrayList<>() + int listenerCount = 3 // Create 3 listeners to ensure multiple associations + for (int i = 0; i < listenerCount; i++) { + CreateLoadBalancerListenerAction listenerAction = new CreateLoadBalancerListenerAction() + listenerAction.loadBalancerUuid = load.uuid + listenerAction.name = "listener-${i}" + listenerAction.loadBalancerPort = 9000 + i + listenerAction.instancePort = 9000 + i + listenerAction.protocol = "udp" + listenerAction.sessionId = adminSession() + CreateLoadBalancerListenerAction.Result lblRes = listenerAction.call() + assert lblRes.error == null + listeners.add(lblRes.value.inventory) + + // Add VM NIC to each listener to ensure backend server group exists + addVmNicToLoadBalancer { + vmNicUuids = [vm.vmNics.find { nic -> nic.l3NetworkUuid == l3.uuid }.uuid] + listenerUuid = lblRes.value.inventory.uuid + } + } + + // Create an ACL + AccessControlListInventory acl = createAccessControlList { + name = "acl-multi-listeners" + } + addAccessControlListEntry { + aclUuid = acl.uuid + entries = "192.168.0.1,192.168.1.0/24" + } + + // Associate the ACL with all listeners + listeners.each { listener -> + addAccessControlListToLoadBalancer { + aclUuids = [acl.uuid] + aclType = LoadBalancerAclType.black.toString() + listenerUuid = listener.uuid + } + } + + // Verify that ACL is associated with all listeners + listeners.each { listener -> + def refs = Q.New(LoadBalancerListenerACLRefVO.class) + .eq(LoadBalancerListenerACLRefVO_.listenerUuid, listener.uuid) + .eq(LoadBalancerListenerACLRefVO_.aclUuid, acl.uuid) + .list() + assert refs.size() == 1 + } + + // Delete the ACL and verify all associations are removed + cmd = null + refreshCount = 0 + deleteAccessControlList { + uuid = acl.uuid + } + + // Retry to ensure the deletion operation is completed and messages are sent + retryInSecs { + assert cmd != null + assert cmd.lbs.size() == listenerCount + assert refreshCount == listenerCount + } + + // Verify that all LoadBalancerListenerACLRefVO records are removed + listeners.each { listener -> + def refs = Q.New(LoadBalancerListenerACLRefVO.class) + .eq(LoadBalancerListenerACLRefVO_.listenerUuid, listener.uuid) + .eq(LoadBalancerListenerACLRefVO_.aclUuid, acl.uuid) + .list() + assert refs.isEmpty() + } + + // Verify that AccessControlListEntryVO records are also removed + def entries = Q.New(AccessControlListEntryVO.class) + .eq(AccessControlListEntryVO_.aclUuid, acl.uuid) + .list() + assert entries.isEmpty() + } + + void testAclStatusRollbackCase() { + def lb = env.inventoryByName("lb") as LoadBalancerInventory + def vm = env.inventoryByName("vm") as VmInstanceInventory + def vm2 = env.inventoryByName("vm2") as VmInstanceInventory + def l3 = env.inventoryByName("l3") as L3NetworkInventory + def _name = "testacl" + + CreateLoadBalancerListenerAction listenerAction = new CreateLoadBalancerListenerAction() + listenerAction.loadBalancerUuid = lb.uuid + listenerAction.name = _name + listenerAction.loadBalancerPort = 8080 + listenerAction.instancePort = 8080 + listenerAction.protocol = "http" + listenerAction.sessionId = adminSession() + CreateLoadBalancerListenerAction.Result createRes = listenerAction.call() + assert createRes.error == null + def listenerUuid_lb = createRes.value.inventory.uuid + + List nicUuids = [vm.vmNics.find{ nic -> nic.l3NetworkUuid == l3.uuid }.uuid, vm2.vmNics.find{ nic -> nic.l3NetworkUuid == l3.uuid }.uuid] + addVmNicToLoadBalancer { + vmNicUuids = nicUuids + listenerUuid = listenerUuid_lb + } + + def oldAclStatus = LoadBalancerSystemTags.BALANCER_ACL.getTokenByResourceUuid(listenerUuid_lb, LoadBalancerSystemTags.BALANCER_ACL_TOKEN) + assert oldAclStatus == "disable" + + env.simulator(VirtualRouterLoadBalancerBackend.REFRESH_LB_PATH) { rsp, HttpEntity e -> + VirtualRouterLoadBalancerBackend.RefreshLbRsp rspFail = new VirtualRouterLoadBalancerBackend.RefreshLbRsp() + rspFail.setError("Acl refresh failed") + rspFail.setSuccess(false) + return rspFail + } + + ChangeLoadBalancerListenerAction changeAction = new ChangeLoadBalancerListenerAction() + changeAction.uuid = listenerUuid_lb + changeAction.aclStatus = LoadBalancerAclStatus.enable.toString() + changeAction.sessionId = adminSession() + ChangeLoadBalancerListenerAction.Result changeRes = changeAction.call() + def rollbackedStatus = LoadBalancerSystemTags.BALANCER_ACL.getTokenByResourceUuid(listenerUuid_lb, LoadBalancerSystemTags.BALANCER_ACL_TOKEN) + assert rollbackedStatus == "disable" + } + @Override void clean() { def load = env.inventoryByName("lb") as LoadBalancerInventory diff --git a/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy b/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy index 952a8d924b6..11b4957fb32 100644 --- a/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/other/mysqlschema/MustPassCase.groovy @@ -13,6 +13,7 @@ class MustPassCase extends SubCase { @Override void setup() { + useSpring(Mysql57Test.springSpec) } @Override diff --git a/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy b/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy index 6684b602860..a6940fab90e 100644 --- a/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/portal/ManagementNodeHeartbeatCase.groovy @@ -58,10 +58,10 @@ class ManagementNodeHeartbeatCase extends SubCase { } void testUnexpectedManagementNodeRecord() { + prepareInvalidRecords() ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.updateValue(1) PortalGlobalProperty.MAX_HEARTBEAT_FAILURE = 2 - prepareInvalidRecords() int heartbeatFailureTimeout = ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.value(Integer.class) * PortalGlobalProperty.MAX_HEARTBEAT_FAILURE int heartbeatUpdateDelay = 1 * ManagementNodeGlobalConfig.NODE_HEARTBEAT_INTERVAL.value(Integer.class) @@ -80,7 +80,12 @@ class ManagementNodeHeartbeatCase extends SubCase { assert count == 2 // wait one more interval to wait 127.0.0.111 cleaned - sleep(TimeUnit.SECONDS.toMillis(failureInterval * 3)) + // exceed 3s will be added in suspects + // next heartbeat will be clean + // but hb timestamp is second precision, so it will not be added until 4s. + // and cleaned after 5s + // so we need to wait more than 5s + sleep(TimeUnit.SECONDS.toMillis(failureInterval * 3) + 500) count = dbf.count(ManagementNodeVO.class) assert count == 1 diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy index 65c29578d25..57802134edf 100755 --- a/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/backup/ceph/CephBSAddImageCase.groovy @@ -9,17 +9,15 @@ import org.zstack.header.storage.backup.BackupStorageVO_ import org.zstack.sdk.BackupStorageInventory import org.zstack.sdk.DiskOfferingInventory import org.zstack.sdk.ImageInventory -import org.zstack.sdk.InstanceOfferingInventory +import org.zstack.sdk.SessionInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.sdk.VolumeInventory import org.zstack.storage.ceph.backup.CephBackupStorageBase -import org.zstack.storage.ceph.backup.CephBackupStorageMonVO import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil - /** * Created by lining on 2017/3/31. */ @@ -27,6 +25,7 @@ class CephBSAddImageCase extends SubCase{ EnvSpec env int failCount = 0 final bsMonsCount = 2 + SessionInventory normalSession @Override void setup() { @@ -97,6 +96,7 @@ class CephBSAddImageCase extends SubCase{ @Override void test() { env.create { + prepareEnv() simulatorEnv() testImageBackupStorageRefVOWhenAddImage() testUploadImage() @@ -105,7 +105,30 @@ class CephBSAddImageCase extends SubCase{ } } + void prepareEnv() { + createAccount { + name = "test" + password = "password" + } + + normalSession = logInByAccount { + accountName = "test" + password = "password" + } as SessionInventory + } + void simulatorEnv() { + env.preSimulator(CephBackupStorageBase.GET_LOCAL_FILE_SIZE) { HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, CephBackupStorageBase.DownloadCmd.class) + if (cmd.url.startsWith("file:/")) { + if (++failCount < bsMonsCount) { + throw new Exception("on purpose") + } else { + failCount = 0 + } + } + } + env.preSimulator(CephBackupStorageBase.DOWNLOAD_IMAGE_PATH) { HttpEntity e -> def cmd = JSONObjectUtil.toObject(e.body, CephBackupStorageBase.DownloadCmd.class) if (cmd.url.startsWith("file:/")) { @@ -175,6 +198,14 @@ class CephBSAddImageCase extends SubCase{ format = ImageConstant.ISO_FORMAT_STRING } + ImageInventory newImage5 = addImage { + name = "image3" + url = "file:///my-site/foo.iso" + backupStorageUuids = [bs.uuid] + format = ImageConstant.ISO_FORMAT_STRING + sessionId = normalSession.uuid + } + assert 1 == Q.New(ImageBackupStorageRefVO.class) .eq(ImageBackupStorageRefVO_.imageUuid, newImage.uuid) .count() diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy index 3be03f0332a..b131d740241 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/ceph/CephOperationCase.groovy @@ -3,6 +3,7 @@ package org.zstack.test.integration.storage.ceph import org.springframework.http.HttpEntity import org.zstack.core.config.GlobalConfigVO import org.zstack.core.config.GlobalConfigVO_ +import org.zstack.core.db.DatabaseFacade import org.zstack.core.db.Q import org.zstack.header.storage.primary.PrimaryStorageVO import org.zstack.header.storage.primary.PrimaryStorageVO_ @@ -13,6 +14,8 @@ import org.zstack.header.storage.snapshot.VolumeSnapshotTreeVO_ import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig import org.zstack.storage.ceph.DataSecurityPolicy +import org.zstack.storage.ceph.backup.CephBackupStorageMonVO +import org.zstack.storage.ceph.backup.CephBackupStorageVO import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec @@ -25,6 +28,7 @@ class CephOperationCase extends SubCase { EnvSpec env PrimaryStorageInventory ps BackupStorageInventory bs + DatabaseFacade dbf @Override void setup() { @@ -123,6 +127,7 @@ class CephOperationCase extends SubCase { @Override void test() { + dbf = bean(DatabaseFacade.class) env.create { prepare() testAddPrimaryReplaceMon() @@ -130,6 +135,7 @@ class CephOperationCase extends SubCase { testAddBackupReplaceMon() testAddBackupSameMon() + testAddBackupMonWithSpecialPassword() testCephSnapshotTree() @@ -257,7 +263,7 @@ class CephOperationCase extends SubCase { .select(GlobalConfigVO_.value) .eq(GlobalConfigVO_.name, "sds.admin.password") .eq(GlobalConfigVO_.category, "ceph") - .findValue() == "password" + .findValue() == "Admin@123" updateGlobalConfig { category = CephGlobalConfig.CATEGORY @@ -273,6 +279,21 @@ class CephOperationCase extends SubCase { .findValue() == "PWD" } + void testAddBackupMonWithSpecialPassword() { + def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" + def hostname = "127.0.0.3" + def action = new AddMonToCephBackupStorageAction() + action.uuid = bs.uuid + action.sessionId = adminSession() + action.monUrls = ["root:${specialPassword}@${hostname}/?monPort=7777".toString()] + + AddMonToCephBackupStorageAction.Result result = action.call() + assert result.error == null + CephBackupStorageVO cvo = dbf.findByUuid(result.value.inventory.uuid, CephBackupStorageVO.class) + def addMonSuccess = cvo.mons.find { it.hostname == hostname && it.sshPassword == specialPassword } != null + assert addMonSuccess + } + @Override void clean() { env.delete() diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy index 9694b353c26..5fc8f14aa97 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsPrimaryStorageCase.groovy @@ -1,7 +1,19 @@ package org.zstack.test.integration.storage.primary.addon.zbs import org.springframework.http.HttpEntity +import org.zstack.core.db.Q +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO +import org.zstack.header.storage.addon.primary.ExternalPrimaryStorageVO_ +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO +import org.zstack.header.storage.primary.PrimaryStorageHostRefVO_ +import org.zstack.header.storage.primary.PrimaryStorageStatus +import org.zstack.cbd.MdsUri +import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.* +import org.zstack.storage.primary.PrimaryStorageGlobalConfig +import org.zstack.header.storage.primary.PrimaryStorageHostStatus +import org.zstack.storage.volume.VolumeGlobalConfig +import org.zstack.storage.zbs.ZbsConstants import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController import org.zstack.test.integration.storage.StorageTest @@ -9,6 +21,7 @@ import org.zstack.testlib.EnvSpec import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit +import org.zstack.utils.gson.JSONObjectUtil /** * @author Xingwei Yu @@ -21,6 +34,7 @@ class ZbsPrimaryStorageCase extends SubCase { PrimaryStorageInventory ps DiskOfferingInventory diskOffering VolumeInventory vol, vol2 + KVMHostInventory kvm @Override void clean() { @@ -78,8 +92,22 @@ class ZbsPrimaryStorageCase extends SubCase { hypervisorType = "KVM" kvm { - name = "kvm" - managementIp = "localhost" + name = "kvm-1" + managementIp = "127.0.0.1" + username = "root" + password = "password" + } + + kvm { + name = "kvm-2" + managementIp = "127.0.0.2" + username = "root" + password = "password" + } + + kvm { + name = "kvm-3" + managementIp = "127.0.0.3" username = "root" password = "password" } @@ -108,7 +136,7 @@ class ZbsPrimaryStorageCase extends SubCase { identity = "zbs" defaultOutputProtocol = "CBD" config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" - url = "" + url = "fake url" } attachBackupStorage("sftp") @@ -123,15 +151,117 @@ class ZbsPrimaryStorageCase extends SubCase { cluster = env.inventoryByName("cluster") as ClusterInventory ps = env.inventoryByName("zbs-1") as PrimaryStorageInventory diskOffering = env.inventoryByName("diskOffering") as DiskOfferingInventory + kvm = env.inventoryByName("kvm-1") as KVMHostInventory - testZbsStorageLifecycle() + testDefaultConfig() + testUpdateExternalPrimaryStorage() + testLifecycle() testDataVolumeLifecycle() - testZbsStorageNegativeScenario() + testMdsPing() + testCheckHostStorageConnection() + testNegativeScenario() testDataVolumeNegativeScenario() + testDecodeMdsUriWithSpecialPassword() + } + } + + void testCheckHostStorageConnection() { + attachPrimaryStorageToCluster { + primaryStorageUuid = ps.uuid + clusterUuid = cluster.uuid + } + + env.afterSimulator(ZbsStorageController.CHECK_HOST_STORAGE_CONNECTION_PATH) { rsp, HttpEntity e -> + ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) + + ZbsStorageController.CheckHostStorageConnectionRsp checkHostStorageConnectionRsp = new ZbsStorageController.CheckHostStorageConnectionRsp() + checkHostStorageConnectionRsp.error = "fake error" + checkHostStorageConnectionRsp.success = false + + return checkHostStorageConnectionRsp + } + + expect(AssertionError.class) { + reconnectHost { + uuid = kvm.getUuid() + } + } + + retryInSecs { + assert Q.New(PrimaryStorageHostRefVO.class) + .eq(PrimaryStorageHostRefVO_.primaryStorageUuid, ps.uuid) + .eq(PrimaryStorageHostRefVO_.hostUuid, kvm.getUuid()) + .eq(PrimaryStorageHostRefVO_.status, PrimaryStorageHostStatus.Disconnected) + .count() == 1 + } + + env.cleanSimulatorAndMessageHandlers() + + detachPrimaryStorageFromCluster { + primaryStorageUuid = ps.uuid + clusterUuid = cluster.uuid } } - void testZbsStorageLifecycle() { + void testUpdateExternalPrimaryStorage() { + expect(AssertionError.class) { + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[],\"logicalPoolName\":\"lpool1\"}" + } + } + + expect(AssertionError.class) { + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.1\"],\"logicalPoolName\":\"lpool1\"}" + } + } + + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\"],\"logicalPoolName\":\"lpool1\"}" + } + + String addonInfo = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert !addonInfo.contains("127.0.1.3") + + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1:33\",\"root:password@127.0.1.2\"],\"logicalPoolName\":\"lpool1\"}" + } + + addonInfo = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert addonInfo.contains("\"port\":33,\"addr\":\"127.0.1.1\"") + + updateExternalPrimaryStorage { + uuid = ps.uuid + config = "{\"mdsUrls\":[\"root:password@127.0.1.1\",\"root:password@127.0.1.2\",\"root:password@127.0.1.3\"],\"logicalPoolName\":\"lpool1\"}" + } + + addonInfo = Q.New(ExternalPrimaryStorageVO.class) + .select(ExternalPrimaryStorageVO_.addonInfo) + .eq(ExternalPrimaryStorageVO_.uuid, ps.uuid) + .findValue() + assert addonInfo.contains("127.0.1.3") + } + + void testDefaultConfig() { + def rc = getResourceConfig { + category = VolumeGlobalConfig.CATEGORY + name = VolumeGlobalConfig.VOLUME_PHYSICAL_BLOCK_SIZE.getName() + resourceUuid = ps.uuid + } as GetResourceConfigResult + assert rc.value == ZbsConstants.VOLUME_PHYSICAL_BLOCK_SIZE + } + + void testLifecycle() { updateExternalPrimaryStorage { uuid = ps.uuid name = "test-zbs-new-name" @@ -139,6 +269,7 @@ class ZbsPrimaryStorageCase extends SubCase { ps = queryPrimaryStorage {}[0] as ExternalPrimaryStorageInventory assert ps.name == "test-zbs-new-name" + assert ps.url == ZbsConstants.ZBS_CBD_PREFIX_SCHEME + ps.uuid reconnectPrimaryStorage { uuid = ps.uuid @@ -149,12 +280,102 @@ class ZbsPrimaryStorageCase extends SubCase { clusterUuid = cluster.uuid } + reconnectPrimaryStorage { + uuid = ps.uuid + } + + env.afterSimulator(ZbsStorageController.DEPLOY_CLIENT_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.DeployClientCmd) + + ZbsStorageController.DeployClientRsp deployClientRsp = new ZbsStorageController.DeployClientRsp() + if (cmd.ip.equals("127.0.0.1")) { + deployClientRsp.success = false + deployClientRsp.error = "on purpose" + } + + return deployClientRsp + } + + expect(AssertionError.class) { + reconnectPrimaryStorage { + uuid = ps.uuid + } + } + + env.cleanAfterSimulatorHandlers() + + reconnectPrimaryStorage { + uuid = ps.uuid + } + detachPrimaryStorageFromCluster { primaryStorageUuid = ps.uuid clusterUuid = cluster.uuid } } + void testMdsPing() { + PrimaryStorageGlobalConfig.PING_INTERVAL.updateValue(1) + + Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + + def addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() + + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + + env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() + if (cmd.addr.equals("127.0.1.1")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } + + return pingRsp + } + + sleep(2000) + + addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() + + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Connected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + + assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + + env.afterSimulator(ZbsPrimaryStorageMdsBase.PING_PATH) { rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, ZbsPrimaryStorageMdsBase.PingCmd.class) + ZbsPrimaryStorageMdsBase.PingRsp pingRsp = new ZbsPrimaryStorageMdsBase.PingRsp() + if (cmd.addr.equals("127.0.1.1")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } else if (cmd.addr.equals("127.0.1.2")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } else if (cmd.addr.equals("127.0.1.3")) { + pingRsp.success = false + pingRsp.error = "on purpose" + } + + return pingRsp + } + + sleep(2000) + + addonInfo = Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.addonInfo).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() + + assert addonInfo == "{\"clusterInfo\":{\"uuid\":\"123456789\",\"version\":\"1.6.1-for-test\"},\"mdsInfos\":[{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.1\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.2\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"},{\"username\":\"root\",\"password\":\"password\",\"port\":22,\"addr\":\"127.0.1.3\",\"externalAddr\":\"127.0.0.1\",\"status\":\"Disconnected\"}],\"logicalPoolInfos\":[{\"physicalPoolID\":1,\"redundanceAndPlaceMentPolicy\":{\"copysetNum\":300,\"replicaNum\":3,\"zoneNum\":3},\"logicalPoolID\":1,\"usedSize\":322961408,\"quota\":0,\"createTime\":1735875794,\"type\":0,\"rawWalUsedSize\":0,\"allocateStatus\":0,\"rawUsedSize\":968884224,\"physicalPoolName\":\"pool1\",\"capacity\":579933831168,\"logicalPoolName\":\"lpool1\",\"userPolicy\":\"eyJwb2xpY3kiIDogMX0=\",\"allocatedSize\":3221225472}]}" + + assert Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Disconnected + + env.cleanAfterSimulatorHandlers() + + sleep(2000) + + Q.New(ExternalPrimaryStorageVO.class).select(ExternalPrimaryStorageVO_.status).eq(ExternalPrimaryStorageVO_.uuid, ps.uuid).findValue() == PrimaryStorageStatus.Connected + + PrimaryStorageGlobalConfig.PING_INTERVAL.resetValue() + } + void testDataVolumeLifecycle() { vol = createDataVolume { name = "test" @@ -165,7 +386,7 @@ class ZbsPrimaryStorageCase extends SubCase { deleteVolume(vol.uuid) } - void testZbsStorageNegativeScenario() { + void testNegativeScenario() { expect(AssertionError.class) { addExternalPrimaryStorage { zoneUuid = zone.uuid @@ -196,13 +417,6 @@ class ZbsPrimaryStorageCase extends SubCase { return [:] } - env.simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> - def rsp = new ZbsStorageController.GetFactsRsp() - rsp.setSuccess(false) - rsp.setError("failed to GET_FACTS on purpose") - return rsp - } - expect(AssertionError.class) { addExternalPrimaryStorage { zoneUuid = zone.uuid @@ -218,12 +432,6 @@ class ZbsPrimaryStorageCase extends SubCase { return [:] } - env.simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> - def rsp = new ZbsStorageController.GetFactsRsp() - rsp.version = "1.4.0+6e9353ad+release" - return rsp - } - env.simulator(ZbsStorageController.GET_CAPACITY_PATH) { HttpEntity e, EnvSpec spec -> def rsp = new ZbsStorageController.GetCapacityRsp() rsp.setSuccess(false) @@ -287,6 +495,14 @@ class ZbsPrimaryStorageCase extends SubCase { } } + void testDecodeMdsUriWithSpecialPassword() { + def specialPassword = "password123-`=[];,./~!@#\$%^&*()_+|{}:<>?" + def mdsUri = "root:${specialPassword}@127.0.2.1" + MdsUri uri = new MdsUri(mdsUri); + assert uri.password == specialPassword + } + + void deleteVolume(String volUuid) { deleteDataVolume { uuid = volUuid diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy index 8670413c4a6..e5644c47072 100755 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephGCCase.groovy @@ -1,26 +1,26 @@ package org.zstack.test.integration.storage.primary.ceph +import org.springframework.http.HttpEntity +import org.zstack.core.db.SQL import org.zstack.core.gc.GCStatus +import org.zstack.core.gc.GarbageCollectorVO +import org.zstack.core.gc.GarbageCollectorVO_ +import org.zstack.header.exception.CloudRuntimeException import org.zstack.header.volume.VolumeDeletionPolicyManager -import org.zstack.sdk.DiskOfferingInventory -import org.zstack.sdk.GarbageCollectorInventory -import org.zstack.sdk.PrimaryStorageInventory -import org.zstack.sdk.VolumeInventory +import org.zstack.sdk.* import org.zstack.storage.ceph.CephGlobalConfig +import org.zstack.storage.ceph.primary.CephDeleteVolumeChainGC import org.zstack.storage.ceph.primary.CephDeleteVolumeGC +import org.zstack.storage.snapshot.DeleteVolumeSnapshotGC import org.zstack.storage.ceph.primary.CephPrimaryStorageBase import org.zstack.storage.volume.VolumeGlobalConfig +import org.zstack.storage.volume.VolumeSystemTags import org.zstack.test.integration.storage.CephEnv import org.zstack.test.integration.storage.StorageTest -import org.zstack.testlib.ClusterSpec -import org.zstack.testlib.DiskOfferingSpec -import org.zstack.testlib.EnvSpec -import org.zstack.testlib.HttpError -import org.zstack.testlib.PrimaryStorageSpec -import org.zstack.testlib.SubCase +import org.zstack.testlib.* +import org.zstack.utils.gson.JSONObjectUtil import java.util.concurrent.TimeUnit - /** * Created by kayo on 2018/7/25. */ @@ -137,6 +137,269 @@ class CephGCCase extends SubCase { } } + void testVolumeSnapshotGC() { + env.cleanSimulatorAndMessageHandlers() + VolumeInventory vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + + def sp = createVolumeSnapshot { + name = "test-gc" + volumeUuid = vol.uuid + } as VolumeSnapshotInventory + + def deleteFailed = true + def deleteSucVol = [] + env.simulator(CephPrimaryStorageBase.DELETE_SNAPSHOT_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new CephPrimaryStorageBase.DeleteSnapshotRsp() + if (deleteFailed) { + rsp.setError("it's children in trash, cannot delete") + } + return rsp + } + env.simulator(CephPrimaryStorageBase.DELETE_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new CephPrimaryStorageBase.DeleteRsp() + def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteCmd.class) + if (deleteSucVol.contains(cmd.installPath)) { + return rsp + } + if (deleteFailed) { + rsp.setError("snapshot exists") + } + return rsp + } + def callGc = false + def undeletedInstallPaths = [] + env.hijackSimulator(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH) { CephPrimaryStorageBase.DeleteVolumeChainRsp rsp, HttpEntity e -> + def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteVolumeChainCmd.class) + // mock install path not clean + rsp.undeletedInstallPaths = cmd.installPaths + + if (callGc) { + rsp.undeletedInstallPaths = undeletedInstallPaths + } + return rsp + } + def backingChain = [] + env.hijackSimulator(CephPrimaryStorageBase.GET_BACKING_CHAIN_PATH) { CephPrimaryStorageBase.GetBackingChainRsp rsp, HttpEntity e -> + rsp.backingChain = backingChain + return rsp + } + + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + + def spGC = queryGCJob { + conditions = ["runnerClass=${DeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + } as List + assert spGC.size() == 1 + assert spGC[0].status != GCStatus.Done.toString() + + def volGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeGC.class.name}".toString(), "context~=%${vol.installPath}%".toString()] + } as List + assert volGC.size() == 1 + assert volGC[0].status != GCStatus.Done.toString() + + deleteFailed = false + triggerGCJob { + uuid = spGC[0].uuid + } + + triggerGCJob { + uuid = volGC[0].uuid + } + + retryInSecs { + assert queryGCJob { + conditions = ["runnerClass=${DeleteVolumeSnapshotGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + }[0].status == GCStatus.Done.toString() + assert queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeGC.class.name}".toString(), "context~=%${vol.installPath}%".toString()] + }[0].status == GCStatus.Done.toString() + } + SQL.New(GarbageCollectorVO.class).in(GarbageCollectorVO_.uuid, [volGC[0].uuid, spGC[0].uuid]).hardDelete() + vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + + sp = createVolumeSnapshot { + name = "test-gc" + volumeUuid = vol.uuid + } as VolumeSnapshotInventory + + VolumeInventory incVol = createDataVolumeFromVolumeSnapshot { + volumeSnapshotUuid = sp.uuid + name = "incVol" + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + } + + def sp2 = createVolumeSnapshot { + name = "test-gc2" + volumeUuid = incVol.uuid + } as VolumeSnapshotInventory + + VolumeInventory incVol2 = createDataVolumeFromVolumeSnapshot { + volumeSnapshotUuid = sp2.uuid + name = "incVol2" + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + } + + deleteFailed = true + deleteSucVol = [incVol2.installPath] + backingChain = [sp.primaryStorageInstallPath] + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + deleteDataVolume { + uuid = incVol.uuid + } + expungeDataVolume { + uuid = incVol.uuid + } + deleteDataVolume { + uuid = incVol2.uuid + } + expungeDataVolume { + uuid = incVol2.uuid + } + + retryInSecs { + spGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeChainGC.class.name}".toString()] + } as List + assert spGC.size() == 1 + assert spGC[0].status != GCStatus.Done.toString() + assert spGC[0].context.contains(sp2.primaryStorageInstallPath) + assert spGC[0].context.contains(sp.primaryStorageInstallPath) + } + + deleteFailed = false + callGc = true + undeletedInstallPaths = [sp2.primaryStorageInstallPath, sp.primaryStorageInstallPath] + triggerGCJob { + uuid = spGC[0].uuid + } + triggerGCJob { + uuid = spGC[0].uuid + } + + assert !retryInSecs(2) { + def jobs = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeChainGC.class.name}".toString()] + } as List + // no duplicate gc + return jobs.size() != 1 || jobs[0].uuid != spGC[0].uuid || jobs[0].context != spGC[0].context + } + + env.cleanSimulatorAndMessageHandlers() + + SQL.New(GarbageCollectorVO.class).in(GarbageCollectorVO_.uuid, [spGC[0].uuid]).hardDelete() + vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + + sp = createVolumeSnapshot { + name = "test-gc" + volumeUuid = vol.uuid + } as VolumeSnapshotInventory + + incVol = createDataVolumeFromVolumeSnapshot { + volumeSnapshotUuid = sp.uuid + name = "incVol" + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + } + + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + deleteDataVolume { + uuid = incVol.uuid + } + expungeDataVolume { + uuid = incVol.uuid + } + + assert !retryInSecs(2) { + spGC = queryGCJob { + conditions = ["runnerClass=${CephDeleteVolumeChainGC.class.name}".toString(), "context~=%${sp.primaryStorageInstallPath}%".toString()] + } as List + return spGC.size() > 0 + } + } + + void testGCDoneAndCancelAfterTriggerGC() { + env.cleanSimulatorAndMessageHandlers() + def deleteFail = true + def callDelete = 0 + env.hijackSimulator(CephPrimaryStorageBase.DELETE_PATH) { rsp, HttpEntity e -> + callDelete ++ + if (deleteFail) { + throw new CloudRuntimeException("on purpose") + } + return rsp + } + + VolumeInventory vol = createDataVolume { + name = "data" + diskOfferingUuid = diskOffering.uuid + primaryStorageUuid = ceph.uuid + } + deleteDataVolume { + uuid = vol.uuid + } + expungeDataVolume { + uuid = vol.uuid + } + + def job + retryInSecs { + def jobs = queryGCJob { + conditions = ["context~=%${vol.getUuid()}%".toString()] + } as List + assert jobs.size() == 1 + job = jobs.get(0) + assert jobs.get(0).status != GCStatus.Done.toString() + assert callDelete == 1 + } + deleteFail = false + triggerGCJob { + uuid = job.uuid + } + retryInSecs { + def jobs = queryGCJob { + conditions = ["context~=%${vol.getUuid()}%".toString()] + } as List + assert jobs.size() == 1 + assert jobs.get(0).status == GCStatus.Done.toString() + assert callDelete == 2 + } + + assert !retryInSecs(3) { + def jobs = queryGCJob { + conditions = ["context~=%${vol.getUuid()}%".toString()] + } as List + return jobs.size() != 1 || jobs.get(0).status != GCStatus.Done.toString() || callDelete != 2 + } + + } + void prepareEnv() { env.preSimulator(CephPrimaryStorageBase.DELETE_PATH) { if (deleteFail) { @@ -153,10 +416,14 @@ class CephGCCase extends SubCase { ceph = (env.specByName("ceph-pri") as PrimaryStorageSpec).inventory diskOffering = (env.specByName("diskOffering") as DiskOfferingSpec).inventory + CephGlobalConfig.GC_INTERVAL.updateValue(TimeUnit.SECONDS.toSeconds(2)) + testGCDoneAndCancelAfterTriggerGC() + // set a very long time so the GC won't run, we use API to trigger it CephGlobalConfig.GC_INTERVAL.updateValue(TimeUnit.DAYS.toSeconds(1)) VolumeGlobalConfig.VOLUME_DELETION_POLICY.updateValue(VolumeDeletionPolicyManager.VolumeDeletionPolicy.Direct.toString()) + testVolumeSnapshotGC() prepareEnv() testVolumeGCSuccess() testVolumeGCCancelledAfterPrimaryStorageDeleted() diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy index 821ff43ac15..fc8503e27f9 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/ceph/CephVolumeSnapshotCase.groovy @@ -108,7 +108,7 @@ class CephVolumeSnapshotCase extends SubCase { name = "root-snapshot" } as VolumeSnapshotInventory - assert rootSnapshot.primaryStorageInstallPath.startsWith("ceph://pri-c-") + assert rootSnapshot.primaryStorageInstallPath.startsWith("ceph://pri-v-r-") assert rootSnapshot.primaryStorageInstallPath.endsWith("/${root.uuid}@${rootSnapshot.uuid}") assert rootSnapshot.parentUuid == null assert rootSnapshot.status == VolumeSnapshotStatus.Ready.toString() diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy index 13a1e0db080..0bc9ae2c229 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/local/CleanImageCacheOnLocalPrimaryStorageCase.groovy @@ -12,6 +12,7 @@ import org.zstack.header.vm.VmInstanceDeletionPolicyManager import org.zstack.network.securitygroup.SecurityGroupConstant import org.zstack.network.service.virtualrouter.VirtualRouterConstant import org.zstack.sdk.ApplianceVmInventory +import org.zstack.sdk.HostInventory import org.zstack.sdk.ImageInventory import org.zstack.sdk.PrimaryStorageInventory import org.zstack.sdk.VmInstanceInventory @@ -90,6 +91,11 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ availableCapacity = SizeUnit.GIGABYTE.toByte(100) } + nfsPrimaryStorage { + name = "nfs" + url = "localhost:/test" + } + cluster { name = "cluster" hypervisorType = "KVM" @@ -101,7 +107,15 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ password = "password" } + kvm { + name = "kvm2" + managementIp = "127.0.0.2" + username = "root" + password = "password" + } + attachPrimaryStorage("local-ps") + attachPrimaryStorage("nfs") attachL2Network("l2") } @@ -157,6 +171,7 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ vm { name = "vm" useInstanceOffering("instanceOffering") + usePrimaryStorage("local-ps") useCluster("cluster") useImage("image1") useL3Networks("l3") @@ -164,6 +179,27 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ useHost("kvm") } + vm { + name = "vm2" + useInstanceOffering("instanceOffering") + usePrimaryStorage("nfs") + useCluster("cluster") + useImage("image1") + useL3Networks("l3") + useRootDiskOffering("diskOffering") + useHost("kvm") + } + + vm { + name = "vm3" + useInstanceOffering("instanceOffering") + usePrimaryStorage("local-ps") + useCluster("cluster") + useImage("image1") + useL3Networks("l3") + useRootDiskOffering("diskOffering") + useHost("kvm2") + } } } @@ -178,9 +214,16 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ PrimaryStorageInventory localps = env.inventoryByName("local-ps") ImageInventory image1 = env.inventoryByName("image1") ImageInventory vrImage = env.inventoryByName("vr") + HostInventory host1 = env.inventoryByName("kvm") as HostInventory + HostInventory host2 = env.inventoryByName("kvm2") as HostInventory - ImageCacheVO c = Q.New(ImageCacheVO.class).eq(ImageCacheVO_.imageUuid,image1.getUuid()).find() - assert c != null + assert Q.New(ImageCacheVO.class) + .eq(ImageCacheVO_.primaryStorageUuid, localps.uuid) + .eq(ImageCacheVO_.imageUuid,image1.getUuid()).count() == 2L + ImageCacheVO c = Q.New(ImageCacheVO.class) + .eq(ImageCacheVO_.primaryStorageUuid, localps.uuid) + .like(ImageCacheVO_.installUrl, String.format("%%%s%%", host1.uuid)) + .eq(ImageCacheVO_.imageUuid,image1.getUuid()).find() def checked = false def cmdTemp @@ -207,14 +250,35 @@ class CleanImageCacheOnLocalPrimaryStorageCase extends SubCase{ PrimaryStorageGlobalConfig.IMAGE_CACHE_GARBAGE_COLLECTOR_INTERVAL.updateValue(1) retryInSecs { - assert Q.New(ImageCacheShadowVO.class).eq(ImageCacheShadowVO_.imageUuid, image1.getUuid()).find() == null - assert Q.New(ImageCacheVO.class).eq(ImageCacheVO_.imageUuid, image1.getUuid()).find() == null + assert Q.New(ImageCacheShadowVO.class) + .eq(ImageCacheShadowVO_.primaryStorageUuid, localps.uuid) + .eq(ImageCacheShadowVO_.imageUuid, image1.getUuid()).find() == null + assert Q.New(ImageCacheVO.class).select(ImageCacheVO_.installUrl) + .eq(ImageCacheVO_.primaryStorageUuid, localps.uuid) + .eq(ImageCacheVO_.imageUuid, image1.getUuid()).findValue().contains(host2.uuid) } ApplianceVmInventory vr = queryApplianceVm {}[0] as ApplianceVmInventory destroyVmInstance { uuid = vr.uuid } + + sleep(TimeUnit.SECONDS.toMillis(1)) + + assert !Q.New(ImageCacheShadowVO.class) + .eq(ImageCacheShadowVO_.imageUuid, vrImage.getUuid()) + .isExists() + assert Q.New(ImageCacheVO.class) + .eq(ImageCacheVO_.imageUuid, vrImage.getUuid()) + .isExists() + + deleteImage { + uuid = vrImage.uuid + } + expungeImage { + imageUuid = vrImage.uuid + } + retryInSecs { assert !Q.New(ImageCacheShadowVO.class) .eq(ImageCacheShadowVO_.imageUuid, vrImage.getUuid()) diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy index bd4746aee79..113d78caa8a 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/primary/nfs/imagecleaner/imagecache/CleanImageCacheOnPrimaryStorageCase.groovy @@ -3,28 +3,28 @@ package org.zstack.test.integration.storage.primary.nfs.imagecleaner.imagecache import org.springframework.http.HttpEntity import org.zstack.compute.vm.VmGlobalConfig import org.zstack.core.db.DatabaseFacade +import org.zstack.core.db.Q import org.zstack.core.db.SimpleQuery import org.zstack.header.image.ImageDeletionPolicyManager import org.zstack.header.network.service.NetworkServiceType import org.zstack.header.storage.primary.ImageCacheVO import org.zstack.header.storage.primary.ImageCacheVO_ +import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeVO +import org.zstack.header.storage.snapshot.reference.VolumeSnapshotReferenceTreeVO_ import org.zstack.header.vm.VmInstanceDeletionPolicyManager import org.zstack.image.ImageGlobalConfig import org.zstack.network.securitygroup.SecurityGroupConstant import org.zstack.network.service.virtualrouter.VirtualRouterConstant -import org.zstack.sdk.ImageInventory -import org.zstack.sdk.PrimaryStorageInventory -import org.zstack.sdk.VmInstanceInventory +import org.zstack.sdk.* import org.zstack.storage.primary.nfs.NfsPrimaryStorageKVMBackend import org.zstack.storage.primary.nfs.NfsPrimaryStorageKVMBackendCommands +import org.zstack.storage.volume.VolumeSystemTags import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec import org.zstack.testlib.SubCase import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil import org.zstack.utils.path.PathUtil -import java.util.concurrent.TimeUnit - /** * 1. two NFS storage running two VMs with the same image * 2. delete the image and two VMs @@ -207,7 +207,31 @@ class CleanImageCacheOnPrimaryStorageCase extends SubCase{ } } + void fastCloneVmBeforeDeletingImageCache() { + def volume = createDataVolume { + name = "test fast clone" + diskOfferingUuid = env.inventoryByName("diskOffering").uuid + primaryStorageUuid = env.inventoryByName("nfs").uuid + } as VolumeInventory + + def sp = createVolumeSnapshot { + name = "sp" + volumeUuid = volume.uuid + } as VolumeSnapshotInventory + + createDataVolumeFromVolumeSnapshot { + name = "data-vol-from-sp" + volumeSnapshotUuid = sp.uuid + systemTags = [VolumeSystemTags.FAST_CREATE.tagFormat] + primaryStorageUuid = env.inventoryByName("nfs").uuid + } + + assert Q.New(VolumeSnapshotReferenceTreeVO.class).isNull(VolumeSnapshotReferenceTreeVO_.rootImageUuid).isExists() + } + void testDelete(){ + fastCloneVmBeforeDeletingImageCache() + dbf = bean(DatabaseFacade.class) PrimaryStorageInventory nfs = env.inventoryByName("nfs") @@ -264,6 +288,7 @@ class CleanImageCacheOnPrimaryStorageCase extends SubCase{ c = q.find() assert null != c + q = dbf.createQuery(ImageCacheVO.class) q.add(ImageCacheVO_.imageUuid, SimpleQuery.Op.EQ, image1.getUuid()) q.add(ImageCacheVO_.primaryStorageUuid, SimpleQuery.Op.EQ, nfs.getUuid()) c = q.find() diff --git a/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy b/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy index 95c2a6a8ea9..358ea427092 100644 --- a/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/storage/snapshot/RevertVolumeFromSnapshotCase.groovy @@ -1,5 +1,6 @@ package org.zstack.test.integration.storage.snapshot +import org.springframework.http.HttpEntity import org.zstack.core.db.Q import org.zstack.core.trash.StorageTrash import org.zstack.core.trash.TrashType @@ -10,12 +11,16 @@ import org.zstack.header.storage.snapshot.VolumeSnapshotVO_ import org.zstack.sdk.VmInstanceInventory import org.zstack.sdk.VolumeInventory import org.zstack.sdk.VolumeSnapshotInventory +import org.zstack.storage.primary.local.LocalStorageKvmBackend import org.zstack.storage.primary.local.LocalStorageResourceRefVO import org.zstack.storage.primary.local.LocalStorageResourceRefVO_ import org.zstack.test.integration.ldap.Env import org.zstack.test.integration.storage.StorageTest import org.zstack.testlib.EnvSpec +import org.zstack.testlib.HttpError import org.zstack.testlib.SubCase +import org.zstack.utils.gson.JSONObjectUtil + /** * Created by ads6 on 2018/1/2. */ @@ -71,6 +76,14 @@ STEP: def installPath = root.installPath def size = root.size + env.preSimulator(LocalStorageKvmBackend.REVERT_SNAPSHOT_PATH) { HttpEntity e -> + expectError { + startVmInstance { + uuid = vm.uuid + } + } + } + revertVolumeFromSnapshot { uuid = s1.uuid } diff --git a/test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java b/test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java new file mode 100644 index 00000000000..928898ef4f9 --- /dev/null +++ b/test/src/test/java/org/zstack/test/aop/TestAsyncBackup11.java @@ -0,0 +1,73 @@ +package org.zstack.test.aop; + +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.ComponentLoader; +import org.zstack.core.thread.CancelablePeriodicTask; +import org.zstack.core.thread.ThreadFacade; +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.test.BeanConstructor; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +/** + */ +public class TestAsyncBackup11 { + CLogger logger = Utils.getLogger(TestAsyncBackup11.class); + boolean success; + ComponentLoader loader; + ThreadFacade thdf; + CloudBus bus; + + @Before + public void setUp() throws Exception { + BeanConstructor con = new BeanConstructor(); + loader = con.build(); + thdf = loader.getComponent(ThreadFacade.class); + bus = loader.getComponent(CloudBus.class); + } + + @Test + public void test() throws InterruptedException { + Completion comp = new Completion(null) { + @Override + public void success() { + } + + @Override + public void fail(ErrorCode errorCode) { + success = true; + } + }; + Future task = thdf.submitCancelablePeriodicTask(new CancelablePeriodicTask(comp) { + @Override + public boolean run() { + throw new RuntimeException("on purpose"); + } + + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.SECONDS; + } + + @Override + public long getInterval() { + return 3; + } + + @Override + public String getName() { + return "test"; + } + }); + + TimeUnit.SECONDS.sleep(1); + Assert.assertTrue(success); + Assert.assertTrue(task.isCancelled()); + } +} diff --git a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java index df65035ad90..4d141698052 100755 --- a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java +++ b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm.java @@ -8,11 +8,8 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.InstanceOfferingInventory; import org.zstack.header.host.HostInventory; -import org.zstack.header.identity.StatementEffect; -import org.zstack.header.identity.IdentityErrors; -import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.SessionInventory; -import org.zstack.header.identity.UserInventory; +import org.zstack.header.identity.*; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.image.ImageInventory; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.header.query.QueryCondition; @@ -83,7 +80,7 @@ public void test() throws ApiSenderException, InterruptedException { UserInventory user = identityCreator.createUser("user", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIDestroyVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIRebootVmInstanceMsg.class.getSimpleName())); @@ -113,7 +110,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIDestroyVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIRebootVmInstanceMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIStopVmInstanceMsg.class.getSimpleName())); @@ -124,7 +121,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("allowcreate"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); identityCreator.createPolicy("allowcreate", s); identityCreator.attachPolicyToUser("user", "allowcreate"); @@ -175,7 +172,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("denycreate"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); identityCreator.createPolicy("denycreate", s); identityCreator.attachPolicyToUser("user", "denycreate"); @@ -195,7 +192,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("allowall"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:.*", VmInstanceConstant.ACTION_CATEGORY)); identityCreator.createPolicy("allowall", s); identityCreator.attachPolicyToUser("user", "allowall"); diff --git a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java index 66982b92161..3ab67d53769 100755 --- a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java +++ b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm1.java @@ -8,7 +8,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.InstanceOfferingInventory; import org.zstack.header.host.HostInventory; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -62,7 +62,7 @@ public void test() throws ApiSenderException, InterruptedException { UserInventory user = identityCreator.createUser("user", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getSimpleName())); identityCreator.createPolicy("allow", s); identityCreator.attachPolicyToUser("user", "allow"); diff --git a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java index 2367ecc9813..8c6ed59c321 100755 --- a/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java +++ b/test/src/test/java/org/zstack/test/compute/vm/TestPolicyForVm6.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; import org.zstack.header.identity.UserInventory; @@ -51,7 +51,7 @@ public void test() throws ApiSenderException, InterruptedException { PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APICreateVmInstanceMsg.class.getName())); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIDestroyVmInstanceMsg.class.getName())); identityCreator.createPolicy("allow", s); @@ -59,7 +59,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIRebootVmInstanceMsg.class.getName())); identityCreator.createPolicy("deny", s); identityCreator.attachPolicyToUser("user", "deny"); @@ -68,37 +68,37 @@ public void test() throws ApiSenderException, InterruptedException { APIRebootVmInstanceMsg.class.getName(), APIStartVmInstanceMsg.class.getName()); Map ret = api.checkUserPolicy(apiNames, user.getUuid(), null); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); SessionInventory session = identityCreator.userLogin(user.getName(), "password"); ret = api.checkUserPolicy(apiNames, null, session); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); identityCreator.createGroup("group"); identityCreator.addUserToGroup("user", "group"); s = new PolicyStatement(); s.setName("group-allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VmInstanceConstant.ACTION_CATEGORY, APIStartVmInstanceMsg.class.getName())); identityCreator.createPolicy("group-allow", s); identityCreator.attachPolicyToGroup("group", "group-allow"); ret = api.checkUserPolicy(apiNames, null, session); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); // user can test own permissions ret = api.checkUserPolicy(apiNames, user.getUuid(), session); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); - Assert.assertEquals(StatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APICreateVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIDestroyVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Deny.toString(), ret.get(APIRebootVmInstanceMsg.class.getName())); + Assert.assertEquals(PolicyStatementEffect.Allow.toString(), ret.get(APIStartVmInstanceMsg.class.getName())); } } diff --git a/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java b/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java index 4e1a3c07f0f..8f357220a61 100755 --- a/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java +++ b/test/src/test/java/org/zstack/test/configuration/TestPolicyForConfiguration.java @@ -6,7 +6,7 @@ import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.*; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -85,7 +85,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APICreateInstanceOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIChangeInstanceOfferingStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIUpdateInstanceOfferingMsg.class.getSimpleName())); @@ -116,7 +116,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APICreateInstanceOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIChangeInstanceOfferingStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIUpdateInstanceOfferingMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java b/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java index c9782e06a07..e06282a87f4 100755 --- a/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java +++ b/test/src/test/java/org/zstack/test/eip/TestPolicyForEip.java @@ -7,7 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -98,13 +98,13 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allowvip"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); identityCreator.createPolicy("allowvip", s); s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APICreateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIUpdateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIChangeEipStateMsg.class.getSimpleName())); @@ -126,7 +126,7 @@ public void test() throws ApiSenderException { eip = createEip(l3.getUuid(), nic.getUuid(), session); s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APICreateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIUpdateEipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", EipConstant.ACTION_CATEGORY, APIChangeEipStateMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity5.java b/test/src/test/java/org/zstack/test/identity/TestIdentity5.java index 635e0fb9da5..a0a2f645d35 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity5.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity5.java @@ -8,7 +8,7 @@ import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.identity.*; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyStatement; import org.zstack.test.*; import org.zstack.test.deployer.Deployer; @@ -39,7 +39,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); PolicyInventory p = creator.createPolicy("test", s); creator.attachPolicyToUser("test", "test"); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity7.java b/test/src/test/java/org/zstack/test/identity/TestIdentity7.java index 808748e51e1..0b14f65c645 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity7.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity7.java @@ -8,7 +8,7 @@ import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.header.identity.*; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.query.QueryOp; import org.zstack.test.*; @@ -64,7 +64,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); PolicyInventory p = creator.createPolicy("test", s); creator.attachPolicyToUser("test", "test"); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity8.java b/test/src/test/java/org/zstack/test/identity/TestIdentity8.java index 30a9b50160e..42d83fc8923 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity8.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity8.java @@ -7,7 +7,7 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.*; import org.zstack.header.identity.PolicyStatement; import org.zstack.test.*; @@ -43,7 +43,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); s.setName("test"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); creator.createPolicy("test", s); api.deleteAccount(a.getUuid(), creator.getAccountSession()); diff --git a/test/src/test/java/org/zstack/test/identity/TestIdentity9.java b/test/src/test/java/org/zstack/test/identity/TestIdentity9.java index 5c19b1213d9..1c85179f097 100755 --- a/test/src/test/java/org/zstack/test/identity/TestIdentity9.java +++ b/test/src/test/java/org/zstack/test/identity/TestIdentity9.java @@ -7,12 +7,8 @@ import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; -import org.zstack.header.identity.StatementEffect; -import org.zstack.header.identity.PolicyInventory; -import org.zstack.header.identity.PolicyStatement; -import org.zstack.header.identity.UserInventory; -import org.zstack.header.identity.UserPolicyRefVO; -import org.zstack.header.identity.UserPolicyRefVO_; +import org.zstack.header.identity.*; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.test.*; import org.zstack.test.deployer.Deployer; @@ -50,7 +46,7 @@ public void test() throws ApiSenderException { for (int i = 0; i < num; i++) { PolicyStatement s = new PolicyStatement(); s.addAction(".*"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); PolicyInventory p = creator.createPolicy(String.format("test%s", i), s); policyUuids.add(p.getUuid()); } diff --git a/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java b/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java index c77792a5144..2cdb4a88fd5 100755 --- a/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java +++ b/test/src/test/java/org/zstack/test/image/TestPolicyForImage.java @@ -6,7 +6,7 @@ import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -89,7 +89,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIAddImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIUpdateImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIChangeImageStateMsg.class.getSimpleName())); @@ -106,7 +106,7 @@ public void test() throws ApiSenderException { identityCreator.detachPolicyFromUser("user1", "allow"); s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIAddImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIUpdateImageMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ImageConstant.ACTION_CATEGORY, APIChangeImageStateMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java b/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java index baec975a915..9538a82b858 100755 --- a/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java +++ b/test/src/test/java/org/zstack/test/lb/TestVirtualRouterLbPolicy.java @@ -7,7 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.*; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.network.l3.L3NetworkInventory; @@ -92,7 +92,7 @@ public Quota.QuotaUsage call(Quota.QuotaUsage arg) { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerListenerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APIAddVmNicToLoadBalancerMsg.class.getSimpleName())); @@ -124,7 +124,7 @@ public Quota.QuotaUsage call(Quota.QuotaUsage arg) { listener.setLoadBalancerUuid(lb.getUuid()); listener = api.createLoadBalancerListener(listener, userSession); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APICreateLoadBalancerListenerMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", LoadBalancerConstants.ACTION_CATEGORY, APIAddVmNicToLoadBalancerMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java b/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java index d650e559bd2..1add7d93e49 100755 --- a/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java +++ b/test/src/test/java/org/zstack/test/network/TestPolicyForL3Network.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -68,7 +68,7 @@ public void test() throws ApiSenderException, InterruptedException { PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APICreateL3NetworkMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIChangeL3NetworkStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIUpdateL3NetworkMsg.class.getSimpleName())); @@ -102,7 +102,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APICreateL3NetworkMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIChangeL3NetworkStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", L3NetworkConstant.ACTION_CATEGORY, APIUpdateL3NetworkMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java b/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java index 5afcedddace..f7de68b6fce 100755 --- a/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java +++ b/test/src/test/java/org/zstack/test/securitygroup/TestPolicyForSecurityGroup.java @@ -5,7 +5,7 @@ import org.junit.Test; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -57,7 +57,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APICreateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIUpdateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIChangeSecurityGroupStateMsg.class.getSimpleName())); @@ -91,7 +91,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APICreateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIUpdateSecurityGroupMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", SecurityGroupConstant.ACTION_CATEGORY, APIChangeSecurityGroupStateMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java b/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java index dfb834d88e4..f8d4938d22a 100755 --- a/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java +++ b/test/src/test/java/org/zstack/test/storage/snapshot/TestPolicyForSnapshot.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -83,7 +83,7 @@ public void test() throws ApiSenderException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APICreateVolumeSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIRevertVolumeFromSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIDeleteVolumeSnapshotMsg.class.getSimpleName())); @@ -114,7 +114,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APICreateVolumeSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIRevertVolumeFromSnapshotMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeSnapshotConstant.ACTION_CATEGORY, APIDeleteVolumeSnapshotMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java b/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java index c32c621f24e..377b474b423 100755 --- a/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java +++ b/test/src/test/java/org/zstack/test/storage/volume/TestPolicyForVolume.java @@ -7,7 +7,7 @@ import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.configuration.DiskOfferingInventory; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -84,7 +84,7 @@ public void test() throws ApiSenderException, InterruptedException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APICreateDataVolumeMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIChangeVolumeStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIDeleteDataVolumeMsg.class.getSimpleName())); @@ -114,7 +114,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APICreateDataVolumeMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIChangeVolumeStateMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VolumeConstant.ACTION_CATEGORY, APIDeleteDataVolumeMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java b/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java index 9ad5b9b6f1f..421a055387b 100755 --- a/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java +++ b/test/src/test/java/org/zstack/test/tag/TestPolicyForTag.java @@ -7,7 +7,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -56,7 +56,7 @@ public void test() throws ApiSenderException { PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateUserTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateSystemTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APIDeleteTagMsg.class.getSimpleName())); @@ -71,7 +71,7 @@ public void test() throws ApiSenderException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateUserTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APICreateSystemTagMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", TagConstant.ACTION_CATEGORY, APIDeleteTagMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/utils/TestRangeSet.java b/test/src/test/java/org/zstack/test/utils/TestRangeSet.java index 2821575640f..4d2c2057938 100755 --- a/test/src/test/java/org/zstack/test/utils/TestRangeSet.java +++ b/test/src/test/java/org/zstack/test/utils/TestRangeSet.java @@ -5,7 +5,9 @@ import org.zstack.utils.RangeSet; import org.zstack.utils.RangeSet.Range; -import java.util.List; +import java.util.*; + +import static org.junit.Assert.*; /** */ @@ -49,4 +51,176 @@ public void test() { r1 = ret.get(0); Assert.assertTrue(r1.is(1, 20)); } + + @Test + public void testValueOfCollection() { + // Test empty collection + Collection emptyCollection = new ArrayList<>(); + RangeSet emptyRangeSet = RangeSet.valueOf(emptyCollection); + assertTrue(emptyRangeSet.getRanges().isEmpty()); + + // Test single element + Collection singleElement = Collections.singletonList(5L); + RangeSet singleRangeSet = RangeSet.valueOf(singleElement); + assertEquals(1, singleRangeSet.getRanges().size()); + assertTrue(singleRangeSet.getRanges().get(0).is(5, 5)); + + // Test continuous elements + Collection continuousElements = Arrays.asList(1L, 2L, 3L, 4L, 5L); + RangeSet continuousRangeSet = RangeSet.valueOf(continuousElements); + assertEquals(1, continuousRangeSet.getRanges().size()); + assertTrue(continuousRangeSet.getRanges().get(0).is(1, 5)); + + // Test discontinuous elements + Collection discontinuousElements = Arrays.asList(1L, 2L, 4L, 5L, 8L); + RangeSet discontinuousRangeSet = RangeSet.valueOf(discontinuousElements); + assertEquals(3, discontinuousRangeSet.getRanges().size()); + assertTrue(discontinuousRangeSet.getRanges().get(0).is(1, 2)); + assertTrue(discontinuousRangeSet.getRanges().get(1).is(4, 5)); + assertTrue(discontinuousRangeSet.getRanges().get(2).is(8, 8)); + + // Test duplicate elements + Collection duplicateElements = Arrays.asList(1L, 1L, 2L, 3L, 3L, 5L); + RangeSet duplicateRangeSet = RangeSet.valueOf(duplicateElements); + assertEquals(2, duplicateRangeSet.getRanges().size()); + assertTrue(duplicateRangeSet.getRanges().get(0).is(1, 3)); + assertTrue(duplicateRangeSet.getRanges().get(1).is(5, 5)); + + // Test unsorted elements + Collection unsortedElements = Arrays.asList(5L, 3L, 1L, 2L, 4L); + RangeSet unsortedRangeSet = RangeSet.valueOf(unsortedElements); + assertEquals(1, unsortedRangeSet.getRanges().size()); + assertTrue(unsortedRangeSet.getRanges().get(0).is(1, 5)); + } + + @Test + public void testValueOfString() { + // Test empty string + RangeSet emptyRangeSet = RangeSet.valueOf(""); + assertTrue(emptyRangeSet.getRanges().isEmpty()); + + // Test single number + RangeSet singleNumRangeSet = RangeSet.valueOf("5"); + assertEquals(1, singleNumRangeSet.getRanges().size()); + assertTrue(singleNumRangeSet.getRanges().get(0).is(5, 5)); + + // Test single range + RangeSet singleRangeRangeSet = RangeSet.valueOf("1-5"); + assertEquals(1, singleRangeRangeSet.getRanges().size()); + assertTrue(singleRangeRangeSet.getRanges().get(0).is(1, 5)); + + // Test multiple ranges + RangeSet multiRangeRangeSet = RangeSet.valueOf("1-3,5-7,9"); + assertEquals(3, multiRangeRangeSet.getRanges().size()); + assertTrue(multiRangeRangeSet.getRanges().get(0).is(1, 3)); + assertTrue(multiRangeRangeSet.getRanges().get(1).is(5, 7)); + assertTrue(multiRangeRangeSet.getRanges().get(2).is(9, 9)); + } + + @Test + public void testMerge() { + // Test empty range set + RangeSet emptyRangeSet = new RangeSet(); + List emptyResult = emptyRangeSet.merge(); + assertTrue(emptyResult.isEmpty()); + + // Test single range + RangeSet singleRangeSet = new RangeSet().closed(1, 5); + List singleResult = singleRangeSet.merge(); + assertEquals(1, singleResult.size()); + assertTrue(singleResult.get(0).is(1, 5)); + + // Test overlapping ranges + RangeSet overlappingRangeSet = new RangeSet() + .closed(1, 5) + .closed(3, 8); + List overlappingResult = overlappingRangeSet.merge(); + assertEquals(1, overlappingResult.size()); + assertTrue(overlappingResult.get(0).is(1, 8)); + + // Test connected ranges + RangeSet connectedRangeSet = new RangeSet() + .closed(1, 5) + .closed(6, 10); + List connectedResult = connectedRangeSet.merge(); + assertEquals(1, connectedResult.size()); + assertTrue(connectedResult.get(0).is(1, 10)); + + // Test disjoint ranges (no overlap, no connection) + RangeSet disjointRangeSet = new RangeSet() + .closed(1, 5) + .closed(7, 10); + List disjointResult = disjointRangeSet.merge(); + assertEquals(2, disjointResult.size()); + assertTrue(disjointResult.get(0).is(1, 5)); + assertTrue(disjointResult.get(1).is(7, 10)); + + // Test mixed scenario with multiple ranges + RangeSet mixedRangeSet = new RangeSet() + .closed(1, 5) + .closed(4, 8) + .closed(10, 15) + .closed(16, 20) + .closed(25, 30); + List mixedResult = mixedRangeSet.merge(); + assertEquals(3, mixedResult.size()); + assertTrue(mixedResult.get(0).is(1, 8)); + assertTrue(mixedResult.get(1).is(10, 20)); + assertTrue(mixedResult.get(2).is(25, 30)); + } + + @Test + public void testMergeAndSort() { + // Test already ordered ranges + RangeSet orderedRangeSet = new RangeSet() + .closed(1, 5) + .closed(7, 10); + List orderedResult = orderedRangeSet.mergeAndSort(); + assertEquals(2, orderedResult.size()); + assertTrue(orderedResult.get(0).is(1, 5)); + assertTrue(orderedResult.get(1).is(7, 10)); + + // Test unordered ranges + RangeSet unorderedRangeSet = new RangeSet() + .closed(7, 10) + .closed(1, 5); + List unorderedResult = unorderedRangeSet.mergeAndSort(); + assertEquals(2, unorderedResult.size()); + assertTrue(unorderedResult.get(0).is(1, 5)); + assertTrue(unorderedResult.get(1).is(7, 10)); + + // Test ranges requiring both merging and sorting + RangeSet mixedRangeSet = new RangeSet() + .closed(15, 20) + .closed(5, 10) + .closed(8, 16); + List mixedResult = mixedRangeSet.mergeAndSort(); + assertEquals(1, mixedResult.size()); + assertTrue(mixedResult.get(0).is(5, 20)); + } + + @Test + public void testClosed() { + // Test normal case + RangeSet rangeSet = new RangeSet(); + RangeSet result = rangeSet.closed(1, 5); + + // Verify return value is this (for chaining) + assertSame(rangeSet, result); + + // Verify range is correctly added + assertEquals(1, rangeSet.getRanges().size()); + assertTrue(rangeSet.getRanges().get(0).is(1, 5)); + + // Test multiple calls + rangeSet.closed(7, 10); + assertEquals(2, rangeSet.getRanges().size()); + assertTrue(rangeSet.getRanges().get(0).is(1, 5)); + assertTrue(rangeSet.getRanges().get(1).is(7, 10)); + + // Test when start > end + rangeSet.closed(15, 12); + assertEquals(3, rangeSet.getRanges().size()); + assertTrue(rangeSet.getRanges().get(2).is(12, 15)); // Should automatically swap order + } } diff --git a/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java b/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java index 61235c86df4..5bd03da9bf6 100755 --- a/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java +++ b/test/src/test/java/org/zstack/test/vip/TestPolicyForVip.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -84,7 +84,7 @@ public void test() throws ApiSenderException { identityCreator.useAccount("test"); identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.setName("allow"); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APIUpdateVipMsg.class.getSimpleName())); @@ -102,7 +102,7 @@ public void test() throws ApiSenderException { vip = api.acquireIp(pubL3.getUuid(), session); identityCreator.detachPolicyFromUser("user1", "allow"); s = new PolicyStatement(); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.setName("deny"); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APIUpdateVipMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java index 1a15b2abf55..046c3b758b6 100755 --- a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java +++ b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForPortForwarding.java @@ -6,7 +6,7 @@ import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -85,13 +85,13 @@ public void test() throws ApiSenderException { identityCreator.useAccount("test"); identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.setName("allowvip"); s.addAction(String.format("%s:%s", VipConstant.ACTION_CATEGORY, APICreateVipMsg.class.getSimpleName())); identityCreator.createPolicy("allowvip", s); s = new PolicyStatement(); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.setName("allow"); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APICreatePortForwardingRuleMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APIUpdatePortForwardingRuleMsg.class.getSimpleName())); @@ -116,7 +116,7 @@ public void test() throws ApiSenderException { rule = createPortForwarding(vipNw.getUuid(), session); s = new PolicyStatement(); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.setName("deny"); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APICreatePortForwardingRuleMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", PortForwardingConstant.ACTION_CATEGORY, APIUpdatePortForwardingRuleMsg.class.getSimpleName())); diff --git a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java index c4d894de39f..85d6633df5a 100755 --- a/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java +++ b/test/src/test/java/org/zstack/test/virtualrouter/TestPolicyForVirtualRouterOffering.java @@ -9,7 +9,7 @@ import org.zstack.header.configuration.APIDeleteInstanceOfferingMsg; import org.zstack.header.configuration.ConfigurationConstant; import org.zstack.header.configuration.InstanceOfferingInventory; -import org.zstack.header.identity.StatementEffect; +import org.zstack.header.identity.PolicyStatementEffect; import org.zstack.header.identity.IdentityErrors; import org.zstack.header.identity.PolicyStatement; import org.zstack.header.identity.SessionInventory; @@ -74,7 +74,7 @@ public void test() throws ApiSenderException, InterruptedException { identityCreator.createUser("user1", "password"); PolicyStatement s = new PolicyStatement(); s.setName("allow"); - s.setEffect(StatementEffect.Allow); + s.setEffect(PolicyStatementEffect.Allow); s.addAction(String.format("%s:%s", VirtualRouterConstant.ACTION_CATEGORY, APICreateVirtualRouterOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIDeleteInstanceOfferingMsg.class.getSimpleName())); identityCreator.createPolicy("allow", s); @@ -86,7 +86,7 @@ public void test() throws ApiSenderException, InterruptedException { s = new PolicyStatement(); s.setName("deny"); - s.setEffect(StatementEffect.Deny); + s.setEffect(PolicyStatementEffect.Deny); s.addAction(String.format("%s:%s", VirtualRouterConstant.ACTION_CATEGORY, APICreateVirtualRouterOfferingMsg.class.getSimpleName())); s.addAction(String.format("%s:%s", ConfigurationConstant.ACTION_CATEGORY, APIDeleteInstanceOfferingMsg.class.getSimpleName())); identityCreator.createPolicy("deny", s); diff --git a/test/src/test/resources/globalConfig/kvm.xml b/test/src/test/resources/globalConfig/kvm.xml index 5e20aefbe0f..6fb42631828 100755 --- a/test/src/test/resources/globalConfig/kvm.xml +++ b/test/src/test/resources/globalConfig/kvm.xml @@ -256,4 +256,20 @@ 3600 java.lang.Integer + + + kvm + kvmagent.physicalmemory.usage.alarm.threshold + The threshold for the physical memory usage of the kvmagent process, exceeding which an alarm will be triggered. + 2147483648 + java.lang.Long + + + + kvm + kvmagent.physicalmemory.usage.hardlimit + The hard limit for the physical memory usage of the kvmagent process, exceeding this value will trigger a kvmagent restart. + 10737418240 + java.lang.Long + diff --git a/test/src/test/resources/log4j2.xml b/test/src/test/resources/log4j2.xml index 7b750838e8c..d888a0027e4 100755 --- a/test/src/test/resources/log4j2.xml +++ b/test/src/test/resources/log4j2.xml @@ -120,7 +120,9 @@ - + + + @@ -160,6 +162,10 @@ + + + + @@ -175,6 +181,10 @@ + + + + diff --git a/test/src/test/resources/springConfigXml/Kvm.xml b/test/src/test/resources/springConfigXml/Kvm.xml index 81e6039b85d..b5c509ebad7 100755 --- a/test/src/test/resources/springConfigXml/Kvm.xml +++ b/test/src/test/resources/springConfigXml/Kvm.xml @@ -242,6 +242,13 @@ + + + + + + + diff --git a/test/src/test/resources/unitTestSuiteXml/Core.xml b/test/src/test/resources/unitTestSuiteXml/Core.xml index 5f111b95a32..5e17ac243f0 100755 --- a/test/src/test/resources/unitTestSuiteXml/Core.xml +++ b/test/src/test/resources/unitTestSuiteXml/Core.xml @@ -122,6 +122,7 @@ + diff --git a/test/src/test/resources/zstack.properties b/test/src/test/resources/zstack.properties index 8bbdc48707a..b8ee3650b69 100755 --- a/test/src/test/resources/zstack.properties +++ b/test/src/test/resources/zstack.properties @@ -40,6 +40,8 @@ httpConsoleProxyPort = 8989 AppBuildSystem.agentPort=8989 +Zdfs.agentPort=8989 + ApiMediator.apiWorkerNum=50 unitTestOn=true diff --git a/testlib/pom.xml b/testlib/pom.xml index 582f1457b94..2c8e374fce4 100644 --- a/testlib/pom.xml +++ b/testlib/pom.xml @@ -5,7 +5,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 4.0.0 diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f04007cdbd8..34cf02a9ff5 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -1178,6 +1178,33 @@ abstract class ApiHelper { } + def addContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.AddContainerManagementEndpointAction() + 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 addDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddDataCenterFromRemoteAction.class) Closure c) { def a = new org.zstack.sdk.AddDataCenterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -1907,6 +1934,33 @@ abstract class ApiHelper { } + def addLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.AddLogServerAction() + 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 addMdevDeviceSpecToVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddMdevDeviceSpecToVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.AddMdevDeviceSpecToVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -1961,6 +2015,87 @@ abstract class ApiHelper { } + def addModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddModelAction.class) Closure c) { + def a = new org.zstack.sdk.AddModelAction() + 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 addModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.AddModelCenterAction() + 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 addModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.AddModelServiceAction() + 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 addMonToCephBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddMonToCephBackupStorageAction.class) Closure c) { def a = new org.zstack.sdk.AddMonToCephBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -2150,6 +2285,33 @@ abstract class ApiHelper { } + def addProxyToResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddProxyToResourceAction.class) Closure c) { + def a = new org.zstack.sdk.AddProxyToResourceAction() + 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 addRemoteCidrsToIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddRemoteCidrsToIPsecConnectionAction.class) Closure c) { def a = new org.zstack.sdk.AddRemoteCidrsToIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -4202,6 +4364,33 @@ abstract class ApiHelper { } + def attachServiceToObservabilityServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachServiceToObservabilityServerAction.class) Closure c) { + def a = new org.zstack.sdk.AttachServiceToObservabilityServerAction() + 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 attachSshKeyPairToVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachSshKeyPairToVmInstanceAction.class) Closure c) { def a = new org.zstack.sdk.AttachSshKeyPairToVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -4607,6 +4796,33 @@ abstract class ApiHelper { } + def bindModelToService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.BindModelToServiceAction.class) Closure c) { + def a = new org.zstack.sdk.BindModelToServiceAction() + 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 bootstrapMiniHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.BootstrapMiniHostAction.class) Closure c) { def a = new org.zstack.sdk.BootstrapMiniHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -5903,6 +6119,33 @@ abstract class ApiHelper { } + def changeSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeSdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.ChangeSdnControllerAction() + 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 changeSecretResourcePoolState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeSecretResourcePoolStateAction.class) Closure c) { def a = new org.zstack.sdk.ChangeSecretResourcePoolStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -7226,8 +7469,8 @@ abstract class ApiHelper { } - def cloneVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.CloneVmInstanceAction() + def cloneImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneImageAction.class) Closure c) { + def a = new org.zstack.sdk.CloneImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7253,8 +7496,8 @@ abstract class ApiHelper { } - def convertVmFromForeignHypervisor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ConvertVmFromForeignHypervisorAction.class) Closure c) { - def a = new org.zstack.sdk.ConvertVmFromForeignHypervisorAction() + def cloneModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.CloneModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7280,8 +7523,8 @@ abstract class ApiHelper { } - def createAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAccessControlListAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAccessControlListAction() + def cloneVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CloneVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.CloneVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7307,8 +7550,8 @@ abstract class ApiHelper { } - def createAccessKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAccessKeyAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAccessKeyAction() + def convertVmFromForeignHypervisor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ConvertVmFromForeignHypervisorAction.class) Closure c) { + def a = new org.zstack.sdk.ConvertVmFromForeignHypervisorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7334,8 +7577,8 @@ abstract class ApiHelper { } - def createAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAccountAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAccountAction() + def createAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAccessControlListAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAccessControlListAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7361,8 +7604,8 @@ abstract class ApiHelper { } - def createAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAffinityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAffinityGroupAction() + def createAccessKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAccessKeyAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAccessKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7388,8 +7631,8 @@ abstract class ApiHelper { } - def createAiSiNoSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAiSiNoSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAiSiNoSecretResourcePoolAction() + def createAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAccountAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7415,8 +7658,8 @@ abstract class ApiHelper { } - def createAliyunDiskFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAliyunDiskFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAliyunDiskFromRemoteAction() + def createAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAffinityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAffinityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -7442,8 +7685,62 @@ abstract class ApiHelper { } - def createAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAliyunNasAccessGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateAliyunNasAccessGroupAction() + def createAiSiNoSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAiSiNoSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAiSiNoSecretResourcePoolAction() + 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 createAliyunDiskFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAliyunDiskFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAliyunDiskFromRemoteAction() + 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 createAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateAliyunNasAccessGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateAliyunNasAccessGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -8198,6 +8495,33 @@ abstract class ApiHelper { } + def createCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.CreateCbtTaskAction() + 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 createCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateCdpPolicyAction.class) Closure c) { def a = new org.zstack.sdk.CreateCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -8495,6 +8819,33 @@ abstract class ApiHelper { } + def createDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.CreateDatasetAction() + 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 createDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateDirectoryAction.class) Closure c) { def a = new org.zstack.sdk.CreateDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -9143,8 +9494,8 @@ abstract class ApiHelper { } - def createHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHostSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateHostSchedulingRuleGroupAction() + def createHostNetworkServiceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHostNetworkServiceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.CreateHostNetworkServiceTypeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9170,35 +9521,8 @@ abstract class ApiHelper { } - def createHybridEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHybridEipAction.class) Closure c) { - def a = new org.zstack.sdk.CreateHybridEipAction() - 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 createIAM2VirtualIDFromLdapUid(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateIAM2VirtualIDFromLdapUidAction.class) Closure c) { - def a = new org.zstack.sdk.CreateIAM2VirtualIDFromLdapUidAction() + def createHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHostSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateHostSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9224,8 +9548,8 @@ abstract class ApiHelper { } - def createIAM2VirtualIDLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateIAM2VirtualIDLdapBindingAction.class) Closure c) { - def a = new org.zstack.sdk.CreateIAM2VirtualIDLdapBindingAction() + def createHybridEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateHybridEipAction.class) Closure c) { + def a = new org.zstack.sdk.CreateHybridEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9251,8 +9575,8 @@ abstract class ApiHelper { } - def createIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateIPsecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.CreateIPsecConnectionAction() + def createIAM2VirtualIDFromLdapUid(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateIAM2VirtualIDFromLdapUidAction.class) Closure c) { + def a = new org.zstack.sdk.CreateIAM2VirtualIDFromLdapUidAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9278,8 +9602,8 @@ abstract class ApiHelper { } - def createImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageReplicationGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateImageReplicationGroupAction() + def createIAM2VirtualIDLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateIAM2VirtualIDLdapBindingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateIAM2VirtualIDLdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9305,8 +9629,8 @@ abstract class ApiHelper { } - def createInfoSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateInfoSecSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreateInfoSecSecretResourcePoolAction() + def createIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateIPsecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.CreateIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9332,8 +9656,8 @@ abstract class ApiHelper { } - def createInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateInstanceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.CreateInstanceOfferingAction() + def createImageGroupFromImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromImageAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageGroupFromImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9359,8 +9683,8 @@ abstract class ApiHelper { } - def createJitSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateJitSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreateJitSecretResourcePoolAction() + def createImageGroupFromSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageGroupFromSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9386,8 +9710,8 @@ abstract class ApiHelper { } - def createL2HardwareVxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2HardwareVxlanNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2HardwareVxlanNetworkAction() + def createImageGroupFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageGroupFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageGroupFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9413,8 +9737,8 @@ abstract class ApiHelper { } - def createL2HardwareVxlanNetworkPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2HardwareVxlanNetworkPoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2HardwareVxlanNetworkPoolAction() + def createImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateImageReplicationGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateImageReplicationGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9440,8 +9764,8 @@ abstract class ApiHelper { } - def createL2NoVlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2NoVlanNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2NoVlanNetworkAction() + def createInfoSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateInfoSecSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateInfoSecSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9467,8 +9791,8 @@ abstract class ApiHelper { } - def createL2PortGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2PortGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2PortGroupAction() + def createInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateInstanceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateInstanceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9494,8 +9818,8 @@ abstract class ApiHelper { } - def createL2TfNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2TfNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2TfNetworkAction() + def createJitSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateJitSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateJitSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9521,8 +9845,8 @@ abstract class ApiHelper { } - def createL2VirtualSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VirtualSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2VirtualSwitchAction() + def createKoAlSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateKoAlSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateKoAlSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9548,8 +9872,8 @@ abstract class ApiHelper { } - def createL2VlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VlanNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2VlanNetworkAction() + def createL2HardwareVxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2HardwareVxlanNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2HardwareVxlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9575,8 +9899,8 @@ abstract class ApiHelper { } - def createL2VxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VxlanNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2VxlanNetworkAction() + def createL2HardwareVxlanNetworkPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2HardwareVxlanNetworkPoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2HardwareVxlanNetworkPoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9602,8 +9926,8 @@ abstract class ApiHelper { } - def createL2VxlanNetworkPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VxlanNetworkPoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL2VxlanNetworkPoolAction() + def createL2NoVlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2NoVlanNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2NoVlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9629,8 +9953,8 @@ abstract class ApiHelper { } - def createL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.CreateL3NetworkAction() + def createL2PortGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2PortGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2PortGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9656,8 +9980,8 @@ abstract class ApiHelper { } - def createLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLdapBindingAction.class) Closure c) { - def a = new org.zstack.sdk.CreateLdapBindingAction() + def createL2TfNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2TfNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2TfNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9683,8 +10007,8 @@ abstract class ApiHelper { } - def createLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.CreateLoadBalancerAction() + def createL2VirtualSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VirtualSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2VirtualSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9710,8 +10034,8 @@ abstract class ApiHelper { } - def createLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLoadBalancerListenerAction.class) Closure c) { - def a = new org.zstack.sdk.CreateLoadBalancerListenerAction() + def createL2VlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VlanNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2VlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9737,8 +10061,8 @@ abstract class ApiHelper { } - def createLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLoadBalancerServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateLoadBalancerServerGroupAction() + def createL2VxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VxlanNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2VxlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9764,8 +10088,8 @@ abstract class ApiHelper { } - def createMiniCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateMiniClusterAction.class) Closure c) { - def a = new org.zstack.sdk.CreateMiniClusterAction() + def createL2VxlanNetworkPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL2VxlanNetworkPoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL2VxlanNetworkPoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9791,8 +10115,8 @@ abstract class ApiHelper { } - def createMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateMonitorTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.CreateMonitorTriggerAction() + def createL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.CreateL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9818,8 +10142,8 @@ abstract class ApiHelper { } - def createMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateMulticastRouterAction.class) Closure c) { - def a = new org.zstack.sdk.CreateMulticastRouterAction() + def createLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLdapBindingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateLdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9845,8 +10169,8 @@ abstract class ApiHelper { } - def createOAuthClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOAuthClientAction.class) Closure c) { - def a = new org.zstack.sdk.CreateOAuthClientAction() + def createLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.CreateLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9872,8 +10196,8 @@ abstract class ApiHelper { } - def createOssBackupBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOssBackupBucketRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.CreateOssBackupBucketRemoteAction() + def createLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLoadBalancerListenerAction.class) Closure c) { + def a = new org.zstack.sdk.CreateLoadBalancerListenerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9899,8 +10223,8 @@ abstract class ApiHelper { } - def createOssBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOssBucketRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.CreateOssBucketRemoteAction() + def createLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateLoadBalancerServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateLoadBalancerServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9926,8 +10250,8 @@ abstract class ApiHelper { } - def createPciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePciDeviceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePciDeviceOfferingAction() + def createMiniCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateMiniClusterAction.class) Closure c) { + def a = new org.zstack.sdk.CreateMiniClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9953,8 +10277,8 @@ abstract class ApiHelper { } - def createPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePolicyAction() + def createMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateMonitorTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.CreateMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -9980,8 +10304,8 @@ abstract class ApiHelper { } - def createPolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteRuleAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePolicyRouteRuleAction() + def createMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateMulticastRouterAction.class) Closure c) { + def a = new org.zstack.sdk.CreateMulticastRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10007,8 +10331,8 @@ abstract class ApiHelper { } - def createPolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePolicyRouteRuleSetAction() + def createOAuthClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOAuthClientAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOAuthClientAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10034,8 +10358,8 @@ abstract class ApiHelper { } - def createPolicyRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePolicyRouteTableAction() + def createObservabilityServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateObservabilityServerAction.class) Closure c) { + def a = new org.zstack.sdk.CreateObservabilityServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10061,8 +10385,8 @@ abstract class ApiHelper { } - def createPolicyRouteTableRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteTableRouteEntryAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePolicyRouteTableRouteEntryAction() + def createObservabilityServerOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateObservabilityServerOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateObservabilityServerOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10088,8 +10412,8 @@ abstract class ApiHelper { } - def createPortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePortForwardingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePortForwardingRuleAction() + def createOssBackupBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOssBackupBucketRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOssBackupBucketRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10115,8 +10439,8 @@ abstract class ApiHelper { } - def createPortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePortMirrorAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePortMirrorAction() + def createOssBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOssBucketRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOssBucketRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10142,8 +10466,8 @@ abstract class ApiHelper { } - def createPortMirrorSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePortMirrorSessionAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePortMirrorSessionAction() + def createOvnControllerOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOvnControllerOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOvnControllerOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10169,8 +10493,8 @@ abstract class ApiHelper { } - def createPriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePriceTableAction.class) Closure c) { - def a = new org.zstack.sdk.CreatePriceTableAction() + def createOvnControllerVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateOvnControllerVmAction.class) Closure c) { + def a = new org.zstack.sdk.CreateOvnControllerVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10196,8 +10520,8 @@ abstract class ApiHelper { } - def createResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateResourcePriceAction.class) Closure c) { - def a = new org.zstack.sdk.CreateResourcePriceAction() + def createPciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePciDeviceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePciDeviceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10223,8 +10547,8 @@ abstract class ApiHelper { } - def createResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.CreateResourceStackAction() + def createPluginSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePluginSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePluginSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10250,8 +10574,8 @@ abstract class ApiHelper { } - def createResourceStackFromApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateResourceStackFromAppAction.class) Closure c) { - def a = new org.zstack.sdk.CreateResourceStackFromAppAction() + def createPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10277,8 +10601,8 @@ abstract class ApiHelper { } - def createRootVolumeTemplateFromRootVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateRootVolumeTemplateFromRootVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.CreateRootVolumeTemplateFromRootVolumeAction() + def createPolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteRuleAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePolicyRouteRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10304,8 +10628,8 @@ abstract class ApiHelper { } - def createRootVolumeTemplateFromVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotAction() + def createPolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePolicyRouteRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10331,8 +10655,8 @@ abstract class ApiHelper { } - def createSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSSORedirectTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSSORedirectTemplateAction() + def createPolicyRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePolicyRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10358,8 +10682,8 @@ abstract class ApiHelper { } - def createSanSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSanSecSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSanSecSecretResourcePoolAction() + def createPolicyRouteTableRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePolicyRouteTableRouteEntryAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePolicyRouteTableRouteEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10385,8 +10709,8 @@ abstract class ApiHelper { } - def createSchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSchedulerJobAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSchedulerJobAction() + def createPortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePortForwardingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePortForwardingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10412,8 +10736,8 @@ abstract class ApiHelper { } - def createSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSchedulerJobGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSchedulerJobGroupAction() + def createPortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePortMirrorAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePortMirrorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10439,8 +10763,8 @@ abstract class ApiHelper { } - def createSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSchedulerTriggerAction() + def createPortMirrorSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePortMirrorSessionAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePortMirrorSessionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10466,8 +10790,8 @@ abstract class ApiHelper { } - def createSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSecurityGroupAction() + def createPriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreatePriceTableAction.class) Closure c) { + def a = new org.zstack.sdk.CreatePriceTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10493,8 +10817,8 @@ abstract class ApiHelper { } - def createSlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSlbGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSlbGroupAction() + def createResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateResourcePriceAction.class) Closure c) { + def a = new org.zstack.sdk.CreateResourcePriceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10520,8 +10844,8 @@ abstract class ApiHelper { } - def createSlbInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSlbInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSlbInstanceAction() + def createResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.CreateResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10547,8 +10871,8 @@ abstract class ApiHelper { } - def createSlbOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSlbOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSlbOfferingAction() + def createResourceStackFromApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateResourceStackFromAppAction.class) Closure c) { + def a = new org.zstack.sdk.CreateResourceStackFromAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10574,8 +10898,8 @@ abstract class ApiHelper { } - def createSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSnmpAgentAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSnmpAgentAction() + def createRootVolumeTemplateFromRootVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateRootVolumeTemplateFromRootVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.CreateRootVolumeTemplateFromRootVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10601,8 +10925,8 @@ abstract class ApiHelper { } - def createSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSshKeyPairAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSshKeyPairAction() + def createRootVolumeTemplateFromVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.CreateRootVolumeTemplateFromVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10628,8 +10952,8 @@ abstract class ApiHelper { } - def createSystemTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSystemTagAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSystemTagAction() + def createSAML2Client(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSAML2ClientAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSAML2ClientAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10655,8 +10979,8 @@ abstract class ApiHelper { } - def createSystemTags(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSystemTagsAction.class) Closure c) { - def a = new org.zstack.sdk.CreateSystemTagsAction() + def createSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSSORedirectTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSSORedirectTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10682,8 +11006,8 @@ abstract class ApiHelper { } - def createTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateTagAction.class) Closure c) { - def a = new org.zstack.sdk.CreateTagAction() + def createSanSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSanSecSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSanSecSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10709,8 +11033,8 @@ abstract class ApiHelper { } - def createUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserAction.class) Closure c) { - def a = new org.zstack.sdk.CreateUserAction() + def createSchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSchedulerJobAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSchedulerJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10736,8 +11060,8 @@ abstract class ApiHelper { } - def createUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateUserGroupAction() + def createSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSchedulerJobGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSchedulerJobGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10763,8 +11087,8 @@ abstract class ApiHelper { } - def createUserTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserTagAction.class) Closure c) { - def a = new org.zstack.sdk.CreateUserTagAction() + def createSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSchedulerTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10790,8 +11114,8 @@ abstract class ApiHelper { } - def createVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVRouterOspfAreaAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVRouterOspfAreaAction() + def createSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10817,8 +11141,8 @@ abstract class ApiHelper { } - def createVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVRouterRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVRouterRouteTableAction() + def createSlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSlbGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSlbGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10844,8 +11168,8 @@ abstract class ApiHelper { } - def createVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVipAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVipAction() + def createSlbInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSlbInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSlbInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10871,8 +11195,8 @@ abstract class ApiHelper { } - def createVirtualRouterOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVirtualRouterOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVirtualRouterOfferingAction() + def createSlbOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSlbOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSlbOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10898,8 +11222,8 @@ abstract class ApiHelper { } - def createVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmCdRomAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmCdRomAction() + def createSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSnmpAgentAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSnmpAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10925,8 +11249,8 @@ abstract class ApiHelper { } - def createVmFromCdpBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmFromCdpBackupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmFromCdpBackupAction() + def createSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSshKeyPairAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSshKeyPairAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10952,8 +11276,8 @@ abstract class ApiHelper { } - def createVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmInstanceAction() + def createSystemTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSystemTagAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSystemTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -10979,8 +11303,8 @@ abstract class ApiHelper { } - def createVmInstanceFromOvf(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromOvfAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmInstanceFromOvfAction() + def createSystemTags(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateSystemTagsAction.class) Closure c) { + def a = new org.zstack.sdk.CreateSystemTagsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11006,8 +11330,8 @@ abstract class ApiHelper { } - def createVmInstanceFromVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmInstanceFromVolumeAction() + def createTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateTagAction.class) Closure c) { + def a = new org.zstack.sdk.CreateTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11033,8 +11357,8 @@ abstract class ApiHelper { } - def createVmInstanceFromVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotAction() + def createUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserAction.class) Closure c) { + def a = new org.zstack.sdk.CreateUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11060,8 +11384,8 @@ abstract class ApiHelper { } - def createVmInstanceFromVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotGroupAction() + def createUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateUserGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11087,8 +11411,8 @@ abstract class ApiHelper { } - def createVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmNicAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmNicAction() + def createUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.CreateUserProxyConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11114,8 +11438,8 @@ abstract class ApiHelper { } - def createVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmSchedulingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmSchedulingRuleAction() + def createUserTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateUserTagAction.class) Closure c) { + def a = new org.zstack.sdk.CreateUserTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11141,8 +11465,8 @@ abstract class ApiHelper { } - def createVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmSchedulingRuleGroupAction() + def createVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVRouterOspfAreaAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVRouterOspfAreaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11168,8 +11492,8 @@ abstract class ApiHelper { } - def createVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmUserDefinedXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVmUserDefinedXmlHookScriptAction() + def createVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVRouterRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVRouterRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11195,8 +11519,8 @@ abstract class ApiHelper { } - def createVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVniRangeAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVniRangeAction() + def createVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVipAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11222,8 +11546,8 @@ abstract class ApiHelper { } - def createVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVolumeSnapshotAction() + def createVirtualRouterOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVirtualRouterOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVirtualRouterOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11249,8 +11573,8 @@ abstract class ApiHelper { } - def createVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVolumeSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVolumeSnapshotGroupAction() + def createVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmCdRomAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmCdRomAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11276,8 +11600,8 @@ abstract class ApiHelper { } - def createVolumesSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVolumesSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVolumesSnapshotAction() + def createVmFromCdpBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmFromCdpBackupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmFromCdpBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11303,8 +11627,8 @@ abstract class ApiHelper { } - def createVpcFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcFirewallAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpcFirewallAction() + def createVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11330,8 +11654,8 @@ abstract class ApiHelper { } - def createVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcHaGroupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpcHaGroupAction() + def createVmInstanceFromOvf(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromOvfAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmInstanceFromOvfAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11357,8 +11681,8 @@ abstract class ApiHelper { } - def createVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcSharedQosAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpcSharedQosAction() + def createVmInstanceFromVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmInstanceFromVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11384,8 +11708,8 @@ abstract class ApiHelper { } - def createVpcUserVpnGatewayRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcUserVpnGatewayRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpcUserVpnGatewayRemoteAction() + def createVmInstanceFromVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11411,8 +11735,8 @@ abstract class ApiHelper { } - def createVpcVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcVRouterAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpcVRouterAction() + def createVmInstanceFromVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmInstanceFromVolumeSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11438,8 +11762,8 @@ abstract class ApiHelper { } - def createVpcVpnConnectionRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcVpnConnectionRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpcVpnConnectionRemoteAction() + def createVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmNicAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11465,8 +11789,8 @@ abstract class ApiHelper { } - def createVpnIkeConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpnIkeConfigAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpnIkeConfigAction() + def createVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmSchedulingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmSchedulingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11492,8 +11816,8 @@ abstract class ApiHelper { } - def createVpnIpsecConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpnIpsecConfigAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVpnIpsecConfigAction() + def createVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11519,8 +11843,8 @@ abstract class ApiHelper { } - def createVxlanPoolRemoteVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVxlanPoolRemoteVtepAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVxlanPoolRemoteVtepAction() + def createVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmUserDefinedXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmUserDefinedXmlHookScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11546,8 +11870,8 @@ abstract class ApiHelper { } - def createVxlanVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVxlanVtepAction.class) Closure c) { - def a = new org.zstack.sdk.CreateVxlanVtepAction() + def createVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVniRangeAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVniRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11573,8 +11897,8 @@ abstract class ApiHelper { } - def createWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateWebhookAction.class) Closure c) { - def a = new org.zstack.sdk.CreateWebhookAction() + def createVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11600,8 +11924,8 @@ abstract class ApiHelper { } - def createZBoxBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateZBoxBackupAction.class) Closure c) { - def a = new org.zstack.sdk.CreateZBoxBackupAction() + def createVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVolumeSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVolumeSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11627,8 +11951,8 @@ abstract class ApiHelper { } - def createZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateZoneAction.class) Closure c) { - def a = new org.zstack.sdk.CreateZoneAction() + def createVolumesSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVolumesSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVolumesSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11654,8 +11978,8 @@ abstract class ApiHelper { } - def debugSignal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DebugSignalAction.class) Closure c) { - def a = new org.zstack.sdk.DebugSignalAction() + def createVpcFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcFirewallAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpcFirewallAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11681,8 +12005,8 @@ abstract class ApiHelper { } - def decodeStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DecodeStackTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DecodeStackTemplateAction() + def createVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcHaGroupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpcHaGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11708,8 +12032,35 @@ abstract class ApiHelper { } - def deleteAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccessControlListAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAccessControlListAction() + def createVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcSharedQosAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpcSharedQosAction() + 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 createVpcUserVpnGatewayRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcUserVpnGatewayRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpcUserVpnGatewayRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11735,8 +12086,8 @@ abstract class ApiHelper { } - def deleteAccessControlRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccessControlRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAccessControlRuleAction() + def createVpcVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpcVRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11762,8 +12113,8 @@ abstract class ApiHelper { } - def deleteAccessKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccessKeyAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAccessKeyAction() + def createVpcVpnConnectionRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpcVpnConnectionRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpcVpnConnectionRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11789,8 +12140,8 @@ abstract class ApiHelper { } - def deleteAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccountAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAccountAction() + def createVpnIkeConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpnIkeConfigAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpnIkeConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11816,8 +12167,8 @@ abstract class ApiHelper { } - def deleteAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAffinityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAffinityGroupAction() + def createVpnIpsecConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVpnIpsecConfigAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVpnIpsecConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11843,8 +12194,8 @@ abstract class ApiHelper { } - def deleteAlert(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAlertAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAlertAction() + def createVxlanPoolRemoteVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVxlanPoolRemoteVtepAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVxlanPoolRemoteVtepAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11870,8 +12221,8 @@ abstract class ApiHelper { } - def deleteAliyunDiskFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunDiskFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunDiskFromLocalAction() + def createVxlanVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVxlanVtepAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVxlanVtepAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11897,8 +12248,8 @@ abstract class ApiHelper { } - def deleteAliyunDiskFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunDiskFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunDiskFromRemoteAction() + def createWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateWebhookAction.class) Closure c) { + def a = new org.zstack.sdk.CreateWebhookAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11924,8 +12275,8 @@ abstract class ApiHelper { } - def deleteAliyunKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunKeySecretAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunKeySecretAction() + def createZBoxBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateZBoxBackupAction.class) Closure c) { + def a = new org.zstack.sdk.CreateZBoxBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11951,8 +12302,8 @@ abstract class ApiHelper { } - def deleteAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunNasAccessGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunNasAccessGroupAction() + def createZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateZoneAction.class) Closure c) { + def a = new org.zstack.sdk.CreateZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -11978,8 +12329,8 @@ abstract class ApiHelper { } - def deleteAliyunNasAccessGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunNasAccessGroupRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunNasAccessGroupRuleAction() + def debugSignal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DebugSignalAction.class) Closure c) { + def a = new org.zstack.sdk.DebugSignalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12005,8 +12356,8 @@ abstract class ApiHelper { } - def deleteAliyunPanguPartition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunPanguPartitionAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunPanguPartitionAction() + def decodeStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DecodeStackTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DecodeStackTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12032,8 +12383,8 @@ abstract class ApiHelper { } - def deleteAliyunProxyVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunProxyVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunProxyVSwitchAction() + def deleteAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccessControlListAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAccessControlListAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12059,8 +12410,8 @@ abstract class ApiHelper { } - def deleteAliyunProxyVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunProxyVpcAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunProxyVpcAction() + def deleteAccessControlRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccessControlRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAccessControlRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12086,8 +12437,8 @@ abstract class ApiHelper { } - def deleteAliyunRouteEntryRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunRouteEntryRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunRouteEntryRemoteAction() + def deleteAccessKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccessKeyAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAccessKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12113,8 +12464,8 @@ abstract class ApiHelper { } - def deleteAliyunRouterInterfaceLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunRouterInterfaceLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunRouterInterfaceLocalAction() + def deleteAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAccountAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12140,8 +12491,8 @@ abstract class ApiHelper { } - def deleteAliyunRouterInterfaceRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunRouterInterfaceRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunRouterInterfaceRemoteAction() + def deleteAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAffinityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAffinityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12167,8 +12518,8 @@ abstract class ApiHelper { } - def deleteAliyunSnapshotFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunSnapshotFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunSnapshotFromLocalAction() + def deleteAlert(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAlertAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAlertAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12194,8 +12545,8 @@ abstract class ApiHelper { } - def deleteAliyunSnapshotFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunSnapshotFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAliyunSnapshotFromRemoteAction() + def deleteAliyunDiskFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunDiskFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunDiskFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12221,8 +12572,8 @@ abstract class ApiHelper { } - def deleteAllEcsInstancesFromDataCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAllEcsInstancesFromDataCenterAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAllEcsInstancesFromDataCenterAction() + def deleteAliyunDiskFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunDiskFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunDiskFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12248,8 +12599,8 @@ abstract class ApiHelper { } - def deleteAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAppBuildSystemAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAppBuildSystemAction() + def deleteAliyunKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunKeySecretAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunKeySecretAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12275,8 +12626,8 @@ abstract class ApiHelper { } - def deleteAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAutoScalingGroupAction() + def deleteAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunNasAccessGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunNasAccessGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12302,8 +12653,8 @@ abstract class ApiHelper { } - def deleteAutoScalingGroupInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingGroupInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAutoScalingGroupInstanceAction() + def deleteAliyunNasAccessGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunNasAccessGroupRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunNasAccessGroupRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12329,8 +12680,8 @@ abstract class ApiHelper { } - def deleteAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAutoScalingRuleAction() + def deleteAliyunPanguPartition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunPanguPartitionAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunPanguPartitionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12356,8 +12707,8 @@ abstract class ApiHelper { } - def deleteAutoScalingRuleTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingRuleTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAutoScalingRuleTriggerAction() + def deleteAliyunProxyVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunProxyVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunProxyVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12383,8 +12734,8 @@ abstract class ApiHelper { } - def deleteAutoScalingTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteAutoScalingTemplateAction() + def deleteAliyunProxyVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunProxyVpcAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunProxyVpcAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12410,8 +12761,8 @@ abstract class ApiHelper { } - def deleteBackupFileInPublic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBackupFileInPublicAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBackupFileInPublicAction() + def deleteAliyunRouteEntryRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunRouteEntryRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunRouteEntryRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12437,8 +12788,8 @@ abstract class ApiHelper { } - def deleteBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBackupStorageAction() + def deleteAliyunRouterInterfaceLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunRouterInterfaceLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunRouterInterfaceLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12464,8 +12815,8 @@ abstract class ApiHelper { } - def deleteBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBareMetal2ChassisAction() + def deleteAliyunRouterInterfaceRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunRouterInterfaceRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunRouterInterfaceRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12491,8 +12842,8 @@ abstract class ApiHelper { } - def deleteBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBareMetal2GatewayAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBareMetal2GatewayAction() + def deleteAliyunSnapshotFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunSnapshotFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunSnapshotFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12518,8 +12869,8 @@ abstract class ApiHelper { } - def deleteBareMetal2ProvisionNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBareMetal2ProvisionNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBareMetal2ProvisionNetworkAction() + def deleteAliyunSnapshotFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAliyunSnapshotFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAliyunSnapshotFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12545,8 +12896,8 @@ abstract class ApiHelper { } - def deleteBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBaremetalChassisAction() + def deleteAllEcsInstancesFromDataCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAllEcsInstancesFromDataCenterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAllEcsInstancesFromDataCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12572,8 +12923,8 @@ abstract class ApiHelper { } - def deleteBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBaremetalPxeServerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBaremetalPxeServerAction() + def deleteAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAppBuildSystemAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAppBuildSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12599,8 +12950,8 @@ abstract class ApiHelper { } - def deleteBilling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBillingAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBillingAction() + def deleteAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAutoScalingGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12626,8 +12977,8 @@ abstract class ApiHelper { } - def deleteBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBondingAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBondingAction() + def deleteAutoScalingGroupInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingGroupInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAutoScalingGroupInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12653,8 +13004,8 @@ abstract class ApiHelper { } - def deleteBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBuildAppAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBuildAppAction() + def deleteAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAutoScalingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12680,8 +13031,8 @@ abstract class ApiHelper { } - def deleteBuildAppExportHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBuildAppExportHistoryAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteBuildAppExportHistoryAction() + def deleteAutoScalingRuleTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingRuleTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAutoScalingRuleTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12707,8 +13058,8 @@ abstract class ApiHelper { } - def deleteCCSCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCCSCertificateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteCCSCertificateAction() + def deleteAutoScalingTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteAutoScalingTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteAutoScalingTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12734,8 +13085,8 @@ abstract class ApiHelper { } - def deleteCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteCdpPolicyAction() + def deleteBackupFileInPublic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBackupFileInPublicAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBackupFileInPublicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12761,8 +13112,8 @@ abstract class ApiHelper { } - def deleteCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpTaskAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteCdpTaskAction() + def deleteBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12788,8 +13139,8 @@ abstract class ApiHelper { } - def deleteCdpTaskData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpTaskDataAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteCdpTaskDataAction() + def deleteBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBareMetal2ChassisAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12815,8 +13166,8 @@ abstract class ApiHelper { } - def deleteCephPrimaryStoragePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCephPrimaryStoragePoolAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteCephPrimaryStoragePoolAction() + def deleteBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBareMetal2GatewayAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBareMetal2GatewayAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12842,8 +13193,8 @@ abstract class ApiHelper { } - def deleteCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCertificateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteCertificateAction() + def deleteBareMetal2ProvisionNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBareMetal2ProvisionNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBareMetal2ProvisionNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12869,8 +13220,8 @@ abstract class ApiHelper { } - def deleteCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteClusterAction() + def deleteBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12896,8 +13247,8 @@ abstract class ApiHelper { } - def deleteClusterDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteClusterDRSAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteClusterDRSAction() + def deleteBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBaremetalPxeServerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBaremetalPxeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12923,8 +13274,8 @@ abstract class ApiHelper { } - def deleteConnectionAccessPointLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteConnectionAccessPointLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteConnectionAccessPointLocalAction() + def deleteBilling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBillingAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBillingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12950,8 +13301,8 @@ abstract class ApiHelper { } - def deleteConnectionBetweenL3NetWorkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction() + def deleteBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBondingAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -12977,8 +13328,8 @@ abstract class ApiHelper { } - def deleteDataCenterInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDataCenterInLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteDataCenterInLocalAction() + def deleteBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBuildAppAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBuildAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13004,8 +13355,8 @@ abstract class ApiHelper { } - def deleteDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDataVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteDataVolumeAction() + def deleteBuildAppExportHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteBuildAppExportHistoryAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteBuildAppExportHistoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13031,8 +13382,8 @@ abstract class ApiHelper { } - def deleteDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDirectoryAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteDirectoryAction() + def deleteCCSCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCCSCertificateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCCSCertificateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13058,8 +13409,8 @@ abstract class ApiHelper { } - def deleteDiskOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDiskOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteDiskOfferingAction() + def deleteCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCbtTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13085,8 +13436,8 @@ abstract class ApiHelper { } - def deleteEcsImageLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsImageLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsImageLocalAction() + def deleteCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpPolicyAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13112,8 +13463,8 @@ abstract class ApiHelper { } - def deleteEcsImageRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsImageRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsImageRemoteAction() + def deleteCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCdpTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13139,8 +13490,8 @@ abstract class ApiHelper { } - def deleteEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsInstanceAction() + def deleteCdpTaskData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCdpTaskDataAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCdpTaskDataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13166,8 +13517,8 @@ abstract class ApiHelper { } - def deleteEcsInstanceLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsInstanceLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsInstanceLocalAction() + def deleteCephPrimaryStoragePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCephPrimaryStoragePoolAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCephPrimaryStoragePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13193,8 +13544,8 @@ abstract class ApiHelper { } - def deleteEcsSecurityGroupInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsSecurityGroupInLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsSecurityGroupInLocalAction() + def deleteCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteCertificateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteCertificateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13220,8 +13571,8 @@ abstract class ApiHelper { } - def deleteEcsSecurityGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsSecurityGroupRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsSecurityGroupRemoteAction() + def deleteCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13247,8 +13598,8 @@ abstract class ApiHelper { } - def deleteEcsSecurityGroupRuleRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsSecurityGroupRuleRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsSecurityGroupRuleRemoteAction() + def deleteClusterDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteClusterDRSAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteClusterDRSAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13274,8 +13625,35 @@ abstract class ApiHelper { } - def deleteEcsVSwitchInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVSwitchInLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsVSwitchInLocalAction() + def deleteConnectionAccessPointLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteConnectionAccessPointLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteConnectionAccessPointLocalAction() + 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 deleteConnectionBetweenL3NetWorkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteConnectionBetweenL3NetWorkAndAliyunVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13301,8 +13679,8 @@ abstract class ApiHelper { } - def deleteEcsVSwitchRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVSwitchRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsVSwitchRemoteAction() + def deleteContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13328,8 +13706,8 @@ abstract class ApiHelper { } - def deleteEcsVpcInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVpcInLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsVpcInLocalAction() + def deleteContainerResourceFromEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteContainerResourceFromEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteContainerResourceFromEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13355,8 +13733,8 @@ abstract class ApiHelper { } - def deleteEcsVpcRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVpcRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEcsVpcRemoteAction() + def deleteDataCenterInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDataCenterInLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDataCenterInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13382,8 +13760,8 @@ abstract class ApiHelper { } - def deleteEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEipAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteEipAction() + def deleteDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDataVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDataVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13409,8 +13787,8 @@ abstract class ApiHelper { } - def deleteExportedImageFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteExportedImageFromBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteExportedImageFromBackupStorageAction() + def deleteDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDatasetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13436,8 +13814,8 @@ abstract class ApiHelper { } - def deleteExternalBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteExternalBackupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteExternalBackupAction() + def deleteDatasets(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDatasetsAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDatasetsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13463,8 +13841,8 @@ abstract class ApiHelper { } - def deleteFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFirewallAction() + def deleteDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDirectoryAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13490,8 +13868,8 @@ abstract class ApiHelper { } - def deleteFirewallIpSetTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallIpSetTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFirewallIpSetTemplateAction() + def deleteDiskOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteDiskOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteDiskOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13517,8 +13895,8 @@ abstract class ApiHelper { } - def deleteFirewallRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFirewallRuleAction() + def deleteEcsImageLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsImageLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsImageLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13544,8 +13922,8 @@ abstract class ApiHelper { } - def deleteFirewallRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFirewallRuleSetAction() + def deleteEcsImageRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsImageRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsImageRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13571,8 +13949,8 @@ abstract class ApiHelper { } - def deleteFirewallRuleTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallRuleTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFirewallRuleTemplateAction() + def deleteEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13598,8 +13976,8 @@ abstract class ApiHelper { } - def deleteFlowCollector(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFlowCollectorAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFlowCollectorAction() + def deleteEcsInstanceLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsInstanceLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsInstanceLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13625,8 +14003,8 @@ abstract class ApiHelper { } - def deleteFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFlowMeterAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteFlowMeterAction() + def deleteEcsSecurityGroupInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsSecurityGroupInLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsSecurityGroupInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13652,8 +14030,8 @@ abstract class ApiHelper { } - def deleteGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteGCJobAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteGCJobAction() + def deleteEcsSecurityGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsSecurityGroupRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsSecurityGroupRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13679,8 +14057,8 @@ abstract class ApiHelper { } - def deleteGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteGuestVmScriptAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteGuestVmScriptAction() + def deleteEcsSecurityGroupRuleRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsSecurityGroupRuleRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsSecurityGroupRuleRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13706,8 +14084,8 @@ abstract class ApiHelper { } - def deleteHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHostAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteHostAction() + def deleteEcsVSwitchInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVSwitchInLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsVSwitchInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13733,8 +14111,8 @@ abstract class ApiHelper { } - def deleteHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHostSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteHostSchedulingRuleGroupAction() + def deleteEcsVSwitchRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVSwitchRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsVSwitchRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13760,8 +14138,8 @@ abstract class ApiHelper { } - def deleteHybridEipFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHybridEipFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteHybridEipFromLocalAction() + def deleteEcsVpcInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVpcInLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsVpcInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13787,8 +14165,8 @@ abstract class ApiHelper { } - def deleteHybridEipRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHybridEipRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteHybridEipRemoteAction() + def deleteEcsVpcRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEcsVpcRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEcsVpcRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13814,8 +14192,8 @@ abstract class ApiHelper { } - def deleteHybridKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHybridKeySecretAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteHybridKeySecretAction() + def deleteEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteEipAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13841,8 +14219,8 @@ abstract class ApiHelper { } - def deleteIAM2VirtualIDLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIAM2VirtualIDLdapBindingAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteIAM2VirtualIDLdapBindingAction() + def deleteExportedImageFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteExportedImageFromBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteExportedImageFromBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13868,8 +14246,8 @@ abstract class ApiHelper { } - def deleteIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIPsecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteIPsecConnectionAction() + def deleteExternalBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteExternalBackupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteExternalBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13895,8 +14273,8 @@ abstract class ApiHelper { } - def deleteIdentityZoneInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIdentityZoneInLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteIdentityZoneInLocalAction() + def deleteFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFirewallAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13922,8 +14300,8 @@ abstract class ApiHelper { } - def deleteImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteImageAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteImageAction() + def deleteFirewallIpSetTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallIpSetTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFirewallIpSetTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13949,8 +14327,8 @@ abstract class ApiHelper { } - def deleteImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteImagePackageAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteImagePackageAction() + def deleteFirewallRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFirewallRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -13976,8 +14354,8 @@ abstract class ApiHelper { } - def deleteImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteImageReplicationGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteImageReplicationGroupAction() + def deleteFirewallRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFirewallRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14003,8 +14381,8 @@ abstract class ApiHelper { } - def deleteInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteInstanceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteInstanceOfferingAction() + def deleteFirewallRuleTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFirewallRuleTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFirewallRuleTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14030,8 +14408,8 @@ abstract class ApiHelper { } - def deleteIpAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIpAddressAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteIpAddressAction() + def deleteFlowCollector(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFlowCollectorAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFlowCollectorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14057,8 +14435,8 @@ abstract class ApiHelper { } - def deleteIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIpRangeAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteIpRangeAction() + def deleteFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteFlowMeterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteFlowMeterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14084,8 +14462,8 @@ abstract class ApiHelper { } - def deleteIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIscsiServerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteIscsiServerAction() + def deleteGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteGCJobAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteGCJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14111,8 +14489,8 @@ abstract class ApiHelper { } - def deleteL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteL2NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteL2NetworkAction() + def deleteGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteGuestVmScriptAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteGuestVmScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14138,8 +14516,8 @@ abstract class ApiHelper { } - def deleteL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteL3NetworkAction() + def deleteHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHostAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14165,8 +14543,8 @@ abstract class ApiHelper { } - def deleteLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLdapBindingAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLdapBindingAction() + def deleteHostNetworkServiceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHostNetworkServiceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHostNetworkServiceTypeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14192,8 +14570,8 @@ abstract class ApiHelper { } - def deleteLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLdapServerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLdapServerAction() + def deleteHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHostSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHostSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14219,8 +14597,8 @@ abstract class ApiHelper { } - def deleteLicense(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLicenseAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLicenseAction() + def deleteHybridEipFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHybridEipFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHybridEipFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14246,8 +14624,8 @@ abstract class ApiHelper { } - def deleteLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLoadBalancerAction() + def deleteHybridEipRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHybridEipRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHybridEipRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14273,8 +14651,8 @@ abstract class ApiHelper { } - def deleteLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLoadBalancerListenerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLoadBalancerListenerAction() + def deleteHybridKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteHybridKeySecretAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteHybridKeySecretAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14300,8 +14678,8 @@ abstract class ApiHelper { } - def deleteLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLoadBalancerServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLoadBalancerServerGroupAction() + def deleteIAM2VirtualIDLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIAM2VirtualIDLdapBindingAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteIAM2VirtualIDLdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14327,8 +14705,8 @@ abstract class ApiHelper { } - def deleteLogConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLogConfigurationAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLogConfigurationAction() + def deleteIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIPsecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14354,8 +14732,8 @@ abstract class ApiHelper { } - def deleteLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLongJobAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteLongJobAction() + def deleteIdentityZoneInLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIdentityZoneInLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteIdentityZoneInLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14381,8 +14759,8 @@ abstract class ApiHelper { } - def deleteMdevDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMdevDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteMdevDeviceAction() + def deleteImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteImageAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14408,8 +14786,8 @@ abstract class ApiHelper { } - def deleteMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMediaAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteMediaAction() + def deleteImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteImagePackageAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteImagePackageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14435,8 +14813,8 @@ abstract class ApiHelper { } - def deleteMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteMonitorTriggerAction() + def deleteImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteImageReplicationGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteImageReplicationGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14462,8 +14840,8 @@ abstract class ApiHelper { } - def deleteMonitorTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerActionAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteMonitorTriggerActionAction() + def deleteInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteInstanceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteInstanceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14489,8 +14867,8 @@ abstract class ApiHelper { } - def deleteMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMulticastRouterAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteMulticastRouterAction() + def deleteIpAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIpAddressAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteIpAddressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14516,8 +14894,8 @@ abstract class ApiHelper { } - def deleteNasFileSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNasFileSystemAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteNasFileSystemAction() + def deleteIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIpRangeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteIpRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14543,8 +14921,8 @@ abstract class ApiHelper { } - def deleteNasMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNasMountTargetAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteNasMountTargetAction() + def deleteIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteIscsiServerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteIscsiServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14570,8 +14948,8 @@ abstract class ApiHelper { } - def deleteNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNicQosAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteNicQosAction() + def deleteL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteL2NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14597,8 +14975,8 @@ abstract class ApiHelper { } - def deleteNvmeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNvmeServerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteNvmeServerAction() + def deleteL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14624,8 +15002,8 @@ abstract class ApiHelper { } - def deleteOssBucketFileRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteOssBucketFileRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteOssBucketFileRemoteAction() + def deleteLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLdapBindingAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14651,8 +15029,8 @@ abstract class ApiHelper { } - def deleteOssBucketNameLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteOssBucketNameLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteOssBucketNameLocalAction() + def deleteLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLdapServerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLdapServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14678,8 +15056,8 @@ abstract class ApiHelper { } - def deleteOssBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteOssBucketRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteOssBucketRemoteAction() + def deleteLicense(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLicenseAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLicenseAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14705,8 +15083,8 @@ abstract class ApiHelper { } - def deletePciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePciDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePciDeviceAction() + def deleteLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14732,8 +15110,8 @@ abstract class ApiHelper { } - def deletePciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePciDeviceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePciDeviceOfferingAction() + def deleteLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLoadBalancerListenerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLoadBalancerListenerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14759,8 +15137,8 @@ abstract class ApiHelper { } - def deletePolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePolicyAction() + def deleteLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLoadBalancerServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLoadBalancerServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14786,8 +15164,8 @@ abstract class ApiHelper { } - def deletePolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePolicyRouteRuleAction() + def deleteLogConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLogConfigurationAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLogConfigurationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14813,8 +15191,8 @@ abstract class ApiHelper { } - def deletePolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePolicyRouteRuleSetAction() + def deleteLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLogServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14840,8 +15218,8 @@ abstract class ApiHelper { } - def deletePolicyRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePolicyRouteTableAction() + def deleteLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14867,8 +15245,8 @@ abstract class ApiHelper { } - def deletePolicyRouteTableRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteTableRouteEntryAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePolicyRouteTableRouteEntryAction() + def deleteMdevDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMdevDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteMdevDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14894,8 +15272,8 @@ abstract class ApiHelper { } - def deletePortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePortForwardingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePortForwardingRuleAction() + def deleteMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMediaAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteMediaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14921,8 +15299,8 @@ abstract class ApiHelper { } - def deletePortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePortMirrorAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePortMirrorAction() + def deleteModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14948,8 +15326,35 @@ abstract class ApiHelper { } - def deletePortMirrorSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePortMirrorSessionAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePortMirrorSessionAction() + def deleteModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelCenterAction() + 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 deleteModelEvaluationTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelEvaluationTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelEvaluationTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -14975,8 +15380,8 @@ abstract class ApiHelper { } - def deletePreconfigurationTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePreconfigurationTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePreconfigurationTemplateAction() + def deleteModelEvaluationTasks(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelEvaluationTasksAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelEvaluationTasksAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15002,8 +15407,8 @@ abstract class ApiHelper { } - def deletePriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePriceTableAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePriceTableAction() + def deleteModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15029,8 +15434,8 @@ abstract class ApiHelper { } - def deletePrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePrimaryStorageAction() + def deleteModelServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServiceInstanceGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15056,8 +15461,8 @@ abstract class ApiHelper { } - def deletePublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePublishAppAction.class) Closure c) { - def a = new org.zstack.sdk.DeletePublishAppAction() + def deleteModelServiceInstanceGroups(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServiceInstanceGroupsAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServiceInstanceGroupsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15083,8 +15488,8 @@ abstract class ApiHelper { } - def deleteReservedIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteReservedIpRangeAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteReservedIpRangeAction() + def deleteModelServices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelServicesAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelServicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15110,8 +15515,8 @@ abstract class ApiHelper { } - def deleteResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourceConfigAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteResourceConfigAction() + def deleteModels(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteModelsAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteModelsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15137,8 +15542,8 @@ abstract class ApiHelper { } - def deleteResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourcePriceAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteResourcePriceAction() + def deleteMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15164,8 +15569,8 @@ abstract class ApiHelper { } - def deleteResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteResourceStackAction() + def deleteMonitorTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMonitorTriggerActionAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteMonitorTriggerActionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15191,8 +15596,8 @@ abstract class ApiHelper { } - def deleteResourceStackVmPortMonitor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourceStackVmPortMonitorAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteResourceStackVmPortMonitorAction() + def deleteMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteMulticastRouterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteMulticastRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15218,8 +15623,8 @@ abstract class ApiHelper { } - def deleteSSOClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSSOClientAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSSOClientAction() + def deleteNasFileSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNasFileSystemAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteNasFileSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15245,8 +15650,8 @@ abstract class ApiHelper { } - def deleteSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSSORedirectTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSSORedirectTemplateAction() + def deleteNasMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNasMountTargetAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteNasMountTargetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15272,8 +15677,8 @@ abstract class ApiHelper { } - def deleteSchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSchedulerJobAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSchedulerJobAction() + def deleteNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNicQosAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteNicQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15299,8 +15704,8 @@ abstract class ApiHelper { } - def deleteSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSchedulerJobGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSchedulerJobGroupAction() + def deleteNvmeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteNvmeServerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteNvmeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15326,8 +15731,8 @@ abstract class ApiHelper { } - def deleteSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSchedulerTriggerAction() + def deleteOssBucketFileRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteOssBucketFileRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteOssBucketFileRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15353,8 +15758,8 @@ abstract class ApiHelper { } - def deleteSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSecretResourcePoolAction() + def deleteOssBucketNameLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteOssBucketNameLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteOssBucketNameLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15380,8 +15785,8 @@ abstract class ApiHelper { } - def deleteSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSecurityGroupAction() + def deleteOssBucketRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteOssBucketRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteOssBucketRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15407,8 +15812,8 @@ abstract class ApiHelper { } - def deleteSecurityGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecurityGroupRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSecurityGroupRuleAction() + def deletePciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePciDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePciDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15434,8 +15839,8 @@ abstract class ApiHelper { } - def deleteSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSecurityMachineAction() + def deletePciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePciDeviceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePciDeviceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15461,8 +15866,8 @@ abstract class ApiHelper { } - def deleteSlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSlbGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSlbGroupAction() + def deletePluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePluginDriversAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15488,8 +15893,8 @@ abstract class ApiHelper { } - def deleteSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSshKeyPairAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteSshKeyPairAction() + def deletePolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15515,8 +15920,8 @@ abstract class ApiHelper { } - def deleteStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteStackTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteStackTemplateAction() + def deletePolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePolicyRouteRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15542,8 +15947,8 @@ abstract class ApiHelper { } - def deleteTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteTagAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteTagAction() + def deletePolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePolicyRouteRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15569,8 +15974,8 @@ abstract class ApiHelper { } - def deleteUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteUserAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteUserAction() + def deletePolicyRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePolicyRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15596,8 +16001,8 @@ abstract class ApiHelper { } - def deleteUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteUserGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteUserGroupAction() + def deletePolicyRouteTableRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePolicyRouteTableRouteEntryAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePolicyRouteTableRouteEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15623,8 +16028,8 @@ abstract class ApiHelper { } - def deleteV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteV2VConversionHostAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteV2VConversionHostAction() + def deletePortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePortForwardingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePortForwardingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15650,8 +16055,8 @@ abstract class ApiHelper { } - def deleteVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVCenterAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVCenterAction() + def deletePortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePortMirrorAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePortMirrorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15677,8 +16082,8 @@ abstract class ApiHelper { } - def deleteVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVRouterOspfAreaAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVRouterOspfAreaAction() + def deletePortMirrorSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePortMirrorSessionAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePortMirrorSessionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15704,8 +16109,8 @@ abstract class ApiHelper { } - def deleteVRouterRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVRouterRouteEntryAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVRouterRouteEntryAction() + def deletePreconfigurationTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePreconfigurationTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePreconfigurationTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15731,8 +16136,8 @@ abstract class ApiHelper { } - def deleteVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVRouterRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVRouterRouteTableAction() + def deletePriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePriceTableAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePriceTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15758,8 +16163,8 @@ abstract class ApiHelper { } - def deleteVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVipAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVipAction() + def deletePrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15785,8 +16190,8 @@ abstract class ApiHelper { } - def deleteVipQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVipQosAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVipQosAction() + def deletePublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeletePublishAppAction.class) Closure c) { + def a = new org.zstack.sdk.DeletePublishAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15812,8 +16217,8 @@ abstract class ApiHelper { } - def deleteVirtualBorderRouterLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVirtualBorderRouterLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVirtualBorderRouterLocalAction() + def deleteReservedIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteReservedIpRangeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteReservedIpRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15839,8 +16244,8 @@ abstract class ApiHelper { } - def deleteVirtualRouterLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVirtualRouterLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVirtualRouterLocalAction() + def deleteResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourceConfigAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteResourceConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15866,8 +16271,143 @@ abstract class ApiHelper { } - def deleteVmBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmBootModeAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmBootModeAction() + def deleteResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourcePriceAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteResourcePriceAction() + 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 deleteResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteResourceStackAction() + 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 deleteResourceStackVmPortMonitor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteResourceStackVmPortMonitorAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteResourceStackVmPortMonitorAction() + 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 deleteSSOClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSSOClientAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSSOClientAction() + 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 deleteSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSSORedirectTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSSORedirectTemplateAction() + 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 deleteSchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSchedulerJobAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSchedulerJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15893,8 +16433,8 @@ abstract class ApiHelper { } - def deleteVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmCdRomAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmCdRomAction() + def deleteSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSchedulerJobGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSchedulerJobGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15920,8 +16460,8 @@ abstract class ApiHelper { } - def deleteVmConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmConsolePasswordAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmConsolePasswordAction() + def deleteSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSchedulerTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15947,8 +16487,8 @@ abstract class ApiHelper { } - def deleteVmHostname(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmHostnameAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmHostnameAction() + def deleteSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -15974,8 +16514,8 @@ abstract class ApiHelper { } - def deleteVmInstanceHaLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmInstanceHaLevelAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmInstanceHaLevelAction() + def deleteSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16001,8 +16541,8 @@ abstract class ApiHelper { } - def deleteVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmNicAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmNicAction() + def deleteSecurityGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecurityGroupRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSecurityGroupRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16028,8 +16568,8 @@ abstract class ApiHelper { } - def deleteVmNicFromSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmNicFromSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmNicFromSecurityGroupAction() + def deleteSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16055,8 +16595,8 @@ abstract class ApiHelper { } - def deleteVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmSchedulingRuleGroupAction() + def deleteSlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSlbGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSlbGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16082,8 +16622,8 @@ abstract class ApiHelper { } - def deleteVmSshKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmSshKeyAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmSshKeyAction() + def deleteSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteSshKeyPairAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteSshKeyPairAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16109,8 +16649,8 @@ abstract class ApiHelper { } - def deleteVmStaticIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmStaticIpAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmStaticIpAction() + def deleteStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteStackTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteStackTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16136,8 +16676,8 @@ abstract class ApiHelper { } - def deleteVmUserDefinedXml(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmUserDefinedXmlAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmUserDefinedXmlAction() + def deleteTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteTagAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16163,8 +16703,8 @@ abstract class ApiHelper { } - def deleteVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmUserDefinedXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVmUserDefinedXmlHookScriptAction() + def deleteUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteUserAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16190,8 +16730,8 @@ abstract class ApiHelper { } - def deleteVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVniRangeAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVniRangeAction() + def deleteUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteUserGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteUserGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16217,8 +16757,8 @@ abstract class ApiHelper { } - def deleteVolumeQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVolumeQosAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVolumeQosAction() + def deleteUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteUserProxyConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16244,8 +16784,8 @@ abstract class ApiHelper { } - def deleteVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVolumeSnapshotAction() + def deleteV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteV2VConversionHostAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteV2VConversionHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16271,8 +16811,8 @@ abstract class ApiHelper { } - def deleteVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVolumeSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVolumeSnapshotGroupAction() + def deleteVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVCenterAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16298,8 +16838,8 @@ abstract class ApiHelper { } - def deleteVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcHaGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcHaGroupAction() + def deleteVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVRouterOspfAreaAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVRouterOspfAreaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16325,8 +16865,8 @@ abstract class ApiHelper { } - def deleteVpcIkeConfigLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcIkeConfigLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcIkeConfigLocalAction() + def deleteVRouterRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVRouterRouteEntryAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVRouterRouteEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16352,8 +16892,8 @@ abstract class ApiHelper { } - def deleteVpcIpSecConfigLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcIpSecConfigLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcIpSecConfigLocalAction() + def deleteVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVRouterRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVRouterRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16379,8 +16919,8 @@ abstract class ApiHelper { } - def deleteVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcSharedQosAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcSharedQosAction() + def deleteVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVipAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16406,8 +16946,8 @@ abstract class ApiHelper { } - def deleteVpcUserVpnGatewayLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcUserVpnGatewayLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcUserVpnGatewayLocalAction() + def deleteVipQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVipQosAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVipQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16433,8 +16973,8 @@ abstract class ApiHelper { } - def deleteVpcUserVpnGatewayRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcUserVpnGatewayRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcUserVpnGatewayRemoteAction() + def deleteVirtualBorderRouterLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVirtualBorderRouterLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVirtualBorderRouterLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16460,8 +17000,8 @@ abstract class ApiHelper { } - def deleteVpcVpnConnectionLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcVpnConnectionLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcVpnConnectionLocalAction() + def deleteVirtualRouterLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVirtualRouterLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVirtualRouterLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16487,8 +17027,8 @@ abstract class ApiHelper { } - def deleteVpcVpnConnectionRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcVpnConnectionRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcVpnConnectionRemoteAction() + def deleteVmBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmBootModeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmBootModeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16514,8 +17054,8 @@ abstract class ApiHelper { } - def deleteVpcVpnGatewayLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcVpnGatewayLocalAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVpcVpnGatewayLocalAction() + def deleteVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmCdRomAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmCdRomAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16541,8 +17081,8 @@ abstract class ApiHelper { } - def deleteVxlanL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVxlanL2NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVxlanL2NetworkAction() + def deleteVmConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmConsolePasswordAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmConsolePasswordAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16568,8 +17108,8 @@ abstract class ApiHelper { } - def deleteVxlanPoolRemoteVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVxlanPoolRemoteVtepAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteVxlanPoolRemoteVtepAction() + def deleteVmHostname(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmHostnameAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmHostnameAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16595,8 +17135,8 @@ abstract class ApiHelper { } - def deleteWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteWebhookAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteWebhookAction() + def deleteVmInstanceHaLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmInstanceHaLevelAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmInstanceHaLevelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16622,8 +17162,8 @@ abstract class ApiHelper { } - def deleteZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteZoneAction.class) Closure c) { - def a = new org.zstack.sdk.DeleteZoneAction() + def deleteVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmNicAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16649,8 +17189,8 @@ abstract class ApiHelper { } - def describeVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DescribeVmInstanceRecoveryPointAction.class) Closure c) { - def a = new org.zstack.sdk.DescribeVmInstanceRecoveryPointAction() + def deleteVmNicFromSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmNicFromSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmNicFromSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16676,8 +17216,8 @@ abstract class ApiHelper { } - def destroyBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DestroyBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DestroyBaremetalInstanceAction() + def deleteVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16703,8 +17243,8 @@ abstract class ApiHelper { } - def destroyVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DestroyVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DestroyVmInstanceAction() + def deleteVmSshKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmSshKeyAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmSshKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16730,8 +17270,8 @@ abstract class ApiHelper { } - def detachAliyunDiskFromEcs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAliyunDiskFromEcsAction.class) Closure c) { - def a = new org.zstack.sdk.DetachAliyunDiskFromEcsAction() + def deleteVmStaticIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmStaticIpAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmStaticIpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16757,8 +17297,8 @@ abstract class ApiHelper { } - def detachAliyunKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAliyunKeyAction.class) Closure c) { - def a = new org.zstack.sdk.DetachAliyunKeyAction() + def deleteVmUserDefinedXml(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmUserDefinedXmlAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmUserDefinedXmlAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16784,8 +17324,8 @@ abstract class ApiHelper { } - def detachAppBuildSystemToZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAppBuildSystemToZoneAction.class) Closure c) { - def a = new org.zstack.sdk.DetachAppBuildSystemToZoneAction() + def deleteVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmUserDefinedXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmUserDefinedXmlHookScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16811,8 +17351,8 @@ abstract class ApiHelper { } - def detachAutoScalingTemplateFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAutoScalingTemplateFromGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DetachAutoScalingTemplateFromGroupAction() + def deleteVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVniRangeAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVniRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16838,8 +17378,8 @@ abstract class ApiHelper { } - def detachBackupStorageFromZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBackupStorageFromZoneAction.class) Closure c) { - def a = new org.zstack.sdk.DetachBackupStorageFromZoneAction() + def deleteVolumeQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVolumeQosAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVolumeQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16865,8 +17405,8 @@ abstract class ApiHelper { } - def detachBareMetal2GatewayFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBareMetal2GatewayFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachBareMetal2GatewayFromClusterAction() + def deleteVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16892,8 +17432,8 @@ abstract class ApiHelper { } - def detachBareMetal2ProvisionNetworkFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBareMetal2ProvisionNetworkFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachBareMetal2ProvisionNetworkFromClusterAction() + def deleteVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVolumeSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVolumeSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16919,8 +17459,8 @@ abstract class ApiHelper { } - def detachBaremetalPxeServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBaremetalPxeServerFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachBaremetalPxeServerFromClusterAction() + def deleteVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcHaGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcHaGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16946,8 +17486,8 @@ abstract class ApiHelper { } - def detachCCSCertificateFromUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachCCSCertificateFromUserAction.class) Closure c) { - def a = new org.zstack.sdk.DetachCCSCertificateFromUserAction() + def deleteVpcIkeConfigLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcIkeConfigLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcIkeConfigLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -16973,8 +17513,8 @@ abstract class ApiHelper { } - def detachDataVolumeFromHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachDataVolumeFromHostAction.class) Closure c) { - def a = new org.zstack.sdk.DetachDataVolumeFromHostAction() + def deleteVpcIpSecConfigLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcIpSecConfigLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcIpSecConfigLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17000,8 +17540,8 @@ abstract class ApiHelper { } - def detachDataVolumeFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachDataVolumeFromVmAction.class) Closure c) { - def a = new org.zstack.sdk.DetachDataVolumeFromVmAction() + def deleteVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcSharedQosAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcSharedQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17027,8 +17567,8 @@ abstract class ApiHelper { } - def detachEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachEipAction.class) Closure c) { - def a = new org.zstack.sdk.DetachEipAction() + def deleteVpcUserVpnGatewayLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcUserVpnGatewayLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcUserVpnGatewayLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17054,8 +17594,8 @@ abstract class ApiHelper { } - def detachFirewallRuleSetFromL3(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachFirewallRuleSetFromL3Action.class) Closure c) { - def a = new org.zstack.sdk.DetachFirewallRuleSetFromL3Action() + def deleteVpcUserVpnGatewayRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcUserVpnGatewayRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcUserVpnGatewayRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17081,8 +17621,8 @@ abstract class ApiHelper { } - def detachHostFromHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachHostFromHostSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DetachHostFromHostSchedulingRuleGroupAction() + def deleteVpcVpnConnectionLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcVpnConnectionLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcVpnConnectionLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17108,8 +17648,8 @@ abstract class ApiHelper { } - def detachHybridEipFromEcs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachHybridEipFromEcsAction.class) Closure c) { - def a = new org.zstack.sdk.DetachHybridEipFromEcsAction() + def deleteVpcVpnConnectionRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcVpnConnectionRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcVpnConnectionRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17135,8 +17675,8 @@ abstract class ApiHelper { } - def detachHybridKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachHybridKeyAction.class) Closure c) { - def a = new org.zstack.sdk.DetachHybridKeyAction() + def deleteVpcVpnGatewayLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVpcVpnGatewayLocalAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVpcVpnGatewayLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17162,8 +17702,8 @@ abstract class ApiHelper { } - def detachIscsiServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachIscsiServerFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachIscsiServerFromClusterAction() + def deleteVxlanL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVxlanL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVxlanL2NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17189,8 +17729,8 @@ abstract class ApiHelper { } - def detachIsoFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachIsoFromVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DetachIsoFromVmInstanceAction() + def deleteVxlanPoolRemoteVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVxlanPoolRemoteVtepAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVxlanPoolRemoteVtepAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17216,8 +17756,8 @@ abstract class ApiHelper { } - def detachL2NetworkFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachL2NetworkFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachL2NetworkFromClusterAction() + def deleteWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteWebhookAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteWebhookAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17243,8 +17783,8 @@ abstract class ApiHelper { } - def detachL3NetworkFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachL3NetworkFromVmAction.class) Closure c) { - def a = new org.zstack.sdk.DetachL3NetworkFromVmAction() + def deleteZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteZoneAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17270,8 +17810,8 @@ abstract class ApiHelper { } - def detachL3NetworksFromIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachL3NetworksFromIPsecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.DetachL3NetworksFromIPsecConnectionAction() + def deployAppDevelopmentService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployAppDevelopmentServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployAppDevelopmentServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17297,8 +17837,8 @@ abstract class ApiHelper { } - def detachMdevDeviceFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachMdevDeviceFromVmAction.class) Closure c) { - def a = new org.zstack.sdk.DetachMdevDeviceFromVmAction() + def deployDistributedModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployDistributedModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployDistributedModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17324,8 +17864,8 @@ abstract class ApiHelper { } - def detachMonitorTriggerFromTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachMonitorTriggerActionFromTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.DetachMonitorTriggerActionFromTriggerAction() + def deployModelEvalService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelEvalServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployModelEvalServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17351,8 +17891,8 @@ abstract class ApiHelper { } - def detachNetworkServiceFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNetworkServiceFromL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.DetachNetworkServiceFromL3NetworkAction() + def deployModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeployModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.DeployModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17378,8 +17918,8 @@ abstract class ApiHelper { } - def detachNicFromBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNicFromBondingAction.class) Closure c) { - def a = new org.zstack.sdk.DetachNicFromBondingAction() + def describeVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DescribeVmInstanceRecoveryPointAction.class) Closure c) { + def a = new org.zstack.sdk.DescribeVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17405,8 +17945,8 @@ abstract class ApiHelper { } - def detachNvmeServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNvmeServerFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachNvmeServerFromClusterAction() + def destroyBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DestroyBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DestroyBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17432,8 +17972,8 @@ abstract class ApiHelper { } - def detachOssBucketFromEcsDataCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachOssBucketFromEcsDataCenterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachOssBucketFromEcsDataCenterAction() + def destroyVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DestroyVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DestroyVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17459,8 +17999,8 @@ abstract class ApiHelper { } - def detachPciDeviceFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPciDeviceFromVmAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPciDeviceFromVmAction() + def detachAliyunDiskFromEcs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAliyunDiskFromEcsAction.class) Closure c) { + def a = new org.zstack.sdk.DetachAliyunDiskFromEcsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17486,8 +18026,35 @@ abstract class ApiHelper { } - def detachPoliciesFromUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPoliciesFromUserAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPoliciesFromUserAction() + def detachAliyunKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAliyunKeyAction.class) Closure c) { + def a = new org.zstack.sdk.DetachAliyunKeyAction() + 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 detachAppBuildSystemToZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAppBuildSystemToZoneAction.class) Closure c) { + def a = new org.zstack.sdk.DetachAppBuildSystemToZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17513,8 +18080,8 @@ abstract class ApiHelper { } - def detachPolicyFromUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPolicyFromUserAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPolicyFromUserAction() + def detachAutoScalingTemplateFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachAutoScalingTemplateFromGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DetachAutoScalingTemplateFromGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17540,8 +18107,8 @@ abstract class ApiHelper { } - def detachPolicyFromUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPolicyFromUserGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPolicyFromUserGroupAction() + def detachBackupStorageFromZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBackupStorageFromZoneAction.class) Closure c) { + def a = new org.zstack.sdk.DetachBackupStorageFromZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17567,8 +18134,8 @@ abstract class ApiHelper { } - def detachPolicyRouteRuleSetFromL3(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPolicyRouteRuleSetFromL3Action.class) Closure c) { - def a = new org.zstack.sdk.DetachPolicyRouteRuleSetFromL3Action() + def detachBareMetal2GatewayFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBareMetal2GatewayFromClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachBareMetal2GatewayFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17594,8 +18161,8 @@ abstract class ApiHelper { } - def detachPortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPortForwardingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPortForwardingRuleAction() + def detachBareMetal2ProvisionNetworkFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBareMetal2ProvisionNetworkFromClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachBareMetal2ProvisionNetworkFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17621,8 +18188,8 @@ abstract class ApiHelper { } - def detachPriceTableFromAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPriceTableFromAccountAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPriceTableFromAccountAction() + 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 c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17648,8 +18215,8 @@ abstract class ApiHelper { } - def detachPrimaryStorageFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPrimaryStorageFromClusterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachPrimaryStorageFromClusterAction() + def detachCCSCertificateFromUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachCCSCertificateFromUserAction.class) Closure c) { + def a = new org.zstack.sdk.DetachCCSCertificateFromUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17675,8 +18242,8 @@ abstract class ApiHelper { } - def detachProvisionNicFromBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachProvisionNicFromBondingAction.class) Closure c) { - def a = new org.zstack.sdk.DetachProvisionNicFromBondingAction() + def detachDataVolumeFromHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachDataVolumeFromHostAction.class) Closure c) { + def a = new org.zstack.sdk.DetachDataVolumeFromHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17702,8 +18269,8 @@ abstract class ApiHelper { } - def detachScsiLunFromHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachScsiLunFromHostAction.class) Closure c) { - def a = new org.zstack.sdk.DetachScsiLunFromHostAction() + def detachDataVolumeFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachDataVolumeFromVmAction.class) Closure c) { + def a = new org.zstack.sdk.DetachDataVolumeFromVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17729,8 +18296,8 @@ abstract class ApiHelper { } - def detachScsiLunFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachScsiLunFromVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DetachScsiLunFromVmInstanceAction() + def detachEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachEipAction.class) Closure c) { + def a = new org.zstack.sdk.DetachEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17756,8 +18323,8 @@ abstract class ApiHelper { } - def detachSecurityGroupFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachSecurityGroupFromL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.DetachSecurityGroupFromL3NetworkAction() + def detachFirewallRuleSetFromL3(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachFirewallRuleSetFromL3Action.class) Closure c) { + def a = new org.zstack.sdk.DetachFirewallRuleSetFromL3Action() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17783,8 +18350,8 @@ abstract class ApiHelper { } - def detachSshKeyPairFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachSshKeyPairFromVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.DetachSshKeyPairFromVmInstanceAction() + def detachHostFromHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachHostFromHostSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DetachHostFromHostSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17810,8 +18377,8 @@ abstract class ApiHelper { } - def detachTagFromResources(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachTagFromResourcesAction.class) Closure c) { - def a = new org.zstack.sdk.DetachTagFromResourcesAction() + def detachHybridEipFromEcs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachHybridEipFromEcsAction.class) Closure c) { + def a = new org.zstack.sdk.DetachHybridEipFromEcsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17837,8 +18404,8 @@ abstract class ApiHelper { } - def detachUsbDeviceFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachUsbDeviceFromVmAction.class) Closure c) { - def a = new org.zstack.sdk.DetachUsbDeviceFromVmAction() + def detachHybridKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachHybridKeyAction.class) Closure c) { + def a = new org.zstack.sdk.DetachHybridKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17864,8 +18431,8 @@ abstract class ApiHelper { } - def detachUserDefinedXmlHookScriptFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachUserDefinedXmlHookScriptFromVmAction.class) Closure c) { - def a = new org.zstack.sdk.DetachUserDefinedXmlHookScriptFromVmAction() + def detachIscsiServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachIscsiServerFromClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachIscsiServerFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17891,8 +18458,8 @@ abstract class ApiHelper { } - def detachVRouterRouteTableFromVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachVRouterRouteTableFromVRouterAction.class) Closure c) { - def a = new org.zstack.sdk.DetachVRouterRouteTableFromVRouterAction() + def detachIsoFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachIsoFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DetachIsoFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17918,8 +18485,8 @@ abstract class ApiHelper { } - def detachVipFromVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachVipFromVpcSharedQosAction.class) Closure c) { - def a = new org.zstack.sdk.DetachVipFromVpcSharedQosAction() + def detachL2NetworkFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachL2NetworkFromClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachL2NetworkFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17945,8 +18512,8 @@ abstract class ApiHelper { } - def detachVmFromVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachVmFromVmSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.DetachVmFromVmSchedulingRuleGroupAction() + def detachL3NetworkFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachL3NetworkFromVmAction.class) Closure c) { + def a = new org.zstack.sdk.DetachL3NetworkFromVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17972,8 +18539,8 @@ abstract class ApiHelper { } - def disableCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DisableCdpTaskAction.class) Closure c) { - def a = new org.zstack.sdk.DisableCdpTaskAction() + def detachL3NetworksFromIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachL3NetworksFromIPsecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.DetachL3NetworksFromIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -17999,8 +18566,8 @@ abstract class ApiHelper { } - def discoverExternalPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DiscoverExternalPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.DiscoverExternalPrimaryStorageAction() + def detachMdevDeviceFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachMdevDeviceFromVmAction.class) Closure c) { + def a = new org.zstack.sdk.DetachMdevDeviceFromVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18026,8 +18593,8 @@ abstract class ApiHelper { } - def downloadBackupFileFromPublicCloud(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DownloadBackupFileFromPublicCloudAction.class) Closure c) { - def a = new org.zstack.sdk.DownloadBackupFileFromPublicCloudAction() + def detachMonitorTriggerFromTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachMonitorTriggerActionFromTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.DetachMonitorTriggerActionFromTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18053,8 +18620,8 @@ abstract class ApiHelper { } - def ejectZBox(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EjectZBoxAction.class) Closure c) { - def a = new org.zstack.sdk.EjectZBoxAction() + def detachNetworkServiceFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNetworkServiceFromL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.DetachNetworkServiceFromL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18080,8 +18647,8 @@ abstract class ApiHelper { } - def enableCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EnableCdpTaskAction.class) Closure c) { - def a = new org.zstack.sdk.EnableCdpTaskAction() + def detachNicFromBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNicFromBondingAction.class) Closure c) { + def a = new org.zstack.sdk.DetachNicFromBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18107,8 +18674,8 @@ abstract class ApiHelper { } - def executeAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteAutoScalingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.ExecuteAutoScalingRuleAction() + def detachNvmeServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachNvmeServerFromClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachNvmeServerFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18134,8 +18701,8 @@ abstract class ApiHelper { } - def executeDRSScheduling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteDRSSchedulingAction.class) Closure c) { - def a = new org.zstack.sdk.ExecuteDRSSchedulingAction() + def detachOssBucketFromEcsDataCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachOssBucketFromEcsDataCenterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachOssBucketFromEcsDataCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18161,8 +18728,8 @@ abstract class ApiHelper { } - def executeGuestVmCommand(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteGuestVmCommandAction.class) Closure c) { - def a = new org.zstack.sdk.ExecuteGuestVmCommandAction() + def detachPciDeviceFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPciDeviceFromVmAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPciDeviceFromVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18188,8 +18755,8 @@ abstract class ApiHelper { } - def executeGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteGuestVmScriptAction.class) Closure c) { - def a = new org.zstack.sdk.ExecuteGuestVmScriptAction() + def detachPoliciesFromUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPoliciesFromUserAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPoliciesFromUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18215,8 +18782,8 @@ abstract class ApiHelper { } - def exportBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportBuildAppAction.class) Closure c) { - def a = new org.zstack.sdk.ExportBuildAppAction() + def detachPolicyFromUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPolicyFromUserAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPolicyFromUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18242,8 +18809,8 @@ abstract class ApiHelper { } - def exportImageFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportImageFromBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.ExportImageFromBackupStorageAction() + def detachPolicyFromUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPolicyFromUserGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPolicyFromUserGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18269,8 +18836,8 @@ abstract class ApiHelper { } - def exportVmOvaPackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportVmOvaPackageAction.class) Closure c) { - def a = new org.zstack.sdk.ExportVmOvaPackageAction() + def detachPolicyRouteRuleSetFromL3(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPolicyRouteRuleSetFromL3Action.class) Closure c) { + def a = new org.zstack.sdk.DetachPolicyRouteRuleSetFromL3Action() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18296,8 +18863,8 @@ abstract class ApiHelper { } - def expungeBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.ExpungeBaremetalInstanceAction() + def detachPortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPortForwardingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPortForwardingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18323,8 +18890,8 @@ abstract class ApiHelper { } - def expungeDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeDataVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.ExpungeDataVolumeAction() + def detachPriceTableFromAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPriceTableFromAccountAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPriceTableFromAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18350,8 +18917,8 @@ abstract class ApiHelper { } - def expungeImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeImageAction.class) Closure c) { - def a = new org.zstack.sdk.ExpungeImageAction() + def detachPrimaryStorageFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachPrimaryStorageFromClusterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachPrimaryStorageFromClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18377,8 +18944,8 @@ abstract class ApiHelper { } - def expungeVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.ExpungeVmInstanceAction() + def detachProvisionNicFromBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachProvisionNicFromBondingAction.class) Closure c) { + def a = new org.zstack.sdk.DetachProvisionNicFromBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18404,8 +18971,8 @@ abstract class ApiHelper { } - def expungeVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeVmUserDefinedXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.ExpungeVmUserDefinedXmlHookScriptAction() + def detachScsiLunFromHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachScsiLunFromHostAction.class) Closure c) { + def a = new org.zstack.sdk.DetachScsiLunFromHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18431,8 +18998,8 @@ abstract class ApiHelper { } - def failoverFaultToleranceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FailoverFaultToleranceVmAction.class) Closure c) { - def a = new org.zstack.sdk.FailoverFaultToleranceVmAction() + def detachScsiLunFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachScsiLunFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DetachScsiLunFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18458,8 +19025,8 @@ abstract class ApiHelper { } - def flattenVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FlattenVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.FlattenVmInstanceAction() + def detachSecurityGroupFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachSecurityGroupFromL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.DetachSecurityGroupFromL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18485,8 +19052,8 @@ abstract class ApiHelper { } - def flattenVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FlattenVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.FlattenVolumeAction() + def detachServiceFromObservabilityServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachServiceFromObservabilityServerAction.class) Closure c) { + def a = new org.zstack.sdk.DetachServiceFromObservabilityServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18512,8 +19079,8 @@ abstract class ApiHelper { } - def fstrimVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FstrimVmAction.class) Closure c) { - def a = new org.zstack.sdk.FstrimVmAction() + def detachSshKeyPairFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachSshKeyPairFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.DetachSshKeyPairFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18539,8 +19106,8 @@ abstract class ApiHelper { } - def gCAliyunSnapshotRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GCAliyunSnapshotRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GCAliyunSnapshotRemoteAction() + def detachTagFromResources(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachTagFromResourcesAction.class) Closure c) { + def a = new org.zstack.sdk.DetachTagFromResourcesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18566,8 +19133,8 @@ abstract class ApiHelper { } - def generateAccountBilling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateAccountBillingAction.class) Closure c) { - def a = new org.zstack.sdk.GenerateAccountBillingAction() + def detachUsbDeviceFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachUsbDeviceFromVmAction.class) Closure c) { + def a = new org.zstack.sdk.DetachUsbDeviceFromVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18593,8 +19160,8 @@ abstract class ApiHelper { } - def generateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateMdevDevicesAction.class) Closure c) { - def a = new org.zstack.sdk.GenerateMdevDevicesAction() + def detachUserDefinedXmlHookScriptFromVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachUserDefinedXmlHookScriptFromVmAction.class) Closure c) { + def a = new org.zstack.sdk.DetachUserDefinedXmlHookScriptFromVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18620,8 +19187,8 @@ abstract class ApiHelper { } - def generateSeMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSeMdevDevicesAction.class) Closure c) { - def a = new org.zstack.sdk.GenerateSeMdevDevicesAction() + def detachVRouterRouteTableFromVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachVRouterRouteTableFromVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.DetachVRouterRouteTableFromVRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18647,8 +19214,8 @@ abstract class ApiHelper { } - def generateSriovPciDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSriovPciDevicesAction.class) Closure c) { - def a = new org.zstack.sdk.GenerateSriovPciDevicesAction() + def detachVipFromVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachVipFromVpcSharedQosAction.class) Closure c) { + def a = new org.zstack.sdk.DetachVipFromVpcSharedQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18674,8 +19241,8 @@ abstract class ApiHelper { } - def generateSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSshKeyPairAction.class) Closure c) { - def a = new org.zstack.sdk.GenerateSshKeyPairAction() + def detachVmFromVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachVmFromVmSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.DetachVmFromVmSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18701,8 +19268,89 @@ abstract class ApiHelper { } - def getAccessPath(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAccessPathAction.class) Closure c) { - def a = new org.zstack.sdk.GetAccessPathAction() + def disableCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DisableCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DisableCbtTaskAction() + 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 disableCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DisableCdpTaskAction.class) Closure c) { + def a = new org.zstack.sdk.DisableCdpTaskAction() + 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 discoverExternalPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DiscoverExternalPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.DiscoverExternalPrimaryStorageAction() + 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 downloadBackupFileFromPublicCloud(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DownloadBackupFileFromPublicCloudAction.class) Closure c) { + def a = new org.zstack.sdk.DownloadBackupFileFromPublicCloudAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18728,8 +19376,8 @@ abstract class ApiHelper { } - def getAccountPriceTableRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAccountPriceTableRefAction.class) Closure c) { - def a = new org.zstack.sdk.GetAccountPriceTableRefAction() + def ejectZBox(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EjectZBoxAction.class) Closure c) { + def a = new org.zstack.sdk.EjectZBoxAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18755,8 +19403,8 @@ abstract class ApiHelper { } - def getAccountQuotaUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAccountQuotaUsageAction.class) Closure c) { - def a = new org.zstack.sdk.GetAccountQuotaUsageAction() + def enableCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EnableCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.EnableCbtTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18782,8 +19430,8 @@ abstract class ApiHelper { } - def getAliyunNasAccessGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction() + def enableCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EnableCdpTaskAction.class) Closure c) { + def a = new org.zstack.sdk.EnableCdpTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18809,8 +19457,8 @@ abstract class ApiHelper { } - def getAliyunNasFileSystemRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasFileSystemRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunNasFileSystemRemoteAction() + def executeAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteAutoScalingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.ExecuteAutoScalingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18836,8 +19484,8 @@ abstract class ApiHelper { } - def getAliyunNasMountTargetRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasMountTargetRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetAliyunNasMountTargetRemoteAction() + def executeDRSScheduling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteDRSSchedulingAction.class) Closure c) { + def a = new org.zstack.sdk.ExecuteDRSSchedulingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18863,8 +19511,8 @@ abstract class ApiHelper { } - def getAppBuildSystemCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAppBuildSystemCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetAppBuildSystemCapacityAction() + def executeGuestVmCommand(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteGuestVmCommandAction.class) Closure c) { + def a = new org.zstack.sdk.ExecuteGuestVmCommandAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18890,8 +19538,8 @@ abstract class ApiHelper { } - def getAttachablePublicL3ForVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachablePublicL3ForVRouterAction.class) Closure c) { - def a = new org.zstack.sdk.GetAttachablePublicL3ForVRouterAction() + def executeGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteGuestVmScriptAction.class) Closure c) { + def a = new org.zstack.sdk.ExecuteGuestVmScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18917,8 +19565,8 @@ abstract class ApiHelper { } - def getAttachableVpcL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachableVpcL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.GetAttachableVpcL3NetworkAction() + def exportBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportBuildAppAction.class) Closure c) { + def a = new org.zstack.sdk.ExportBuildAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18944,8 +19592,8 @@ abstract class ApiHelper { } - def getAvailableTriggers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAvailableTriggersAction.class) Closure c) { - def a = new org.zstack.sdk.GetAvailableTriggersAction() + def exportImageFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportImageFromBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.ExportImageFromBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18971,8 +19619,8 @@ abstract class ApiHelper { } - def getBackupStorageCandidatesForImageMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageCandidatesForImageMigrationAction.class) Closure c) { - def a = new org.zstack.sdk.GetBackupStorageCandidatesForImageMigrationAction() + def exportNbdVolumes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportNbdVolumesAction.class) Closure c) { + def a = new org.zstack.sdk.ExportNbdVolumesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -18998,8 +19646,8 @@ abstract class ApiHelper { } - def getBackupStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetBackupStorageCapacityAction() + def exportVmOvaPackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExportVmOvaPackageAction.class) Closure c) { + def a = new org.zstack.sdk.ExportVmOvaPackageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19025,8 +19673,8 @@ abstract class ApiHelper { } - def getBackupStorageForCreatingImageFromVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeAction() + def expungeBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19052,8 +19700,8 @@ abstract class ApiHelper { } - def getBackupStorageForCreatingImageFromVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeSnapshotAction() + def expungeDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeDataVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeDataVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19079,8 +19727,8 @@ abstract class ApiHelper { } - def getBackupStorageTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetBackupStorageTypesAction() + def expungeImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeImageAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19106,8 +19754,8 @@ abstract class ApiHelper { } - def getBareMetal2ChassisPowerStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2ChassisPowerStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetBareMetal2ChassisPowerStatusAction() + def expungeImageGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeImageGroupAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeImageGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19133,8 +19781,8 @@ abstract class ApiHelper { } - def getBareMetal2GatewayAllocatorStrategies(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2GatewayAllocatorStrategiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetBareMetal2GatewayAllocatorStrategiesAction() + def expungeVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19160,8 +19808,8 @@ abstract class ApiHelper { } - def getBareMetal2ProvisionNetworkIpAddressCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2ProvisionNetworkIpAddressCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetBareMetal2ProvisionNetworkIpAddressCapacityAction() + def expungeVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExpungeVmUserDefinedXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.ExpungeVmUserDefinedXmlHookScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19187,8 +19835,8 @@ abstract class ApiHelper { } - def getBareMetal2SupportedBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2SupportedBootModeAction.class) Closure c) { - def a = new org.zstack.sdk.GetBareMetal2SupportedBootModeAction() + def failoverFaultToleranceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FailoverFaultToleranceVmAction.class) Closure c) { + def a = new org.zstack.sdk.FailoverFaultToleranceVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19214,8 +19862,8 @@ abstract class ApiHelper { } - def getBaremetalChassisPowerStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBaremetalChassisPowerStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetBaremetalChassisPowerStatusAction() + def flattenVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FlattenVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.FlattenVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19241,8 +19889,8 @@ abstract class ApiHelper { } - def getBlockPrimaryStorageMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBlockPrimaryStorageMetadataAction.class) Closure c) { - def a = new org.zstack.sdk.GetBlockPrimaryStorageMetadataAction() + def flattenVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FlattenVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.FlattenVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19268,8 +19916,8 @@ abstract class ApiHelper { } - def getCandidateAffinityGroupForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateAffinityGroupForAttachingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateAffinityGroupForAttachingVmAction() + def fstrimVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FstrimVmAction.class) Closure c) { + def a = new org.zstack.sdk.FstrimVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19295,8 +19943,8 @@ abstract class ApiHelper { } - def getCandidateAffinityGroupForCreatingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateAffinityGroupForCreatingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateAffinityGroupForCreatingVmAction() + def gCAliyunSnapshotRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GCAliyunSnapshotRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GCAliyunSnapshotRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19322,8 +19970,8 @@ abstract class ApiHelper { } - def getCandidateBackupStorageForCreatingImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateBackupStorageForCreatingImageAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateBackupStorageForCreatingImageAction() + def generateAccountBilling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateAccountBillingAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateAccountBillingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19349,8 +19997,8 @@ abstract class ApiHelper { } - def getCandidateClustersForAttachingL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateClustersForAttachingL2NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateClustersForAttachingL2NetworkAction() + def generateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateMdevDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19376,8 +20024,8 @@ abstract class ApiHelper { } - def getCandidateInterfaceVlanIds(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateInterfaceVlanIdsAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateInterfaceVlanIdsAction() + def generateModelMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateModelMetadataAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateModelMetadataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19403,8 +20051,8 @@ abstract class ApiHelper { } - def getCandidateIsoForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateIsoForAttachingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateIsoForAttachingVmAction() + def generateSeMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSeMdevDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateSeMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19430,8 +20078,8 @@ abstract class ApiHelper { } - def getCandidateL2NetworksForAttachingCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL2NetworksForAttachingClusterAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateL2NetworksForAttachingClusterAction() + def generateSriovPciDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSriovPciDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateSriovPciDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19457,8 +20105,8 @@ abstract class ApiHelper { } - def getCandidateL3NetworksForChangeVmNicNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForChangeVmNicNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateL3NetworksForChangeVmNicNetworkAction() + def generateSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GenerateSshKeyPairAction.class) Closure c) { + def a = new org.zstack.sdk.GenerateSshKeyPairAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19484,8 +20132,8 @@ abstract class ApiHelper { } - def getCandidateL3NetworksForIpSecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForIpSecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateL3NetworksForIpSecConnectionAction() + def getAccessPath(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAccessPathAction.class) Closure c) { + def a = new org.zstack.sdk.GetAccessPathAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19511,8 +20159,8 @@ abstract class ApiHelper { } - def getCandidateL3NetworksForLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateL3NetworksForLoadBalancerAction() + def getAccountPriceTableRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAccountPriceTableRefAction.class) Closure c) { + def a = new org.zstack.sdk.GetAccountPriceTableRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19538,8 +20186,8 @@ abstract class ApiHelper { } - def getCandidateL3NetworksForServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateL3NetworksForServerGroupAction() + def getAccountQuotaUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAccountQuotaUsageAction.class) Closure c) { + def a = new org.zstack.sdk.GetAccountQuotaUsageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19565,8 +20213,8 @@ abstract class ApiHelper { } - def getCandidateLdapEntryForBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateLdapEntryForBindingAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateLdapEntryForBindingAction() + def getAliyunNasAccessGroupRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunNasAccessGroupRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19592,8 +20240,8 @@ abstract class ApiHelper { } - def getCandidateLdapEntryForIAM2Binding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateLdapEntryForIAM2BindingAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateLdapEntryForIAM2BindingAction() + def getAliyunNasFileSystemRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasFileSystemRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunNasFileSystemRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19619,8 +20267,8 @@ abstract class ApiHelper { } - def getCandidateMiniHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateMiniHostsAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateMiniHostsAction() + def getAliyunNasMountTargetRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAliyunNasMountTargetRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetAliyunNasMountTargetRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19646,8 +20294,8 @@ abstract class ApiHelper { } - def getCandidateNetworkInterfaces(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateNetworkInterfacesAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateNetworkInterfacesAction() + def getAppBuildSystemCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAppBuildSystemCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetAppBuildSystemCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19673,8 +20321,8 @@ abstract class ApiHelper { } - def getCandidatePrimaryStoragesForCreatingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmAction() + def getAttachablePublicL3ForVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachablePublicL3ForVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.GetAttachablePublicL3ForVRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19700,8 +20348,8 @@ abstract class ApiHelper { } - def getCandidateVMForAttachingAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVMForAttachingAffinityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateVMForAttachingAffinityGroupAction() + def getAttachableVpcL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAttachableVpcL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetAttachableVpcL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19727,8 +20375,8 @@ abstract class ApiHelper { } - def getCandidateVmForAttachingIso(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmForAttachingIsoAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateVmForAttachingIsoAction() + def getAvailableTriggers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAvailableTriggersAction.class) Closure c) { + def a = new org.zstack.sdk.GetAvailableTriggersAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19754,8 +20402,8 @@ abstract class ApiHelper { } - def getCandidateVmNicForSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicForSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateVmNicForSecurityGroupAction() + def getAvailableVpcL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetAvailableVpcL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetAvailableVpcL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19781,8 +20429,8 @@ abstract class ApiHelper { } - def getCandidateVmNicsForLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicsForLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateVmNicsForLoadBalancerAction() + def getBackupStorageCandidatesForImageMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageCandidatesForImageMigrationAction.class) Closure c) { + def a = new org.zstack.sdk.GetBackupStorageCandidatesForImageMigrationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19808,8 +20456,8 @@ abstract class ApiHelper { } - def getCandidateVmNicsForLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicsForLoadBalancerServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateVmNicsForLoadBalancerServerGroupAction() + def getBackupStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetBackupStorageCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19835,8 +20483,8 @@ abstract class ApiHelper { } - def getCandidateVmNicsForPortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicsForPortMirrorAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateVmNicsForPortMirrorAction() + def getBackupStorageForCreatingImageFromVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19862,8 +20510,8 @@ abstract class ApiHelper { } - def getCandidateZonesClustersHostsForCreatingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateZonesClustersHostsForCreatingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetCandidateZonesClustersHostsForCreatingVmAction() + def getBackupStorageForCreatingImageFromVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.GetBackupStorageForCreatingImageFromVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19889,8 +20537,8 @@ abstract class ApiHelper { } - def getCdpBackupStorageRequirement(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCdpBackupStorageRequirementAction.class) Closure c) { - def a = new org.zstack.sdk.GetCdpBackupStorageRequirementAction() + def getBackupStorageTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBackupStorageTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetBackupStorageTypesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19916,8 +20564,8 @@ abstract class ApiHelper { } - def getChainTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetChainTaskAction.class) Closure c) { - def a = new org.zstack.sdk.GetChainTaskAction() + def getBareMetal2ChassisPowerStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2ChassisPowerStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetBareMetal2ChassisPowerStatusAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19943,8 +20591,8 @@ abstract class ApiHelper { } - def getChronyServers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetChronyServersAction.class) Closure c) { - def a = new org.zstack.sdk.GetChronyServersAction() + def getBareMetal2GatewayAllocatorStrategies(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2GatewayAllocatorStrategiesAction.class) Closure c) { + def a = new org.zstack.sdk.GetBareMetal2GatewayAllocatorStrategiesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19970,8 +20618,8 @@ abstract class ApiHelper { } - def getClusterDRSStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetClusterDRSStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetClusterDRSStatusAction() + def getBareMetal2ProvisionNetworkIpAddressCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2ProvisionNetworkIpAddressCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetBareMetal2ProvisionNetworkIpAddressCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -19997,8 +20645,8 @@ abstract class ApiHelper { } - def getClusterHostNetworkFacts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetClusterHostNetworkFactsAction.class) Closure c) { - def a = new org.zstack.sdk.GetClusterHostNetworkFactsAction() + def getBareMetal2SupportedBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBareMetal2SupportedBootModeAction.class) Closure c) { + def a = new org.zstack.sdk.GetBareMetal2SupportedBootModeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20024,8 +20672,8 @@ abstract class ApiHelper { } - def getConnectionAccessPointFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetConnectionAccessPointFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetConnectionAccessPointFromRemoteAction() + def getBaremetalChassisPowerStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBaremetalChassisPowerStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetBaremetalChassisPowerStatusAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20051,8 +20699,8 @@ abstract class ApiHelper { } - def getConnectionBetweenL3NetworkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetConnectionBetweenL3NetworkAndAliyunVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.GetConnectionBetweenL3NetworkAndAliyunVSwitchAction() + def getBlockPrimaryStorageMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBlockPrimaryStorageMetadataAction.class) Closure c) { + def a = new org.zstack.sdk.GetBlockPrimaryStorageMetadataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20078,8 +20726,8 @@ abstract class ApiHelper { } - def getCpuMemoryCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCpuMemoryCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetCpuMemoryCapacityAction() + def getCandidateAffinityGroupForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateAffinityGroupForAttachingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateAffinityGroupForAttachingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20105,8 +20753,8 @@ abstract class ApiHelper { } - def getCreateEcsImageProgress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCreateEcsImageProgressAction.class) Closure c) { - def a = new org.zstack.sdk.GetCreateEcsImageProgressAction() + def getCandidateAffinityGroupForCreatingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateAffinityGroupForCreatingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateAffinityGroupForCreatingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20132,9 +20780,36 @@ abstract class ApiHelper { } - def getCurrentTime(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCurrentTimeAction.class) Closure c) { - def a = new org.zstack.sdk.GetCurrentTimeAction() + def getCandidateBackupStorageForCreatingImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateBackupStorageForCreatingImageAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateBackupStorageForCreatingImageAction() + 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 getCandidateClustersForAttachingL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateClustersForAttachingL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateClustersForAttachingL2NetworkAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -20159,8 +20834,8 @@ abstract class ApiHelper { } - def getDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetDataCenterFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetDataCenterFromRemoteAction() + def getCandidateInterfaceVlanIds(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateInterfaceVlanIdsAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateInterfaceVlanIdsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20186,8 +20861,8 @@ abstract class ApiHelper { } - def getDataVolumeAttachableVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetDataVolumeAttachableVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetDataVolumeAttachableVmAction() + def getCandidateIsoForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateIsoForAttachingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateIsoForAttachingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20213,8 +20888,8 @@ abstract class ApiHelper { } - def getDebugSignal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetDebugSignalAction.class) Closure c) { - def a = new org.zstack.sdk.GetDebugSignalAction() + def getCandidateL2NetworksForAttachingCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL2NetworksForAttachingClusterAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateL2NetworksForAttachingClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20240,8 +20915,8 @@ abstract class ApiHelper { } - def getEcsInstanceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEcsInstanceTypeAction.class) Closure c) { - def a = new org.zstack.sdk.GetEcsInstanceTypeAction() + def getCandidateL3NetworksForChangeVmNicNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForChangeVmNicNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateL3NetworksForChangeVmNicNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20267,8 +20942,8 @@ abstract class ApiHelper { } - def getEcsInstanceVncUrl(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEcsInstanceVncUrlAction.class) Closure c) { - def a = new org.zstack.sdk.GetEcsInstanceVncUrlAction() + def getCandidateL3NetworksForIpSecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForIpSecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateL3NetworksForIpSecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20294,8 +20969,8 @@ abstract class ApiHelper { } - def getEipAttachableVmNics(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEipAttachableVmNicsAction.class) Closure c) { - def a = new org.zstack.sdk.GetEipAttachableVmNicsAction() + def getCandidateL3NetworksForLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateL3NetworksForLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20321,8 +20996,8 @@ abstract class ApiHelper { } - def getElaborationCategories(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetElaborationCategoriesAction.class) Closure c) { - def a = new org.zstack.sdk.GetElaborationCategoriesAction() + def getCandidateL3NetworksForServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateL3NetworksForServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateL3NetworksForServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20348,8 +21023,8 @@ abstract class ApiHelper { } - def getElaborations(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetElaborationsAction.class) Closure c) { - def a = new org.zstack.sdk.GetElaborationsAction() + def getCandidateLdapEntryForBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateLdapEntryForBindingAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateLdapEntryForBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20375,8 +21050,8 @@ abstract class ApiHelper { } - def getEncryptedField(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEncryptedFieldAction.class) Closure c) { - def a = new org.zstack.sdk.GetEncryptedFieldAction() + def getCandidateLdapEntryForIAM2Binding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateLdapEntryForIAM2BindingAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateLdapEntryForIAM2BindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20402,8 +21077,8 @@ abstract class ApiHelper { } - def getExternalServices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetExternalServicesAction.class) Closure c) { - def a = new org.zstack.sdk.GetExternalServicesAction() + def getCandidateMiniHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateMiniHostsAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateMiniHostsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20429,8 +21104,8 @@ abstract class ApiHelper { } - def getFactoryModeState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFactoryModeStateAction.class) Closure c) { - def a = new org.zstack.sdk.GetFactoryModeStateAction() + def getCandidateNetworkInterfaces(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateNetworkInterfacesAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateNetworkInterfacesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20456,8 +21131,8 @@ abstract class ApiHelper { } - def getFaultToleranceVms(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFaultToleranceVmsAction.class) Closure c) { - def a = new org.zstack.sdk.GetFaultToleranceVmsAction() + def getCandidatePrimaryStoragesForCreatingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidatePrimaryStoragesForCreatingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20483,8 +21158,8 @@ abstract class ApiHelper { } - def getFlowMeterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFlowMeterRouterIdAction.class) Closure c) { - def a = new org.zstack.sdk.GetFlowMeterRouterIdAction() + def getCandidateVMForAttachingAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVMForAttachingAffinityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateVMForAttachingAffinityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20510,8 +21185,8 @@ abstract class ApiHelper { } - def getFreeIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFreeIpAction.class) Closure c) { - def a = new org.zstack.sdk.GetFreeIpAction() + def getCandidateVmForAttachingIso(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmForAttachingIsoAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateVmForAttachingIsoAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20537,8 +21212,8 @@ abstract class ApiHelper { } - def getFreeIpOfIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFreeIpOfIpRangeAction.class) Closure c) { - def a = new org.zstack.sdk.GetFreeIpOfIpRangeAction() + def getCandidateVmNicForSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicForSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateVmNicForSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20564,8 +21239,8 @@ abstract class ApiHelper { } - def getFreeIpOfL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFreeIpOfL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.GetFreeIpOfL3NetworkAction() + def getCandidateVmNicsForLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicsForLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateVmNicsForLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20591,8 +21266,8 @@ abstract class ApiHelper { } - def getGlobalConfigOptions(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGlobalConfigOptionsAction.class) Closure c) { - def a = new org.zstack.sdk.GetGlobalConfigOptionsAction() + def getCandidateVmNicsForLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicsForLoadBalancerServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateVmNicsForLoadBalancerServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20618,8 +21293,8 @@ abstract class ApiHelper { } - def getGuestOsMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGuestOsMetadataAction.class) Closure c) { - def a = new org.zstack.sdk.GetGuestOsMetadataAction() + def getCandidateVmNicsForPortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateVmNicsForPortMirrorAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateVmNicsForPortMirrorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20645,8 +21320,8 @@ abstract class ApiHelper { } - def getHostAllocatorStrategies(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostAllocatorStrategiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostAllocatorStrategiesAction() + def getCandidateZonesClustersHostsForCreatingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCandidateZonesClustersHostsForCreatingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetCandidateZonesClustersHostsForCreatingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20672,8 +21347,8 @@ abstract class ApiHelper { } - def getHostCandidatesForVmMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostCandidatesForVmMigrationAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostCandidatesForVmMigrationAction() + def getCdpBackupStorageRequirement(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCdpBackupStorageRequirementAction.class) Closure c) { + def a = new org.zstack.sdk.GetCdpBackupStorageRequirementAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20699,8 +21374,8 @@ abstract class ApiHelper { } - def getHostIommuState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostIommuStateAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostIommuStateAction() + def getChainTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetChainTaskAction.class) Closure c) { + def a = new org.zstack.sdk.GetChainTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20726,8 +21401,8 @@ abstract class ApiHelper { } - def getHostIommuStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostIommuStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostIommuStatusAction() + def getChronyServers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetChronyServersAction.class) Closure c) { + def a = new org.zstack.sdk.GetChronyServersAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20753,8 +21428,8 @@ abstract class ApiHelper { } - def getHostNUMATopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNUMATopologyAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostNUMATopologyAction() + def getClusterDRSStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetClusterDRSStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetClusterDRSStatusAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20780,8 +21455,8 @@ abstract class ApiHelper { } - def getHostNetworkFacts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNetworkFactsAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostNetworkFactsAction() + def getClusterHostNetworkFacts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetClusterHostNetworkFactsAction.class) Closure c) { + def a = new org.zstack.sdk.GetClusterHostNetworkFactsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20807,8 +21482,8 @@ abstract class ApiHelper { } - def getHostNetworkInterfaceLldp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNetworkInterfaceLldpAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostNetworkInterfaceLldpAction() + def getConnectionAccessPointFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetConnectionAccessPointFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetConnectionAccessPointFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20834,8 +21509,8 @@ abstract class ApiHelper { } - def getHostPhysicalMemoryFacts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostPhysicalMemoryFactsAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostPhysicalMemoryFactsAction() + def getConnectionBetweenL3NetworkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetConnectionBetweenL3NetworkAndAliyunVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.GetConnectionBetweenL3NetworkAndAliyunVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20861,8 +21536,8 @@ abstract class ApiHelper { } - def getHostPowerStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostPowerStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostPowerStatusAction() + def getContainerUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetContainerUsageAction.class) Closure c) { + def a = new org.zstack.sdk.GetContainerUsageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20888,8 +21563,8 @@ abstract class ApiHelper { } - def getHostResourceAllocation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostResourceAllocationAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostResourceAllocationAction() + def getCpuMemoryCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCpuMemoryCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetCpuMemoryCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20915,8 +21590,8 @@ abstract class ApiHelper { } - def getHostTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostTaskAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostTaskAction() + def getCreateEcsImageProgress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCreateEcsImageProgressAction.class) Closure c) { + def a = new org.zstack.sdk.GetCreateEcsImageProgressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20942,9 +21617,9 @@ abstract class ApiHelper { } - def getHostWebSshUrl(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostWebSshUrlAction.class) Closure c) { - def a = new org.zstack.sdk.GetHostWebSshUrlAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def getCurrentTime(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetCurrentTimeAction.class) Closure c) { + def a = new org.zstack.sdk.GetCurrentTimeAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -20969,8 +21644,8 @@ abstract class ApiHelper { } - def getHypervisorTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHypervisorTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetHypervisorTypesAction() + def getDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetDataCenterFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetDataCenterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -20996,8 +21671,8 @@ abstract class ApiHelper { } - def getIdentityZoneFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetIdentityZoneFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetIdentityZoneFromRemoteAction() + def getDataVolumeAttachableVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetDataVolumeAttachableVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetDataVolumeAttachableVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21023,8 +21698,8 @@ abstract class ApiHelper { } - def getImageCandidatesForVmToChange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetImageCandidatesForVmToChangeAction.class) Closure c) { - def a = new org.zstack.sdk.GetImageCandidatesForVmToChangeAction() + def getDebugSignal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetDebugSignalAction.class) Closure c) { + def a = new org.zstack.sdk.GetDebugSignalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21050,8 +21725,8 @@ abstract class ApiHelper { } - def getImageQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetImageQgaAction.class) Closure c) { - def a = new org.zstack.sdk.GetImageQgaAction() + def getEcsInstanceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEcsInstanceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.GetEcsInstanceTypeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21077,8 +21752,8 @@ abstract class ApiHelper { } - def getImagesFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetImagesFromImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.GetImagesFromImageStoreBackupStorageAction() + def getEcsInstanceVncUrl(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEcsInstanceVncUrlAction.class) Closure c) { + def a = new org.zstack.sdk.GetEcsInstanceVncUrlAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21104,8 +21779,8 @@ abstract class ApiHelper { } - def getInterdependentL3NetworksBackupStorages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInterdependentL3NetworksBackupStoragesAction.class) Closure c) { - def a = new org.zstack.sdk.GetInterdependentL3NetworksBackupStoragesAction() + def getEipAttachableVmNics(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEipAttachableVmNicsAction.class) Closure c) { + def a = new org.zstack.sdk.GetEipAttachableVmNicsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21131,8 +21806,8 @@ abstract class ApiHelper { } - def getInterdependentL3NetworksImages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInterdependentL3NetworksImagesAction.class) Closure c) { - def a = new org.zstack.sdk.GetInterdependentL3NetworksImagesAction() + def getElaborationCategories(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetElaborationCategoriesAction.class) Closure c) { + def a = new org.zstack.sdk.GetElaborationCategoriesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21158,8 +21833,8 @@ abstract class ApiHelper { } - def getInterfaceServiceTypeStatistic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInterfaceServiceTypeStatisticAction.class) Closure c) { - def a = new org.zstack.sdk.GetInterfaceServiceTypeStatisticAction() + def getElaborations(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetElaborationsAction.class) Closure c) { + def a = new org.zstack.sdk.GetElaborationsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21185,8 +21860,8 @@ abstract class ApiHelper { } - def getIpAddressCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetIpAddressCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetIpAddressCapacityAction() + def getEncryptedField(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetEncryptedFieldAction.class) Closure c) { + def a = new org.zstack.sdk.GetEncryptedFieldAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21212,8 +21887,8 @@ abstract class ApiHelper { } - def getL2NetworkTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL2NetworkTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetL2NetworkTypesAction() + def getExternalServices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetExternalServicesAction.class) Closure c) { + def a = new org.zstack.sdk.GetExternalServicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21239,8 +21914,8 @@ abstract class ApiHelper { } - def getL3NetworkDhcpIpAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkDhcpIpAddressAction.class) Closure c) { - def a = new org.zstack.sdk.GetL3NetworkDhcpIpAddressAction() + def getFactoryModeState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFactoryModeStateAction.class) Closure c) { + def a = new org.zstack.sdk.GetFactoryModeStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21266,8 +21941,8 @@ abstract class ApiHelper { } - def getL3NetworkIpStatistic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkIpStatisticAction.class) Closure c) { - def a = new org.zstack.sdk.GetL3NetworkIpStatisticAction() + def getFaultToleranceVms(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFaultToleranceVmsAction.class) Closure c) { + def a = new org.zstack.sdk.GetFaultToleranceVmsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21293,8 +21968,8 @@ abstract class ApiHelper { } - def getL3NetworkMtu(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkMtuAction.class) Closure c) { - def a = new org.zstack.sdk.GetL3NetworkMtuAction() + def getFlowMeterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFlowMeterRouterIdAction.class) Closure c) { + def a = new org.zstack.sdk.GetFlowMeterRouterIdAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21320,8 +21995,8 @@ abstract class ApiHelper { } - def getL3NetworkRouterInterfaceIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkRouterInterfaceIpAction.class) Closure c) { - def a = new org.zstack.sdk.GetL3NetworkRouterInterfaceIpAction() + def getFreeIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFreeIpAction.class) Closure c) { + def a = new org.zstack.sdk.GetFreeIpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21347,8 +22022,8 @@ abstract class ApiHelper { } - def getL3NetworkTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetL3NetworkTypesAction() + def getFreeIpOfIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFreeIpOfIpRangeAction.class) Closure c) { + def a = new org.zstack.sdk.GetFreeIpOfIpRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21374,8 +22049,8 @@ abstract class ApiHelper { } - def getLatestGuestToolsForVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLatestGuestToolsForVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetLatestGuestToolsForVmAction() + def getFreeIpOfL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetFreeIpOfL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetFreeIpOfL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21401,8 +22076,8 @@ abstract class ApiHelper { } - def getLdapEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLdapEntryAction.class) Closure c) { - def a = new org.zstack.sdk.GetLdapEntryAction() + def getGlobalConfigOptions(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGlobalConfigOptionsAction.class) Closure c) { + def a = new org.zstack.sdk.GetGlobalConfigOptionsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21428,8 +22103,8 @@ abstract class ApiHelper { } - def getLdapServerAvailableAttributes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLdapServerAvailableAttributesAction.class) Closure c) { - def a = new org.zstack.sdk.GetLdapServerAvailableAttributesAction() + def getGpuDeviceSpecCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGpuDeviceSpecCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.GetGpuDeviceSpecCandidatesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21455,9 +22130,36 @@ abstract class ApiHelper { } - def getLicenseAddOns(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseAddOnsAction.class) Closure c) { - def a = new org.zstack.sdk.GetLicenseAddOnsAction() + def getGuestOsMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetGuestOsMetadataAction.class) Closure c) { + def a = new org.zstack.sdk.GetGuestOsMetadataAction() + 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 getHostAllocatorStrategies(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostAllocatorStrategiesAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostAllocatorStrategiesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21482,8 +22184,8 @@ abstract class ApiHelper { } - def getLicenseCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseCapabilitiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetLicenseCapabilitiesAction() + def getHostCandidatesForVmMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostCandidatesForVmMigrationAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostCandidatesForVmMigrationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21509,9 +22211,36 @@ abstract class ApiHelper { } - def getLicenseInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseInfoAction.class) Closure c) { - def a = new org.zstack.sdk.GetLicenseInfoAction() + def getHostIommuState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostIommuStateAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostIommuStateAction() + 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 getHostIommuStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostIommuStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostIommuStatusAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21536,9 +22265,36 @@ abstract class ApiHelper { } - def getLicenseRecords(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseRecordsAction.class) Closure c) { - def a = new org.zstack.sdk.GetLicenseRecordsAction() + def getHostMultipathTopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostMultipathTopologyAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostMultipathTopologyAction() + 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 getHostNUMATopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNUMATopologyAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostNUMATopologyAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21563,8 +22319,8 @@ abstract class ApiHelper { } - def getLicenseUKeyStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseUKeyStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetLicenseUKeyStatusAction() + def getHostNetworkFacts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNetworkFactsAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostNetworkFactsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21590,8 +22346,8 @@ abstract class ApiHelper { } - def getLoadBalancerListenerACLEntries(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoadBalancerListenerACLEntriesAction.class) Closure c) { - def a = new org.zstack.sdk.GetLoadBalancerListenerACLEntriesAction() + def getHostNetworkInterfaceLldp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostNetworkInterfaceLldpAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostNetworkInterfaceLldpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21617,8 +22373,8 @@ abstract class ApiHelper { } - def getLoadBalancerOwner(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoadBalancerOwnerAction.class) Closure c) { - def a = new org.zstack.sdk.GetLoadBalancerOwnerAction() + def getHostPhysicalMemoryFacts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostPhysicalMemoryFactsAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostPhysicalMemoryFactsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21644,8 +22400,8 @@ abstract class ApiHelper { } - def getLocalRaidPhysicalDriveSmart(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLocalRaidPhysicalDriveSmartAction.class) Closure c) { - def a = new org.zstack.sdk.GetLocalRaidPhysicalDriveSmartAction() + def getHostPowerStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostPowerStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostPowerStatusAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21671,8 +22427,8 @@ abstract class ApiHelper { } - def getLocalStorageHostDiskCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLocalStorageHostDiskCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetLocalStorageHostDiskCapacityAction() + def getHostResourceAllocation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostResourceAllocationAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostResourceAllocationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21698,8 +22454,8 @@ abstract class ApiHelper { } - def getLogConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLogConfigurationAction.class) Closure c) { - def a = new org.zstack.sdk.GetLogConfigurationAction() + def getHostTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostTaskAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21725,9 +22481,9 @@ abstract class ApiHelper { } - def getLoginCaptcha(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoginCaptchaAction.class) Closure c) { - def a = new org.zstack.sdk.GetLoginCaptchaAction() - + def getHostWebSshUrl(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHostWebSshUrlAction.class) Closure c) { + def a = new org.zstack.sdk.GetHostWebSshUrlAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21752,9 +22508,9 @@ abstract class ApiHelper { } - def getLoginProcedures(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoginProceduresAction.class) Closure c) { - def a = new org.zstack.sdk.GetLoginProceduresAction() - + def getHypervisorTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetHypervisorTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetHypervisorTypesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21779,9 +22535,9 @@ abstract class ApiHelper { } - def getManagementNodeArch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetManagementNodeArchAction.class) Closure c) { - def a = new org.zstack.sdk.GetManagementNodeArchAction() - + def getIdentityZoneFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetIdentityZoneFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetIdentityZoneFromRemoteAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21806,9 +22562,9 @@ abstract class ApiHelper { } - def getManagementNodeOS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetManagementNodeOSAction.class) Closure c) { - def a = new org.zstack.sdk.GetManagementNodeOSAction() - + def getImageCandidatesForVmToChange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetImageCandidatesForVmToChangeAction.class) Closure c) { + def a = new org.zstack.sdk.GetImageCandidatesForVmToChangeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -21833,8 +22589,8 @@ abstract class ApiHelper { } - def getMdevDeviceCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMdevDeviceCandidatesAction.class) Closure c) { - def a = new org.zstack.sdk.GetMdevDeviceCandidatesAction() + def getImageQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetImageQgaAction.class) Closure c) { + def a = new org.zstack.sdk.GetImageQgaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21860,8 +22616,8 @@ abstract class ApiHelper { } - def getMdevDeviceSpecCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMdevDeviceSpecCandidatesAction.class) Closure c) { - def a = new org.zstack.sdk.GetMdevDeviceSpecCandidatesAction() + def getImagesFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetImagesFromImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.GetImagesFromImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21887,8 +22643,8 @@ abstract class ApiHelper { } - def getMemorySnapshotGroupReference(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMemorySnapshotGroupReferenceAction.class) Closure c) { - def a = new org.zstack.sdk.GetMemorySnapshotGroupReferenceAction() + def getInterdependentL3NetworksBackupStorages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInterdependentL3NetworksBackupStoragesAction.class) Closure c) { + def a = new org.zstack.sdk.GetInterdependentL3NetworksBackupStoragesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21914,8 +22670,8 @@ abstract class ApiHelper { } - def getMonitorItem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMonitorItemAction.class) Closure c) { - def a = new org.zstack.sdk.GetMonitorItemAction() + def getInterdependentL3NetworksImages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInterdependentL3NetworksImagesAction.class) Closure c) { + def a = new org.zstack.sdk.GetInterdependentL3NetworksImagesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21941,8 +22697,8 @@ abstract class ApiHelper { } - def getNetworkServiceTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetNetworkServiceTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetNetworkServiceTypesAction() + def getInterfaceServiceTypeStatistic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInterfaceServiceTypeStatisticAction.class) Closure c) { + def a = new org.zstack.sdk.GetInterfaceServiceTypeStatisticAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21968,8 +22724,8 @@ abstract class ApiHelper { } - def getNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetNicQosAction.class) Closure c) { - def a = new org.zstack.sdk.GetNicQosAction() + def getInvocationRecords(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetInvocationRecordsAction.class) Closure c) { + def a = new org.zstack.sdk.GetInvocationRecordsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -21995,8 +22751,8 @@ abstract class ApiHelper { } - def getNoTriggerSchedulerJobs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetNoTriggerSchedulerJobsAction.class) Closure c) { - def a = new org.zstack.sdk.GetNoTriggerSchedulerJobsAction() + def getIpAddressCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetIpAddressCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetIpAddressCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22022,8 +22778,8 @@ abstract class ApiHelper { } - def getOAuth2Token(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOAuth2TokenAction.class) Closure c) { - def a = new org.zstack.sdk.GetOAuth2TokenAction() + def getL2NetworkTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL2NetworkTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetL2NetworkTypesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22049,8 +22805,8 @@ abstract class ApiHelper { } - def getOssBackupBucketFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBackupBucketFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetOssBackupBucketFromRemoteAction() + def getL3NetworkDhcpIpAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkDhcpIpAddressAction.class) Closure c) { + def a = new org.zstack.sdk.GetL3NetworkDhcpIpAddressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22076,8 +22832,8 @@ abstract class ApiHelper { } - def getOssBucketFileFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBucketFileFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetOssBucketFileFromRemoteAction() + def getL3NetworkIpStatistic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkIpStatisticAction.class) Closure c) { + def a = new org.zstack.sdk.GetL3NetworkIpStatisticAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22103,8 +22859,8 @@ abstract class ApiHelper { } - def getOssBucketNameFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBucketNameFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetOssBucketNameFromRemoteAction() + def getL3NetworkMtu(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkMtuAction.class) Closure c) { + def a = new org.zstack.sdk.GetL3NetworkMtuAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22130,8 +22886,8 @@ abstract class ApiHelper { } - def getPciDeviceCandidatesForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPciDeviceCandidatesForAttachingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetPciDeviceCandidatesForAttachingVmAction() + def getL3NetworkRouterInterfaceIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkRouterInterfaceIpAction.class) Closure c) { + def a = new org.zstack.sdk.GetL3NetworkRouterInterfaceIpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22157,8 +22913,8 @@ abstract class ApiHelper { } - def getPciDeviceCandidatesForNewCreateVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPciDeviceCandidatesForNewCreateVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetPciDeviceCandidatesForNewCreateVmAction() + def getL3NetworkTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetL3NetworkTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetL3NetworkTypesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22184,8 +22940,8 @@ abstract class ApiHelper { } - def getPciDeviceSpecCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPciDeviceSpecCandidatesAction.class) Closure c) { - def a = new org.zstack.sdk.GetPciDeviceSpecCandidatesAction() + def getLatestGuestToolsForVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLatestGuestToolsForVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetLatestGuestToolsForVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22211,8 +22967,8 @@ abstract class ApiHelper { } - def getPlatformTimeZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPlatformTimeZoneAction.class) Closure c) { - def a = new org.zstack.sdk.GetPlatformTimeZoneAction() + def getLdapEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLdapEntryAction.class) Closure c) { + def a = new org.zstack.sdk.GetLdapEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22238,8 +22994,8 @@ abstract class ApiHelper { } - def getPolicyRouteRuleSetFromVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPolicyRouteRuleSetFromVirtualRouterAction.class) Closure c) { - def a = new org.zstack.sdk.GetPolicyRouteRuleSetFromVirtualRouterAction() + def getLdapServerAvailableAttributes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLdapServerAvailableAttributesAction.class) Closure c) { + def a = new org.zstack.sdk.GetLdapServerAvailableAttributesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22265,9 +23021,9 @@ abstract class ApiHelper { } - def getPortForwardingAttachableVmNics(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPortForwardingAttachableVmNicsAction.class) Closure c) { - def a = new org.zstack.sdk.GetPortForwardingAttachableVmNicsAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def getLicenseAddOns(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseAddOnsAction.class) Closure c) { + def a = new org.zstack.sdk.GetLicenseAddOnsAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22292,8 +23048,8 @@ abstract class ApiHelper { } - def getPrimaryStorageAllocatorStrategies(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageAllocatorStrategiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageAllocatorStrategiesAction() + 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 @@ -22319,9 +23075,9 @@ abstract class ApiHelper { } - def getPrimaryStorageCandidatesForVmMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageCandidatesForVmMigrationAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageCandidatesForVmMigrationAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def getLicenseInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseInfoAction.class) Closure c) { + def a = new org.zstack.sdk.GetLicenseInfoAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22346,9 +23102,9 @@ abstract class ApiHelper { } - def getPrimaryStorageCandidatesForVolumeMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageCandidatesForVolumeMigrationAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageCandidatesForVolumeMigrationAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def getLicenseRecords(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseRecordsAction.class) Closure c) { + def a = new org.zstack.sdk.GetLicenseRecordsAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22373,8 +23129,8 @@ abstract class ApiHelper { } - def getPrimaryStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageCapacityAction() + def getLicenseUKeyStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLicenseUKeyStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetLicenseUKeyStatusAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22400,8 +23156,8 @@ abstract class ApiHelper { } - def getPrimaryStorageLicenseInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageLicenseInfoAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageLicenseInfoAction() + def getLoadBalancerListenerACLEntries(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoadBalancerListenerACLEntriesAction.class) Closure c) { + def a = new org.zstack.sdk.GetLoadBalancerListenerACLEntriesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22427,8 +23183,8 @@ abstract class ApiHelper { } - def getPrimaryStorageTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageTypesAction() + def getLoadBalancerOwner(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoadBalancerOwnerAction.class) Closure c) { + def a = new org.zstack.sdk.GetLoadBalancerOwnerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22454,8 +23210,8 @@ abstract class ApiHelper { } - def getPrimaryStorageUsageReport(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageUsageReportAction.class) Closure c) { - def a = new org.zstack.sdk.GetPrimaryStorageUsageReportAction() + def getLocalRaidPhysicalDriveSmart(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLocalRaidPhysicalDriveSmartAction.class) Closure c) { + def a = new org.zstack.sdk.GetLocalRaidPhysicalDriveSmartAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22481,8 +23237,8 @@ abstract class ApiHelper { } - def getResourceAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceAccountAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceAccountAction() + def getLocalStorageHostDiskCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLocalStorageHostDiskCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetLocalStorageHostDiskCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22508,8 +23264,8 @@ abstract class ApiHelper { } - def getResourceBindableConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceBindableConfigAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceBindableConfigAction() + def getLogConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLogConfigurationAction.class) Closure c) { + def a = new org.zstack.sdk.GetLogConfigurationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22535,9 +23291,9 @@ abstract class ApiHelper { } - def getResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceConfigAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceConfigAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def getLoginCaptcha(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoginCaptchaAction.class) Closure c) { + def a = new org.zstack.sdk.GetLoginCaptchaAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22562,8 +23318,35 @@ abstract class ApiHelper { } - def getResourceConfigs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceConfigsAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceConfigsAction() + def getLoginProcedures(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetLoginProceduresAction.class) Closure c) { + def a = new org.zstack.sdk.GetLoginProceduresAction() + + 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 getMaaSUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMaaSUsageAction.class) Closure c) { + def a = new org.zstack.sdk.GetMaaSUsageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22589,8 +23372,62 @@ abstract class ApiHelper { } - def getResourceFromPublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceFromPublishAppAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceFromPublishAppAction() + def getManagementNodeArch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetManagementNodeArchAction.class) Closure c) { + def a = new org.zstack.sdk.GetManagementNodeArchAction() + + 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 getManagementNodeOS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetManagementNodeOSAction.class) Closure c) { + def a = new org.zstack.sdk.GetManagementNodeOSAction() + + 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 getMdevDeviceCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMdevDeviceCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.GetMdevDeviceCandidatesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22616,8 +23453,8 @@ abstract class ApiHelper { } - def getResourceFromResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceFromResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceFromResourceStackAction() + def getMdevDeviceSpecCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMdevDeviceSpecCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.GetMdevDeviceSpecCandidatesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22643,8 +23480,8 @@ abstract class ApiHelper { } - def getResourceNames(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceNamesAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceNamesAction() + def getMemorySnapshotGroupReference(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMemorySnapshotGroupReferenceAction.class) Closure c) { + def a = new org.zstack.sdk.GetMemorySnapshotGroupReferenceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22670,8 +23507,8 @@ abstract class ApiHelper { } - def getResourceStackFromResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceStackFromResourceAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceStackFromResourceAction() + def getModelCenterServices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetModelCenterServicesAction.class) Closure c) { + def a = new org.zstack.sdk.GetModelCenterServicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22697,8 +23534,8 @@ abstract class ApiHelper { } - def getResourceStackVmStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceStackVmStatusAction.class) Closure c) { - def a = new org.zstack.sdk.GetResourceStackVmStatusAction() + def getMonitorItem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetMonitorItemAction.class) Closure c) { + def a = new org.zstack.sdk.GetMonitorItemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22724,8 +23561,8 @@ abstract class ApiHelper { } - def getRouteTableVpcVRouterCandidate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetRouteTableVpcVRouterCandidateAction.class) Closure c) { - def a = new org.zstack.sdk.GetRouteTableVpcVRouterCandidateAction() + def getNetworkServiceTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetNetworkServiceTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetNetworkServiceTypesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22751,9 +23588,9 @@ abstract class ApiHelper { } - def getSSOClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSSOClientAction.class) Closure c) { - def a = new org.zstack.sdk.GetSSOClientAction() - + def getNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetNicQosAction.class) Closure c) { + def a = new org.zstack.sdk.GetNicQosAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22778,8 +23615,8 @@ abstract class ApiHelper { } - def getSchedulerExecutionReport(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSchedulerExecutionReportAction.class) Closure c) { - def a = new org.zstack.sdk.GetSchedulerExecutionReportAction() + def getNoTriggerSchedulerJobs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetNoTriggerSchedulerJobsAction.class) Closure c) { + def a = new org.zstack.sdk.GetNoTriggerSchedulerJobsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22805,8 +23642,8 @@ abstract class ApiHelper { } - def getScsiLunCandidatesForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetScsiLunCandidatesForAttachingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetScsiLunCandidatesForAttachingVmAction() + def getOAuth2Token(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOAuth2TokenAction.class) Closure c) { + def a = new org.zstack.sdk.GetOAuth2TokenAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22832,8 +23669,8 @@ abstract class ApiHelper { } - def getSharedBlockCandidate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSharedBlockCandidateAction.class) Closure c) { - def a = new org.zstack.sdk.GetSharedBlockCandidateAction() + def getObservabilityServerServiceData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetObservabilityServerServiceDataAction.class) Closure c) { + def a = new org.zstack.sdk.GetObservabilityServerServiceDataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22859,9 +23696,9 @@ abstract class ApiHelper { } - def getSignatureServerEncryptPublicKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction.class) Closure c) { - def a = new org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction() - + def getOssBackupBucketFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBackupBucketFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetOssBackupBucketFromRemoteAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22886,8 +23723,8 @@ abstract class ApiHelper { } - def getSpiceCertificates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSpiceCertificatesAction.class) Closure c) { - def a = new org.zstack.sdk.GetSpiceCertificatesAction() + def getOssBucketFileFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBucketFileFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetOssBucketFileFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22913,9 +23750,9 @@ abstract class ApiHelper { } - def getSupportAPIs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportAPIsAction.class) Closure c) { - def a = new org.zstack.sdk.GetSupportAPIsAction() - + def getOssBucketNameFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetOssBucketNameFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetOssBucketNameFromRemoteAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22940,8 +23777,8 @@ abstract class ApiHelper { } - def getSupportedCloudFormationResources(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportedCloudFormationResourcesAction.class) Closure c) { - def a = new org.zstack.sdk.GetSupportedCloudFormationResourcesAction() + def getPciDeviceCandidatesForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPciDeviceCandidatesForAttachingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetPciDeviceCandidatesForAttachingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -22967,9 +23804,9 @@ abstract class ApiHelper { } - def getSupportedIdentityModels(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportedIdentityModelsAction.class) Closure c) { - def a = new org.zstack.sdk.GetSupportedIdentityModelsAction() - + def getPciDeviceCandidatesForNewCreateVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPciDeviceCandidatesForNewCreateVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetPciDeviceCandidatesForNewCreateVmAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -22994,8 +23831,8 @@ abstract class ApiHelper { } - def getTaskProgress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTaskProgressAction.class) Closure c) { - def a = new org.zstack.sdk.GetTaskProgressAction() + def getPciDeviceSpecCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPciDeviceSpecCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.GetPciDeviceSpecCandidatesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23021,8 +23858,8 @@ abstract class ApiHelper { } - def getTrashOnBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTrashOnBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.GetTrashOnBackupStorageAction() + def getPlatformTimeZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPlatformTimeZoneAction.class) Closure c) { + def a = new org.zstack.sdk.GetPlatformTimeZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23048,8 +23885,8 @@ abstract class ApiHelper { } - def getTrashOnPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTrashOnPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.GetTrashOnPrimaryStorageAction() + def getPolicyRouteRuleSetFromVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPolicyRouteRuleSetFromVirtualRouterAction.class) Closure c) { + def a = new org.zstack.sdk.GetPolicyRouteRuleSetFromVirtualRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23075,9 +23912,9 @@ abstract class ApiHelper { } - def getTwoFactorAuthenticationSecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTwoFactorAuthenticationSecretAction.class) Closure c) { - def a = new org.zstack.sdk.GetTwoFactorAuthenticationSecretAction() - + def getPortForwardingAttachableVmNics(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPortForwardingAttachableVmNicsAction.class) Closure c) { + def a = new org.zstack.sdk.GetPortForwardingAttachableVmNicsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -23102,9 +23939,9 @@ abstract class ApiHelper { } - def getTwoFactorAuthenticationState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTwoFactorAuthenticationStateAction.class) Closure c) { - def a = new org.zstack.sdk.GetTwoFactorAuthenticationStateAction() - + def getPrimaryStorageAllocatorStrategies(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageAllocatorStrategiesAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageAllocatorStrategiesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -23129,8 +23966,8 @@ abstract class ApiHelper { } - def getUploadImageJobDetails(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetUploadImageJobDetailsAction.class) Closure c) { - def a = new org.zstack.sdk.GetUploadImageJobDetailsAction() + def getPrimaryStorageCandidatesForVmMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageCandidatesForVmMigrationAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageCandidatesForVmMigrationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23156,8 +23993,8 @@ abstract class ApiHelper { } - def getUsbDeviceCandidatesForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetUsbDeviceCandidatesForAttachingVmAction.class) Closure c) { - def a = new org.zstack.sdk.GetUsbDeviceCandidatesForAttachingVmAction() + def getPrimaryStorageCandidatesForVolumeMigration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageCandidatesForVolumeMigrationAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageCandidatesForVolumeMigrationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23183,8 +24020,8 @@ abstract class ApiHelper { } - def getVRouterFlowCounter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterFlowCounterAction.class) Closure c) { - def a = new org.zstack.sdk.GetVRouterFlowCounterAction() + def getPrimaryStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23210,8 +24047,8 @@ abstract class ApiHelper { } - def getVRouterOspfNeighbor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterOspfNeighborAction.class) Closure c) { - def a = new org.zstack.sdk.GetVRouterOspfNeighborAction() + def getPrimaryStorageLicenseInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageLicenseInfoAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageLicenseInfoAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23237,8 +24074,8 @@ abstract class ApiHelper { } - def getVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.GetVRouterRouteTableAction() + def getPrimaryStorageTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageTypesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23264,8 +24101,8 @@ abstract class ApiHelper { } - def getVRouterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterRouterIdAction.class) Closure c) { - def a = new org.zstack.sdk.GetVRouterRouterIdAction() + def getPrimaryStorageUsageReport(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetPrimaryStorageUsageReportAction.class) Closure c) { + def a = new org.zstack.sdk.GetPrimaryStorageUsageReportAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23291,8 +24128,8 @@ abstract class ApiHelper { } - def getVSwitchTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVSwitchTypesAction.class) Closure c) { - def a = new org.zstack.sdk.GetVSwitchTypesAction() + def getResourceAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceAccountAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23318,9 +24155,9 @@ abstract class ApiHelper { } - def getVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVersionAction.class) Closure c) { - def a = new org.zstack.sdk.GetVersionAction() - + def getResourceBindableConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceBindableConfigAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceBindableConfigAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -23345,8 +24182,8 @@ abstract class ApiHelper { } - def getVipAvailablePort(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipAvailablePortAction.class) Closure c) { - def a = new org.zstack.sdk.GetVipAvailablePortAction() + def getResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceConfigAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23372,8 +24209,8 @@ abstract class ApiHelper { } - def getVipQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipQosAction.class) Closure c) { - def a = new org.zstack.sdk.GetVipQosAction() + def getResourceConfigs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceConfigsAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceConfigsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23399,8 +24236,8 @@ abstract class ApiHelper { } - def getVipUsedPorts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipUsedPortsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVipUsedPortsAction() + def getResourceFromPublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceFromPublishAppAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceFromPublishAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23426,8 +24263,8 @@ abstract class ApiHelper { } - def getVirtualRouterSoftwareVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVirtualRouterSoftwareVersionAction.class) Closure c) { - def a = new org.zstack.sdk.GetVirtualRouterSoftwareVersionAction() + def getResourceFromResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceFromResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceFromResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23453,8 +24290,8 @@ abstract class ApiHelper { } - def getVirtualizerInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVirtualizerInfoAction.class) Closure c) { - def a = new org.zstack.sdk.GetVirtualizerInfoAction() + def getResourceNames(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceNamesAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceNamesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23480,8 +24317,8 @@ abstract class ApiHelper { } - def getVmAttachableDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmAttachableDataVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmAttachableDataVolumeAction() + def getResourceStackFromResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceStackFromResourceAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceStackFromResourceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23507,8 +24344,8 @@ abstract class ApiHelper { } - def getVmAttachableL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmAttachableL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmAttachableL3NetworkAction() + def getResourceStackVmStatus(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetResourceStackVmStatusAction.class) Closure c) { + def a = new org.zstack.sdk.GetResourceStackVmStatusAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23534,8 +24371,8 @@ abstract class ApiHelper { } - def getVmBootOrder(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmBootOrderAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmBootOrderAction() + def getRouteTableVpcVRouterCandidate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetRouteTableVpcVRouterCandidateAction.class) Closure c) { + def a = new org.zstack.sdk.GetRouteTableVpcVRouterCandidateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23561,9 +24398,9 @@ abstract class ApiHelper { } - def getVmCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmCapabilitiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmCapabilitiesAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def getSSOClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSSOClientAction.class) Closure c) { + def a = new org.zstack.sdk.GetSSOClientAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -23588,8 +24425,8 @@ abstract class ApiHelper { } - def getVmConsoleAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmConsoleAddressAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmConsoleAddressAction() + def getSchedulerExecutionReport(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSchedulerExecutionReportAction.class) Closure c) { + def a = new org.zstack.sdk.GetSchedulerExecutionReportAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23615,8 +24452,8 @@ abstract class ApiHelper { } - def getVmConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmConsolePasswordAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmConsolePasswordAction() + def getScsiLunCandidatesForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetScsiLunCandidatesForAttachingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetScsiLunCandidatesForAttachingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23642,8 +24479,8 @@ abstract class ApiHelper { } - def getVmDeviceAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmDeviceAddressAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmDeviceAddressAction() + def getSharedBlockCandidate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSharedBlockCandidateAction.class) Closure c) { + def a = new org.zstack.sdk.GetSharedBlockCandidateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23669,8 +24506,35 @@ abstract class ApiHelper { } - def getVmEmulatorPinning(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmEmulatorPinningAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmEmulatorPinningAction() + def getSignatureServerEncryptPublicKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction.class) Closure c) { + def a = new org.zstack.sdk.GetSignatureServerEncryptPublicKeyAction() + + 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 getSpiceCertificates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSpiceCertificatesAction.class) Closure c) { + def a = new org.zstack.sdk.GetSpiceCertificatesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23696,8 +24560,35 @@ abstract class ApiHelper { } - def getVmGuestToolsInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmGuestToolsInfoAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmGuestToolsInfoAction() + def getSupportAPIs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportAPIsAction.class) Closure c) { + def a = new org.zstack.sdk.GetSupportAPIsAction() + + 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 getSupportedCloudFormationResources(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportedCloudFormationResourcesAction.class) Closure c) { + def a = new org.zstack.sdk.GetSupportedCloudFormationResourcesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23723,8 +24614,35 @@ abstract class ApiHelper { } - def getVmHostname(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmHostnameAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmHostnameAction() + def getSupportedIdentityModels(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetSupportedIdentityModelsAction.class) Closure c) { + def a = new org.zstack.sdk.GetSupportedIdentityModelsAction() + + 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 getTaskProgress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTaskProgressAction.class) Closure c) { + def a = new org.zstack.sdk.GetTaskProgressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23750,8 +24668,8 @@ abstract class ApiHelper { } - def getVmInstanceFirstBootDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceFirstBootDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmInstanceFirstBootDeviceAction() + def getTrashOnBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTrashOnBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.GetTrashOnBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23777,8 +24695,8 @@ abstract class ApiHelper { } - def getVmInstanceHaLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceHaLevelAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmInstanceHaLevelAction() + def getTrashOnPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTrashOnPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.GetTrashOnPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23804,8 +24722,62 @@ abstract class ApiHelper { } - def getVmInstanceProtectedRecoveryPoints(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceProtectedRecoveryPointsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmInstanceProtectedRecoveryPointsAction() + def getTwoFactorAuthenticationSecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTwoFactorAuthenticationSecretAction.class) Closure c) { + def a = new org.zstack.sdk.GetTwoFactorAuthenticationSecretAction() + + 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 getTwoFactorAuthenticationState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetTwoFactorAuthenticationStateAction.class) Closure c) { + def a = new org.zstack.sdk.GetTwoFactorAuthenticationStateAction() + + 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 getUploadImageJobDetails(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetUploadImageJobDetailsAction.class) Closure c) { + def a = new org.zstack.sdk.GetUploadImageJobDetailsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23831,8 +24803,8 @@ abstract class ApiHelper { } - def getVmInstanceRecoveryPoints(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceRecoveryPointsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmInstanceRecoveryPointsAction() + def getUsbDeviceCandidatesForAttachingVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetUsbDeviceCandidatesForAttachingVmAction.class) Closure c) { + def a = new org.zstack.sdk.GetUsbDeviceCandidatesForAttachingVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23858,8 +24830,8 @@ abstract class ApiHelper { } - def getVmMigrationCandidateHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmMigrationCandidateHostsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmMigrationCandidateHostsAction() + def getVRouterFlowCounter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterFlowCounterAction.class) Closure c) { + def a = new org.zstack.sdk.GetVRouterFlowCounterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23885,8 +24857,8 @@ abstract class ApiHelper { } - def getVmMonitorNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmMonitorNumberAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmMonitorNumberAction() + def getVRouterOspfNeighbor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterOspfNeighborAction.class) Closure c) { + def a = new org.zstack.sdk.GetVRouterOspfNeighborAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23912,8 +24884,8 @@ abstract class ApiHelper { } - def getVmNicAttachableEips(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmNicAttachableEipsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmNicAttachableEipsAction() + def getVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.GetVRouterRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23939,8 +24911,8 @@ abstract class ApiHelper { } - def getVmNicAttachedNetworkService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmNicAttachedNetworkServiceAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmNicAttachedNetworkServiceAction() + def getVRouterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVRouterRouterIdAction.class) Closure c) { + def a = new org.zstack.sdk.GetVRouterRouterIdAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23966,8 +24938,8 @@ abstract class ApiHelper { } - def getVmNuma(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmNumaAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmNumaAction() + def getVSwitchTypes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVSwitchTypesAction.class) Closure c) { + def a = new org.zstack.sdk.GetVSwitchTypesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -23993,8 +24965,35 @@ abstract class ApiHelper { } - def getVmQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmQgaAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmQgaAction() + def getVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVersionAction.class) Closure c) { + def a = new org.zstack.sdk.GetVersionAction() + + 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 getVfPciDeviceAvailableInL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetVfPciDeviceAvailableInL2NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24020,8 +25019,8 @@ abstract class ApiHelper { } - def getVmRDP(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmRDPAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmRDPAction() + def getVipAvailablePort(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipAvailablePortAction.class) Closure c) { + def a = new org.zstack.sdk.GetVipAvailablePortAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24047,8 +25046,8 @@ abstract class ApiHelper { } - def getVmSchedulingRulesExecuteState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmSchedulingRulesExecuteStateAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmSchedulingRulesExecuteStateAction() + def getVipQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipQosAction.class) Closure c) { + def a = new org.zstack.sdk.GetVipQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24074,8 +25073,8 @@ abstract class ApiHelper { } - def getVmSshKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmSshKeyAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmSshKeyAction() + def getVipUsedPorts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVipUsedPortsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVipUsedPortsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24101,8 +25100,8 @@ abstract class ApiHelper { } - def getVmStartingCandidateClustersHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmStartingCandidateClustersHostsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmStartingCandidateClustersHostsAction() + def getVirtualRouterSoftwareVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVirtualRouterSoftwareVersionAction.class) Closure c) { + def a = new org.zstack.sdk.GetVirtualRouterSoftwareVersionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24128,8 +25127,8 @@ abstract class ApiHelper { } - def getVmTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmTaskAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmTaskAction() + def getVirtualizerInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVirtualizerInfoAction.class) Closure c) { + def a = new org.zstack.sdk.GetVirtualizerInfoAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24155,8 +25154,8 @@ abstract class ApiHelper { } - def getVmUsbRedirect(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmUsbRedirectAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmUsbRedirectAction() + def getVmAttachableDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmAttachableDataVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmAttachableDataVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24182,8 +25181,8 @@ abstract class ApiHelper { } - def getVmXml(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmXmlAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmXmlAction() + def getVmAttachableL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmAttachableL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmAttachableL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24209,8 +25208,8 @@ abstract class ApiHelper { } - def getVmXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmXmlHookScriptAction() + def getVmBootOrder(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmBootOrderAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmBootOrderAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24236,8 +25235,8 @@ abstract class ApiHelper { } - def getVmsCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmsCapabilitiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmsCapabilitiesAction() + def getVmCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmCapabilitiesAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmCapabilitiesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24263,8 +25262,8 @@ abstract class ApiHelper { } - def getVmsSchedulingStateFromSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmsSchedulingStateFromSchedulingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmsSchedulingStateFromSchedulingRuleAction() + def getVmConsoleAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmConsoleAddressAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmConsoleAddressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24290,8 +25289,8 @@ abstract class ApiHelper { } - def getVmvNUMATopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmvNUMATopologyAction.class) Closure c) { - def a = new org.zstack.sdk.GetVmvNUMATopologyAction() + def getVmConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmConsolePasswordAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmConsolePasswordAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24317,8 +25316,8 @@ abstract class ApiHelper { } - def getVolumeCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeCapabilitiesAction.class) Closure c) { - def a = new org.zstack.sdk.GetVolumeCapabilitiesAction() + def getVmDeviceAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmDeviceAddressAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmDeviceAddressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24344,8 +25343,8 @@ abstract class ApiHelper { } - def getVolumeFormat(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeFormatAction.class) Closure c) { - def a = new org.zstack.sdk.GetVolumeFormatAction() + def getVmEmulatorPinning(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmEmulatorPinningAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmEmulatorPinningAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24371,8 +25370,8 @@ abstract class ApiHelper { } - def getVolumeIoThreadPin(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeIoThreadPinAction.class) Closure c) { - def a = new org.zstack.sdk.GetVolumeIoThreadPinAction() + def getVmGuestToolsInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmGuestToolsInfoAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmGuestToolsInfoAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24398,8 +25397,8 @@ abstract class ApiHelper { } - def getVolumeQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeQosAction.class) Closure c) { - def a = new org.zstack.sdk.GetVolumeQosAction() + def getVmHostname(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmHostnameAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmHostnameAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24425,8 +25424,8 @@ abstract class ApiHelper { } - def getVolumeSnapshotSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeSnapshotSizeAction.class) Closure c) { - def a = new org.zstack.sdk.GetVolumeSnapshotSizeAction() + def getVmInstanceFirstBootDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceFirstBootDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmInstanceFirstBootDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24452,8 +25451,8 @@ abstract class ApiHelper { } - def getVpcAttachedEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedEipAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedEipAction() + def getVmInstanceHaLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceHaLevelAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmInstanceHaLevelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24479,8 +25478,8 @@ abstract class ApiHelper { } - def getVpcAttachedIpsec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedIpsecAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedIpsecAction() + def getVmInstanceProtectedRecoveryPoints(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceProtectedRecoveryPointsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmInstanceProtectedRecoveryPointsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24506,8 +25505,8 @@ abstract class ApiHelper { } - def getVpcAttachedLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedLoadBalancerAction() + def getVmInstanceRecoveryPoints(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmInstanceRecoveryPointsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmInstanceRecoveryPointsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24533,8 +25532,8 @@ abstract class ApiHelper { } - def getVpcAttachedNetflow(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedNetflowAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedNetflowAction() + def getVmMigrationCandidateHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmMigrationCandidateHostsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmMigrationCandidateHostsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24560,8 +25559,8 @@ abstract class ApiHelper { } - def getVpcAttachedOspf(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedOspfAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedOspfAction() + def getVmMonitorNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmMonitorNumberAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmMonitorNumberAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24587,8 +25586,62 @@ abstract class ApiHelper { } - def getVpcAttachedPortForwardingRules(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedPortForwardingRulesAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedPortForwardingRulesAction() + def getVmNicAttachableEips(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmNicAttachableEipsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmNicAttachableEipsAction() + 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 getVmNicAttachedNetworkService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmNicAttachedNetworkServiceAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmNicAttachedNetworkServiceAction() + 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 getVmNuma(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmNumaAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmNumaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24614,8 +25667,8 @@ abstract class ApiHelper { } - def getVpcAttachedVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedVipAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcAttachedVipAction() + def getVmQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmQgaAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmQgaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24641,8 +25694,8 @@ abstract class ApiHelper { } - def getVpcIPsecLog(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcIPsecLogAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcIPsecLogAction() + def getVmRDP(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmRDPAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmRDPAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24668,8 +25721,8 @@ abstract class ApiHelper { } - def getVpcMulticastRoute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcMulticastRouteAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcMulticastRouteAction() + def getVmSchedulingRulesExecuteState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmSchedulingRulesExecuteStateAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmSchedulingRulesExecuteStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24695,8 +25748,8 @@ abstract class ApiHelper { } - def getVpcVRouterDistributedRoutingConnections(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterDistributedRoutingConnectionsAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcVRouterDistributedRoutingConnectionsAction() + def getVmSshKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmSshKeyAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmSshKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24722,8 +25775,8 @@ abstract class ApiHelper { } - def getVpcVRouterDistributedRoutingEnabled(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterDistributedRoutingEnabledAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcVRouterDistributedRoutingEnabledAction() + def getVmStartingCandidateClustersHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmStartingCandidateClustersHostsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmStartingCandidateClustersHostsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24749,8 +25802,8 @@ abstract class ApiHelper { } - def getVpcVRouterNetworkServiceState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterNetworkServiceStateAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcVRouterNetworkServiceStateAction() + def getVmTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmTaskAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24776,8 +25829,8 @@ abstract class ApiHelper { } - def getVpcVpnConfigurationFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVpnConfigurationFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.GetVpcVpnConfigurationFromRemoteAction() + def getVmUsbRedirect(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmUsbRedirectAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmUsbRedirectAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24803,8 +25856,8 @@ abstract class ApiHelper { } - def getZBoxBackupDetails(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetZBoxBackupDetailsAction.class) Closure c) { - def a = new org.zstack.sdk.GetZBoxBackupDetailsAction() + def getVmXml(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmXmlAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmXmlAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24830,8 +25883,8 @@ abstract class ApiHelper { } - def getZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetZoneAction.class) Closure c) { - def a = new org.zstack.sdk.GetZoneAction() + def getVmXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmXmlHookScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24857,8 +25910,8 @@ abstract class ApiHelper { } - def identifyHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IdentifyHostAction.class) Closure c) { - def a = new org.zstack.sdk.IdentifyHostAction() + def getVmsCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmsCapabilitiesAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmsCapabilitiesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24884,8 +25937,8 @@ abstract class ApiHelper { } - def inspectBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.InspectBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.InspectBareMetal2ChassisAction() + def getVmsSchedulingStateFromSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmsSchedulingStateFromSchedulingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmsSchedulingStateFromSchedulingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24911,8 +25964,8 @@ abstract class ApiHelper { } - def inspectBareMetal2ChassisByInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.InspectBareMetal2ChassisByInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.InspectBareMetal2ChassisByInstanceAction() + def getVmvNUMATopology(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVmvNUMATopologyAction.class) Closure c) { + def a = new org.zstack.sdk.GetVmvNUMATopologyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24938,8 +25991,8 @@ abstract class ApiHelper { } - def inspectBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.InspectBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.InspectBaremetalChassisAction() + def getVolumeCapabilities(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeCapabilitiesAction.class) Closure c) { + def a = new org.zstack.sdk.GetVolumeCapabilitiesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -24965,62 +26018,8 @@ abstract class ApiHelper { } - def isOpensourceVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IsOpensourceVersionAction.class) Closure c) { - def a = new org.zstack.sdk.IsOpensourceVersionAction() - - 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 isReadyToGo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IsReadyToGoAction.class) Closure c) { - def a = new org.zstack.sdk.IsReadyToGoAction() - - 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 isVfNicAvailableInL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IsVfNicAvailableInL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.IsVfNicAvailableInL3NetworkAction() + def getVolumeFormat(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeFormatAction.class) Closure c) { + def a = new org.zstack.sdk.GetVolumeFormatAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25046,8 +26045,8 @@ abstract class ApiHelper { } - def kvmRunShell(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.KvmRunShellAction.class) Closure c) { - def a = new org.zstack.sdk.KvmRunShellAction() + def getVolumeIoThreadPin(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeIoThreadPinAction.class) Closure c) { + def a = new org.zstack.sdk.GetVolumeIoThreadPinAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25073,8 +26072,8 @@ abstract class ApiHelper { } - def listVMsFromKVMHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ListVMsFromKVMHostAction.class) Closure c) { - def a = new org.zstack.sdk.ListVMsFromKVMHostAction() + def getVolumeQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeQosAction.class) Closure c) { + def a = new org.zstack.sdk.GetVolumeQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25100,8 +26099,8 @@ abstract class ApiHelper { } - def listVmSchedulingRulesFromExecuteState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ListVmSchedulingRulesFromExecuteStateAction.class) Closure c) { - def a = new org.zstack.sdk.ListVmSchedulingRulesFromExecuteStateAction() + def getVolumeSnapshotSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVolumeSnapshotSizeAction.class) Closure c) { + def a = new org.zstack.sdk.GetVolumeSnapshotSizeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25127,8 +26126,8 @@ abstract class ApiHelper { } - def listVmsFromSchedulingState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ListVmsFromSchedulingStateAction.class) Closure c) { - def a = new org.zstack.sdk.ListVmsFromSchedulingStateAction() + def getVpcAttachedEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedEipAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25154,8 +26153,8 @@ abstract class ApiHelper { } - def localStorageGetVolumeMigratableHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocalStorageGetVolumeMigratableHostsAction.class) Closure c) { - def a = new org.zstack.sdk.LocalStorageGetVolumeMigratableHostsAction() + def getVpcAttachedIpsec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedIpsecAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedIpsecAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25181,8 +26180,8 @@ abstract class ApiHelper { } - def localStorageMigrateVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocalStorageMigrateVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.LocalStorageMigrateVolumeAction() + def getVpcAttachedLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25208,8 +26207,8 @@ abstract class ApiHelper { } - def locateHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocateHostNetworkInterfaceAction.class) Closure c) { - def a = new org.zstack.sdk.LocateHostNetworkInterfaceAction() + def getVpcAttachedNetflow(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedNetflowAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedNetflowAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25235,8 +26234,8 @@ abstract class ApiHelper { } - def locateLocalRaidPhysicalDrive(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocateLocalRaidPhysicalDriveAction.class) Closure c) { - def a = new org.zstack.sdk.LocateLocalRaidPhysicalDriveAction() + def getVpcAttachedOspf(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedOspfAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedOspfAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25262,36 +26261,9 @@ abstract class ApiHelper { } - def logIn(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInAction.class) Closure c) { - def a = new org.zstack.sdk.LogInAction() - - 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 logInByAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInByAccountAction.class) Closure c) { - def a = new org.zstack.sdk.LogInByAccountAction() - + def getVpcAttachedPortForwardingRules(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedPortForwardingRulesAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedPortForwardingRulesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25316,9 +26288,9 @@ abstract class ApiHelper { } - def logInByLdap(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInByLdapAction.class) Closure c) { - def a = new org.zstack.sdk.LogInByLdapAction() - + def getVpcAttachedVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcAttachedVipAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcAttachedVipAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25343,9 +26315,9 @@ abstract class ApiHelper { } - def logInByUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInByUserAction.class) Closure c) { - def a = new org.zstack.sdk.LogInByUserAction() - + def getVpcIPsecLog(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcIPsecLogAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcIPsecLogAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25370,9 +26342,9 @@ abstract class ApiHelper { } - def logOut(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogOutAction.class) Closure c) { - def a = new org.zstack.sdk.LogOutAction() - + def getVpcMulticastRoute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcMulticastRouteAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcMulticastRouteAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25397,9 +26369,9 @@ abstract class ApiHelper { } - def loginByCas(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LoginByCasAction.class) Closure c) { - def a = new org.zstack.sdk.LoginByCasAction() - + def getVpcVRouterDistributedRoutingConnections(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterDistributedRoutingConnectionsAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcVRouterDistributedRoutingConnectionsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25424,9 +26396,9 @@ abstract class ApiHelper { } - def loginIAM2VirtualIDWithLdap(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LoginIAM2VirtualIDWithLdapAction.class) Closure c) { - def a = new org.zstack.sdk.LoginIAM2VirtualIDWithLdapAction() - + def getVpcVRouterDistributedRoutingEnabled(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterDistributedRoutingEnabledAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcVRouterDistributedRoutingEnabledAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25451,8 +26423,8 @@ abstract class ApiHelper { } - def mergeDataOnBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MergeDataOnBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.MergeDataOnBackupStorageAction() + def getVpcVRouterNetworkServiceState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVRouterNetworkServiceStateAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcVRouterNetworkServiceStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25478,8 +26450,8 @@ abstract class ApiHelper { } - def migrateVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MigrateVmAction.class) Closure c) { - def a = new org.zstack.sdk.MigrateVmAction() + def getVpcVpnConfigurationFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetVpcVpnConfigurationFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.GetVpcVpnConfigurationFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25505,8 +26477,8 @@ abstract class ApiHelper { } - def mountVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MountVmInstanceRecoveryPointAction.class) Closure c) { - def a = new org.zstack.sdk.MountVmInstanceRecoveryPointAction() + def getZBoxBackupDetails(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetZBoxBackupDetailsAction.class) Closure c) { + def a = new org.zstack.sdk.GetZBoxBackupDetailsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25532,8 +26504,8 @@ abstract class ApiHelper { } - def moveDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MoveDirectoryAction.class) Closure c) { - def a = new org.zstack.sdk.MoveDirectoryAction() + def getZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetZoneAction.class) Closure c) { + def a = new org.zstack.sdk.GetZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25559,8 +26531,8 @@ abstract class ApiHelper { } - def moveResourcesToDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MoveResourcesToDirectoryAction.class) Closure c) { - def a = new org.zstack.sdk.MoveResourcesToDirectoryAction() + def identifyHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IdentifyHostAction.class) Closure c) { + def a = new org.zstack.sdk.IdentifyHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25586,8 +26558,8 @@ abstract class ApiHelper { } - def parseOvf(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ParseOvfAction.class) Closure c) { - def a = new org.zstack.sdk.ParseOvfAction() + 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 c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25613,8 +26585,8 @@ abstract class ApiHelper { } - def pauseVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PauseVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.PauseVmInstanceAction() + def inspectBareMetal2ChassisByInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.InspectBareMetal2ChassisByInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.InspectBareMetal2ChassisByInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25640,8 +26612,8 @@ abstract class ApiHelper { } - def powerOffBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOffBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.PowerOffBareMetal2ChassisAction() + def inspectBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.InspectBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.InspectBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25667,9 +26639,9 @@ abstract class ApiHelper { } - def powerOffBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOffBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.PowerOffBaremetalChassisAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def isOpensourceVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IsOpensourceVersionAction.class) Closure c) { + def a = new org.zstack.sdk.IsOpensourceVersionAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25694,9 +26666,9 @@ abstract class ApiHelper { } - def powerOffHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOffHostAction.class) Closure c) { - def a = new org.zstack.sdk.PowerOffHostAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def isReadyToGo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IsReadyToGoAction.class) Closure c) { + def a = new org.zstack.sdk.IsReadyToGoAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -25721,8 +26693,8 @@ abstract class ApiHelper { } - def powerOnBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOnBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.PowerOnBareMetal2ChassisAction() + def isVfNicAvailableInL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.IsVfNicAvailableInL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.IsVfNicAvailableInL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25748,8 +26720,8 @@ abstract class ApiHelper { } - def powerOnBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOnBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.PowerOnBaremetalChassisAction() + def kvmRunShell(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.KvmRunShellAction.class) Closure c) { + def a = new org.zstack.sdk.KvmRunShellAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25775,8 +26747,8 @@ abstract class ApiHelper { } - def powerOnHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOnHostAction.class) Closure c) { - def a = new org.zstack.sdk.PowerOnHostAction() + def listVMsFromKVMHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ListVMsFromKVMHostAction.class) Closure c) { + def a = new org.zstack.sdk.ListVMsFromKVMHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25802,8 +26774,8 @@ abstract class ApiHelper { } - def powerResetBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerResetBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.PowerResetBareMetal2ChassisAction() + def listVmSchedulingRulesFromExecuteState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ListVmSchedulingRulesFromExecuteStateAction.class) Closure c) { + def a = new org.zstack.sdk.ListVmSchedulingRulesFromExecuteStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25829,8 +26801,8 @@ abstract class ApiHelper { } - def powerResetBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerResetBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.PowerResetBaremetalChassisAction() + def listVmsFromSchedulingState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ListVmsFromSchedulingStateAction.class) Closure c) { + def a = new org.zstack.sdk.ListVmsFromSchedulingStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25856,8 +26828,8 @@ abstract class ApiHelper { } - def powerResetHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerResetHostAction.class) Closure c) { - def a = new org.zstack.sdk.PowerResetHostAction() + def localStorageGetVolumeMigratableHosts(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocalStorageGetVolumeMigratableHostsAction.class) Closure c) { + def a = new org.zstack.sdk.LocalStorageGetVolumeMigratableHostsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25883,8 +26855,8 @@ abstract class ApiHelper { } - def previewResourceFromApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PreviewResourceFromAppAction.class) Closure c) { - def a = new org.zstack.sdk.PreviewResourceFromAppAction() + def localStorageMigrateVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocalStorageMigrateVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.LocalStorageMigrateVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25910,8 +26882,8 @@ abstract class ApiHelper { } - def previewResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PreviewResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.PreviewResourceStackAction() + def locateHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocateHostNetworkInterfaceAction.class) Closure c) { + def a = new org.zstack.sdk.LocateHostNetworkInterfaceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25937,8 +26909,8 @@ abstract class ApiHelper { } - def primaryStorageMigrateVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrimaryStorageMigrateVmAction.class) Closure c) { - def a = new org.zstack.sdk.PrimaryStorageMigrateVmAction() + def locateLocalRaidPhysicalDrive(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LocateLocalRaidPhysicalDriveAction.class) Closure c) { + def a = new org.zstack.sdk.LocateLocalRaidPhysicalDriveAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -25964,36 +26936,9 @@ abstract class ApiHelper { } - def primaryStorageMigrateVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrimaryStorageMigrateVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.PrimaryStorageMigrateVolumeAction() - 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") - } + def logIn(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInAction.class) Closure c) { + def a = new org.zstack.sdk.LogInAction() - return out - } else { - return errorOut(a.call()) - } - } - - - def prometheusQueryLabelValues(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryLabelValuesAction.class) Closure c) { - def a = new org.zstack.sdk.PrometheusQueryLabelValuesAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26018,9 +26963,9 @@ abstract class ApiHelper { } - def prometheusQueryMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryMetadataAction.class) Closure c) { - def a = new org.zstack.sdk.PrometheusQueryMetadataAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def logInByAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInByAccountAction.class) Closure c) { + def a = new org.zstack.sdk.LogInByAccountAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26045,9 +26990,9 @@ abstract class ApiHelper { } - def prometheusQueryPassThrough(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryPassThroughAction.class) Closure c) { - def a = new org.zstack.sdk.PrometheusQueryPassThroughAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def logInByLdap(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInByLdapAction.class) Closure c) { + def a = new org.zstack.sdk.LogInByLdapAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26072,9 +27017,9 @@ abstract class ApiHelper { } - def prometheusQueryVmMonitoringData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryVmMonitoringDataAction.class) Closure c) { - def a = new org.zstack.sdk.PrometheusQueryVmMonitoringDataAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def logInByUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogInByUserAction.class) Closure c) { + def a = new org.zstack.sdk.LogInByUserAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26099,9 +27044,9 @@ abstract class ApiHelper { } - def protectVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProtectVmInstanceRecoveryPointAction.class) Closure c) { - def a = new org.zstack.sdk.ProtectVmInstanceRecoveryPointAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def logOut(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LogOutAction.class) Closure c) { + def a = new org.zstack.sdk.LogOutAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26126,9 +27071,9 @@ abstract class ApiHelper { } - def provisionSlbInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionSlbInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.ProvisionSlbInstanceAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def loginByCas(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LoginByCasAction.class) Closure c) { + def a = new org.zstack.sdk.LoginByCasAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26153,9 +27098,9 @@ abstract class ApiHelper { } - def provisionVirtualRouterConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionVirtualRouterConfigAction.class) Closure c) { - def a = new org.zstack.sdk.ProvisionVirtualRouterConfigAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def loginIAM2VirtualIDWithLdap(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.LoginIAM2VirtualIDWithLdapAction.class) Closure c) { + def a = new org.zstack.sdk.LoginIAM2VirtualIDWithLdapAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -26180,8 +27125,8 @@ abstract class ApiHelper { } - def publishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PublishAppAction.class) Closure c) { - def a = new org.zstack.sdk.PublishAppAction() + def matchModelServiceTemplateWithModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MatchModelServiceTemplateWithModelAction.class) Closure c) { + def a = new org.zstack.sdk.MatchModelServiceTemplateWithModelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -26207,8 +27152,8 @@ abstract class ApiHelper { } - def pushLicenseAddOnsUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PushLicenseAddOnsUsageAction.class) Closure c) { - def a = new org.zstack.sdk.PushLicenseAddOnsUsageAction() + def mergeDataOnBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MergeDataOnBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.MergeDataOnBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -26234,15 +27179,13 @@ abstract class ApiHelper { } - def queryAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccessControlListAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccessControlListAction() + def migrateVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MigrateVmAction.class) Closure c) { + def a = new org.zstack.sdk.MigrateVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26263,15 +27206,13 @@ abstract class ApiHelper { } - def queryAccessControlRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccessControlRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccessControlRuleAction() + def mountVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MountVmInstanceRecoveryPointAction.class) Closure c) { + def a = new org.zstack.sdk.MountVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26292,15 +27233,13 @@ abstract class ApiHelper { } - def queryAccessKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccessKeyAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccessKeyAction() + def moveDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MoveDirectoryAction.class) Closure c) { + def a = new org.zstack.sdk.MoveDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26321,15 +27260,13 @@ abstract class ApiHelper { } - def queryAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccountAction() + def moveResourcesToDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.MoveResourcesToDirectoryAction.class) Closure c) { + def a = new org.zstack.sdk.MoveResourcesToDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26350,15 +27287,13 @@ abstract class ApiHelper { } - def queryAccountBilling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountBillingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccountBillingAction() + def parseOvf(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ParseOvfAction.class) Closure c) { + def a = new org.zstack.sdk.ParseOvfAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26379,15 +27314,13 @@ abstract class ApiHelper { } - def queryAccountPriceTableRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountPriceTableRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccountPriceTableRefAction() + def pauseVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PauseVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.PauseVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26408,15 +27341,13 @@ abstract class ApiHelper { } - def queryAccountResourceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountResourceRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAccountResourceRefAction() + def powerOffBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOffBareMetal2ChassisAction.class) Closure c) { + def a = new org.zstack.sdk.PowerOffBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26437,15 +27368,13 @@ abstract class ApiHelper { } - def queryAddressPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAddressPoolAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAddressPoolAction() + def powerOffBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOffBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.PowerOffBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26466,15 +27395,13 @@ abstract class ApiHelper { } - def queryAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAffinityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAffinityGroupAction() + def powerOffHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOffHostAction.class) Closure c) { + def a = new org.zstack.sdk.PowerOffHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26495,15 +27422,13 @@ abstract class ApiHelper { } - def queryAgentVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAgentVersionAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAgentVersionAction() + def powerOnBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOnBareMetal2ChassisAction.class) Closure c) { + def a = new org.zstack.sdk.PowerOnBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26524,15 +27449,13 @@ abstract class ApiHelper { } - def queryAlert(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAlertAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAlertAction() + def powerOnBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOnBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.PowerOnBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26553,15 +27476,13 @@ abstract class ApiHelper { } - def queryAliyunDiskFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunDiskFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunDiskFromLocalAction() + def powerOnHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerOnHostAction.class) Closure c) { + def a = new org.zstack.sdk.PowerOnHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26582,15 +27503,13 @@ abstract class ApiHelper { } - def queryAliyunEbsBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunEbsBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunEbsBackupStorageAction() + def powerResetBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerResetBareMetal2ChassisAction.class) Closure c) { + def a = new org.zstack.sdk.PowerResetBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26611,15 +27530,13 @@ abstract class ApiHelper { } - def queryAliyunEbsPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunEbsPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunEbsPrimaryStorageAction() + def powerResetBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerResetBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.PowerResetBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26640,15 +27557,13 @@ abstract class ApiHelper { } - def queryAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunNasAccessGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunNasAccessGroupAction() + def powerResetHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PowerResetHostAction.class) Closure c) { + def a = new org.zstack.sdk.PowerResetHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26669,15 +27584,13 @@ abstract class ApiHelper { } - def queryAliyunPanguPartition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunPanguPartitionAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunPanguPartitionAction() + def previewResourceFromApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PreviewResourceFromAppAction.class) Closure c) { + def a = new org.zstack.sdk.PreviewResourceFromAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26698,15 +27611,13 @@ abstract class ApiHelper { } - def queryAliyunProxyVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunProxyVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunProxyVSwitchAction() + def previewResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PreviewResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.PreviewResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26727,15 +27638,13 @@ abstract class ApiHelper { } - def queryAliyunProxyVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunProxyVpcAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunProxyVpcAction() + def primaryStorageMigrateVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrimaryStorageMigrateVmAction.class) Closure c) { + def a = new org.zstack.sdk.PrimaryStorageMigrateVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26756,15 +27665,13 @@ abstract class ApiHelper { } - def queryAliyunRouteEntryFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunRouteEntryFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunRouteEntryFromLocalAction() + def primaryStorageMigrateVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrimaryStorageMigrateVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.PrimaryStorageMigrateVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26785,15 +27692,13 @@ abstract class ApiHelper { } - def queryAliyunRouterInterfaceFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunRouterInterfaceFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunRouterInterfaceFromLocalAction() + def prometheusQueryLabelValues(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryLabelValuesAction.class) Closure c) { + def a = new org.zstack.sdk.PrometheusQueryLabelValuesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26814,15 +27719,13 @@ abstract class ApiHelper { } - def queryAliyunSnapshotFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunSnapshotFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunSnapshotFromLocalAction() + def prometheusQueryMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryMetadataAction.class) Closure c) { + def a = new org.zstack.sdk.PrometheusQueryMetadataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26843,15 +27746,13 @@ abstract class ApiHelper { } - def queryAliyunVirtualRouterFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunVirtualRouterFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAliyunVirtualRouterFromLocalAction() + def prometheusQueryPassThrough(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryPassThroughAction.class) Closure c) { + def a = new org.zstack.sdk.PrometheusQueryPassThroughAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26872,15 +27773,13 @@ abstract class ApiHelper { } - def queryAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAppBuildSystemAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAppBuildSystemAction() + def prometheusQueryVmMonitoringData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PrometheusQueryVmMonitoringDataAction.class) Closure c) { + def a = new org.zstack.sdk.PrometheusQueryVmMonitoringDataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26901,15 +27800,13 @@ abstract class ApiHelper { } - def queryApplianceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryApplianceVmAction.class) Closure c) { - def a = new org.zstack.sdk.QueryApplianceVmAction() + def protectVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProtectVmInstanceRecoveryPointAction.class) Closure c) { + def a = new org.zstack.sdk.ProtectVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26930,15 +27827,13 @@ abstract class ApiHelper { } - def queryAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAutoScalingGroupAction() + def provisionSlbInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionSlbInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.ProvisionSlbInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26959,15 +27854,13 @@ abstract class ApiHelper { } - def queryAutoScalingGroupActivity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupActivityAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAutoScalingGroupActivityAction() + def provisionVirtualRouterConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ProvisionVirtualRouterConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ProvisionVirtualRouterConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -26988,15 +27881,13 @@ abstract class ApiHelper { } - def queryAutoScalingGroupInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAutoScalingGroupInstanceAction() + def publishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PublishAppAction.class) Closure c) { + def a = new org.zstack.sdk.PublishAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -27017,15 +27908,13 @@ abstract class ApiHelper { } - def queryAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAutoScalingRuleAction() + def pullSdnControllerTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PullSdnControllerTenantAction.class) Closure c) { + def a = new org.zstack.sdk.PullSdnControllerTenantAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -27046,44 +27935,13 @@ abstract class ApiHelper { } - def queryAutoScalingRuleTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingRuleTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAutoScalingRuleTriggerAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - - a.conditions = a.conditions.collect { it.toString() } - - - 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 queryAutoScalingVmTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingVmTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryAutoScalingVmTemplateAction() + def pushLicenseAddOnsUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.PushLicenseAddOnsUsageAction.class) Closure c) { + def a = new org.zstack.sdk.PushLicenseAddOnsUsageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -27104,8 +27962,8 @@ abstract class ApiHelper { } - def queryBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBackupStorageAction() + def queryAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccessControlListAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccessControlListAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27133,8 +27991,8 @@ abstract class ApiHelper { } - def queryBareMetal2Bonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2BondingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2BondingAction() + def queryAccessControlRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccessControlRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccessControlRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27162,8 +28020,8 @@ abstract class ApiHelper { } - def queryBareMetal2BondingNicRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2BondingNicRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2BondingNicRefAction() + def queryAccessKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccessKeyAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccessKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27191,8 +28049,8 @@ abstract class ApiHelper { } - def queryBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2ChassisAction() + def queryAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27220,8 +28078,8 @@ abstract class ApiHelper { } - def queryBareMetal2ChassisGpuDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisGpuDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2ChassisGpuDeviceAction() + def queryAccountBilling(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountBillingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccountBillingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27249,8 +28107,8 @@ abstract class ApiHelper { } - def queryBareMetal2ChassisOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2ChassisOfferingAction() + def queryAccountPriceTableRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountPriceTableRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccountPriceTableRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27278,8 +28136,8 @@ abstract class ApiHelper { } - def queryBareMetal2ChassisPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisPciDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2ChassisPciDeviceAction() + def queryAccountResourceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAccountResourceRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAccountResourceRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27307,8 +28165,8 @@ abstract class ApiHelper { } - def queryBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2GatewayAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2GatewayAction() + def queryAddressPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAddressPoolAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAddressPoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27336,8 +28194,8 @@ abstract class ApiHelper { } - def queryBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2InstanceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2InstanceAction() + def queryAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAffinityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAffinityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27365,8 +28223,8 @@ abstract class ApiHelper { } - def queryBareMetal2ProvisionNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ProvisionNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBareMetal2ProvisionNetworkAction() + def queryAgentVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAgentVersionAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAgentVersionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27394,8 +28252,8 @@ abstract class ApiHelper { } - def queryBaremetalBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalBondingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBaremetalBondingAction() + def queryAlert(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAlertAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAlertAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27423,8 +28281,8 @@ abstract class ApiHelper { } - def queryBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBaremetalChassisAction() + def queryAliyunDiskFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunDiskFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunDiskFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27452,8 +28310,8 @@ abstract class ApiHelper { } - def queryBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBaremetalInstanceAction() + def queryAliyunEbsBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunEbsBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunEbsBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27481,8 +28339,8 @@ abstract class ApiHelper { } - def queryBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalPxeServerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBaremetalPxeServerAction() + def queryAliyunEbsPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunEbsPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunEbsPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27510,8 +28368,8 @@ abstract class ApiHelper { } - def queryBlockPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBlockPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBlockPrimaryStorageAction() + def queryAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunNasAccessGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunNasAccessGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27539,8 +28397,8 @@ abstract class ApiHelper { } - def queryBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBlockVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBlockVolumeAction() + def queryAliyunPanguPartition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunPanguPartitionAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunPanguPartitionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27568,8 +28426,8 @@ abstract class ApiHelper { } - def queryBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBuildAppAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBuildAppAction() + def queryAliyunProxyVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunProxyVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunProxyVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27597,8 +28455,8 @@ abstract class ApiHelper { } - def queryBuildAppExportHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBuildAppExportHistoryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryBuildAppExportHistoryAction() + def queryAliyunProxyVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunProxyVpcAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunProxyVpcAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27626,8 +28484,8 @@ abstract class ApiHelper { } - def queryCCSCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCCSCertificateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCCSCertificateAction() + def queryAliyunRouteEntryFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunRouteEntryFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunRouteEntryFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27655,8 +28513,8 @@ abstract class ApiHelper { } - def queryCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCdpPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCdpPolicyAction() + def queryAliyunRouterInterfaceFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunRouterInterfaceFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunRouterInterfaceFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27684,8 +28542,8 @@ abstract class ApiHelper { } - def queryCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCdpTaskAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCdpTaskAction() + def queryAliyunSnapshotFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunSnapshotFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunSnapshotFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27713,8 +28571,8 @@ abstract class ApiHelper { } - def queryCephBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCephBackupStorageAction() + def queryAliyunVirtualRouterFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAliyunVirtualRouterFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAliyunVirtualRouterFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27742,8 +28600,8 @@ abstract class ApiHelper { } - def queryCephOsdGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephOsdGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCephOsdGroupAction() + def queryAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAppBuildSystemAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAppBuildSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27771,8 +28629,8 @@ abstract class ApiHelper { } - def queryCephPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCephPrimaryStorageAction() + def queryApplianceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryApplianceVmAction.class) Closure c) { + def a = new org.zstack.sdk.QueryApplianceVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27800,8 +28658,8 @@ abstract class ApiHelper { } - def queryCephPrimaryStoragePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephPrimaryStoragePoolAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCephPrimaryStoragePoolAction() + def queryApplicationDevelopmentService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryApplicationDevelopmentServiceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryApplicationDevelopmentServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27829,8 +28687,8 @@ abstract class ApiHelper { } - def queryCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCertificateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryCertificateAction() + def queryAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAutoScalingGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27858,8 +28716,8 @@ abstract class ApiHelper { } - def queryCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryClusterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryClusterAction() + def queryAutoScalingGroupActivity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupActivityAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAutoScalingGroupActivityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27887,8 +28745,8 @@ abstract class ApiHelper { } - def queryClusterDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryClusterDRSAction.class) Closure c) { - def a = new org.zstack.sdk.QueryClusterDRSAction() + def queryAutoScalingGroupInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingGroupInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAutoScalingGroupInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27916,8 +28774,8 @@ abstract class ApiHelper { } - def queryConnectionAccessPointFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryConnectionAccessPointFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryConnectionAccessPointFromLocalAction() + def queryAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAutoScalingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27945,8 +28803,8 @@ abstract class ApiHelper { } - def queryConnectionBetweenL3NetworkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction() + def queryAutoScalingRuleTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingRuleTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAutoScalingRuleTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -27974,8 +28832,8 @@ abstract class ApiHelper { } - def queryConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryConsoleProxyAgentAction.class) Closure c) { - def a = new org.zstack.sdk.QueryConsoleProxyAgentAction() + def queryAutoScalingVmTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryAutoScalingVmTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryAutoScalingVmTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28003,8 +28861,8 @@ abstract class ApiHelper { } - def queryDRSAdvice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDRSAdviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryDRSAdviceAction() + def queryBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28032,8 +28890,8 @@ abstract class ApiHelper { } - def queryDRSVmMigrationActivity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDRSVmMigrationActivityAction.class) Closure c) { - def a = new org.zstack.sdk.QueryDRSVmMigrationActivityAction() + def queryBareMetal2Bonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2BondingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2BondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28061,8 +28919,8 @@ abstract class ApiHelper { } - def queryDataCenterFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDataCenterFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryDataCenterFromLocalAction() + def queryBareMetal2BondingNicRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2BondingNicRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2BondingNicRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28090,8 +28948,8 @@ abstract class ApiHelper { } - def queryDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDirectoryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryDirectoryAction() + def queryBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28119,8 +28977,8 @@ abstract class ApiHelper { } - def queryDiskOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDiskOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryDiskOfferingAction() + def queryBareMetal2ChassisGpuDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisGpuDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2ChassisGpuDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28148,8 +29006,8 @@ abstract class ApiHelper { } - def queryEcsImageFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsImageFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEcsImageFromLocalAction() + def queryBareMetal2ChassisOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2ChassisOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28177,8 +29035,8 @@ abstract class ApiHelper { } - def queryEcsInstanceFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsInstanceFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEcsInstanceFromLocalAction() + def queryBareMetal2ChassisPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ChassisPciDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2ChassisPciDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28206,8 +29064,8 @@ abstract class ApiHelper { } - def queryEcsSecurityGroupFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsSecurityGroupFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEcsSecurityGroupFromLocalAction() + def queryBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2GatewayAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2GatewayAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28235,8 +29093,8 @@ abstract class ApiHelper { } - def queryEcsSecurityGroupRuleFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsSecurityGroupRuleFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEcsSecurityGroupRuleFromLocalAction() + def queryBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2InstanceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2InstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28264,8 +29122,8 @@ abstract class ApiHelper { } - def queryEcsVSwitchFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsVSwitchFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEcsVSwitchFromLocalAction() + def queryBareMetal2ProvisionNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBareMetal2ProvisionNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBareMetal2ProvisionNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28293,8 +29151,8 @@ abstract class ApiHelper { } - def queryEcsVpcFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsVpcFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEcsVpcFromLocalAction() + def queryBaremetalBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalBondingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBaremetalBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28322,8 +29180,8 @@ abstract class ApiHelper { } - def queryEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEipAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEipAction() + def queryBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28351,8 +29209,8 @@ abstract class ApiHelper { } - def queryEmailMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEmailMediaAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEmailMediaAction() + def queryBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28380,8 +29238,8 @@ abstract class ApiHelper { } - def queryEmailTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEmailTriggerActionAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEmailTriggerActionAction() + def queryBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBaremetalPxeServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBaremetalPxeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28409,8 +29267,8 @@ abstract class ApiHelper { } - def queryEthernetVF(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEthernetVFAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEthernetVFAction() + def queryBlockPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBlockPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBlockPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28438,8 +29296,8 @@ abstract class ApiHelper { } - def queryEventFromResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEventFromResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEventFromResourceStackAction() + def queryBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBlockVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBlockVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28467,8 +29325,8 @@ abstract class ApiHelper { } - def queryEventLog(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEventLogAction.class) Closure c) { - def a = new org.zstack.sdk.QueryEventLogAction() + def queryBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBuildAppAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBuildAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28496,8 +29354,8 @@ abstract class ApiHelper { } - def queryExponBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryExponBlockVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryExponBlockVolumeAction() + def queryBuildAppExportHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryBuildAppExportHistoryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryBuildAppExportHistoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28525,8 +29383,8 @@ abstract class ApiHelper { } - def queryExternalBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryExternalBackupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryExternalBackupAction() + def queryCCSCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCCSCertificateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCCSCertificateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28554,8 +29412,8 @@ abstract class ApiHelper { } - def queryFaultToleranceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFaultToleranceVmAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFaultToleranceVmAction() + def queryCbtTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCbtTaskAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCbtTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28583,8 +29441,8 @@ abstract class ApiHelper { } - def queryFiberChannelLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelLunAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFiberChannelLunAction() + 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 c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28612,8 +29470,8 @@ abstract class ApiHelper { } - def queryFiberChannelStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFiberChannelStorageAction() + def queryCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCdpTaskAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCdpTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28641,8 +29499,8 @@ abstract class ApiHelper { } - def queryFirewallIpSetTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallIpSetTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFirewallIpSetTemplateAction() + def queryCephBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCephBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28670,8 +29528,8 @@ abstract class ApiHelper { } - def queryFirewallRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFirewallRuleAction() + def queryCephOsdGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephOsdGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCephOsdGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28699,8 +29557,8 @@ abstract class ApiHelper { } - def queryFirewallRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFirewallRuleSetAction() + def queryCephPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCephPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28728,8 +29586,8 @@ abstract class ApiHelper { } - def queryFirewallRuleSetL3Ref(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleSetL3RefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFirewallRuleSetL3RefAction() + def queryCephPrimaryStoragePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCephPrimaryStoragePoolAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCephPrimaryStoragePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28757,8 +29615,8 @@ abstract class ApiHelper { } - def queryFirewallRuleTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFirewallRuleTemplateAction() + def queryCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryCertificateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryCertificateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28786,8 +29644,8 @@ abstract class ApiHelper { } - def queryFlowCollector(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFlowCollectorAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFlowCollectorAction() + def queryCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryClusterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28815,8 +29673,8 @@ abstract class ApiHelper { } - def queryFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFlowMeterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryFlowMeterAction() + def queryClusterDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryClusterDRSAction.class) Closure c) { + def a = new org.zstack.sdk.QueryClusterDRSAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28844,8 +29702,8 @@ abstract class ApiHelper { } - def queryGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGCJobAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGCJobAction() + def queryConnectionAccessPointFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryConnectionAccessPointFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryConnectionAccessPointFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28873,8 +29731,8 @@ abstract class ApiHelper { } - def queryGlobalConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGlobalConfigAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGlobalConfigAction() + def queryConnectionBetweenL3NetworkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.QueryConnectionBetweenL3NetworkAndAliyunVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28902,8 +29760,8 @@ abstract class ApiHelper { } - def queryGlobalConfigTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGlobalConfigTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGlobalConfigTemplateAction() + def queryConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryConsoleProxyAgentAction.class) Closure c) { + def a = new org.zstack.sdk.QueryConsoleProxyAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28931,8 +29789,8 @@ abstract class ApiHelper { } - def queryGpuDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGpuDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGpuDeviceAction() + def queryContainerImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerImageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryContainerImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28960,8 +29818,8 @@ abstract class ApiHelper { } - def queryGuestToolsState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestToolsStateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGuestToolsStateAction() + def queryContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.QueryContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -28989,8 +29847,8 @@ abstract class ApiHelper { } - def queryGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestVmScriptAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGuestVmScriptAction() + def queryDRSAdvice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDRSAdviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDRSAdviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29018,8 +29876,8 @@ abstract class ApiHelper { } - def queryGuestVmScriptExecutedRecord(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestVmScriptExecutedRecordAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGuestVmScriptExecutedRecordAction() + def queryDRSVmMigrationActivity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDRSVmMigrationActivityAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDRSVmMigrationActivityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29047,8 +29905,8 @@ abstract class ApiHelper { } - def queryGuestVmScriptExecutedRecordDetail(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestVmScriptExecutedRecordDetailAction.class) Closure c) { - def a = new org.zstack.sdk.QueryGuestVmScriptExecutedRecordDetailAction() + def queryDataCenterFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDataCenterFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDataCenterFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29076,8 +29934,8 @@ abstract class ApiHelper { } - def queryHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostAction() + def queryDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDatasetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29105,8 +29963,8 @@ abstract class ApiHelper { } - def queryHostNetworkBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostNetworkBondingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostNetworkBondingAction() + def queryDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDirectoryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29134,8 +29992,8 @@ abstract class ApiHelper { } - def queryHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostNetworkInterfaceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostNetworkInterfaceAction() + def queryDiskOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryDiskOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryDiskOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29163,8 +30021,8 @@ abstract class ApiHelper { } - def queryHostNetworkInterfaceLldp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostNetworkInterfaceLldpAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostNetworkInterfaceLldpAction() + def queryEcsImageFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsImageFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEcsImageFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29192,8 +30050,8 @@ abstract class ApiHelper { } - def queryHostOsCategory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostOsCategoryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostOsCategoryAction() + def queryEcsInstanceFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsInstanceFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEcsInstanceFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29221,8 +30079,8 @@ abstract class ApiHelper { } - def queryHostPhysicalMemory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostPhysicalMemoryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostPhysicalMemoryAction() + def queryEcsSecurityGroupFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsSecurityGroupFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEcsSecurityGroupFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29250,8 +30108,8 @@ abstract class ApiHelper { } - def queryHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHostSchedulingRuleGroupAction() + def queryEcsSecurityGroupRuleFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsSecurityGroupRuleFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEcsSecurityGroupRuleFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29279,8 +30137,8 @@ abstract class ApiHelper { } - def queryHybridEipFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHybridEipFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHybridEipFromLocalAction() + def queryEcsVSwitchFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsVSwitchFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEcsVSwitchFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29308,8 +30166,8 @@ abstract class ApiHelper { } - def queryHybridKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHybridKeySecretAction.class) Closure c) { - def a = new org.zstack.sdk.QueryHybridKeySecretAction() + def queryEcsVpcFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEcsVpcFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEcsVpcFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29337,8 +30195,8 @@ abstract class ApiHelper { } - def queryIAM2LdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIAM2LdapBindingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIAM2LdapBindingAction() + def queryEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEipAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29366,8 +30224,8 @@ abstract class ApiHelper { } - def queryIPSecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIPSecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIPSecConnectionAction() + def queryEmailMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEmailMediaAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEmailMediaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29395,8 +30253,8 @@ abstract class ApiHelper { } - def queryIdentityZoneFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIdentityZoneFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIdentityZoneFromLocalAction() + def queryEmailTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEmailTriggerActionAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEmailTriggerActionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29424,8 +30282,8 @@ abstract class ApiHelper { } - def queryImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryImageAction() + def queryEthernetVF(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEthernetVFAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEthernetVFAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29453,8 +30311,8 @@ abstract class ApiHelper { } - def queryImageCache(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageCacheAction.class) Closure c) { - def a = new org.zstack.sdk.QueryImageCacheAction() + def queryEventFromResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEventFromResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEventFromResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29482,8 +30340,8 @@ abstract class ApiHelper { } - def queryImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImagePackageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryImagePackageAction() + def queryEventLog(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryEventLogAction.class) Closure c) { + def a = new org.zstack.sdk.QueryEventLogAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29511,8 +30369,8 @@ abstract class ApiHelper { } - def queryImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageReplicationGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryImageReplicationGroupAction() + def queryExponBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryExponBlockVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryExponBlockVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29540,8 +30398,8 @@ abstract class ApiHelper { } - def queryImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryImageStoreBackupStorageAction() + def queryExternalBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryExternalBackupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryExternalBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29569,8 +30427,8 @@ abstract class ApiHelper { } - def queryInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryInstanceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryInstanceOfferingAction() + def queryFaultToleranceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFaultToleranceVmAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFaultToleranceVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29598,8 +30456,8 @@ abstract class ApiHelper { } - def queryIpAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIpAddressAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIpAddressAction() + def queryFcHbaDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFcHbaDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFcHbaDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29627,8 +30485,8 @@ abstract class ApiHelper { } - def queryIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIpRangeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIpRangeAction() + def queryFiberChannelLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelLunAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFiberChannelLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29656,8 +30514,8 @@ abstract class ApiHelper { } - def queryIscsiLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIscsiLunAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIscsiLunAction() + def queryFiberChannelStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFiberChannelStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFiberChannelStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29685,8 +30543,8 @@ abstract class ApiHelper { } - def queryIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIscsiServerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryIscsiServerAction() + def queryFirewallIpSetTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallIpSetTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFirewallIpSetTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29714,8 +30572,8 @@ abstract class ApiHelper { } - def queryKvmHypervisorInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryKvmHypervisorInfoAction.class) Closure c) { - def a = new org.zstack.sdk.QueryKvmHypervisorInfoAction() + def queryFirewallRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFirewallRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29743,8 +30601,8 @@ abstract class ApiHelper { } - def queryL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL2NetworkAction() + def queryFirewallRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFirewallRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29772,8 +30630,8 @@ abstract class ApiHelper { } - def queryL2PortGroupNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2PortGroupNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL2PortGroupNetworkAction() + def queryFirewallRuleSetL3Ref(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleSetL3RefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFirewallRuleSetL3RefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29801,8 +30659,8 @@ abstract class ApiHelper { } - def queryL2VirtualSwitchNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VirtualSwitchNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL2VirtualSwitchNetworkAction() + def queryFirewallRuleTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFirewallRuleTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFirewallRuleTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29830,8 +30688,8 @@ abstract class ApiHelper { } - def queryL2VlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VlanNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL2VlanNetworkAction() + def queryFlowCollector(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFlowCollectorAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFlowCollectorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29859,8 +30717,8 @@ abstract class ApiHelper { } - def queryL2VxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VxlanNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL2VxlanNetworkAction() + def queryFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryFlowMeterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryFlowMeterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29888,8 +30746,8 @@ abstract class ApiHelper { } - def queryL2VxlanNetworkPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VxlanNetworkPoolAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL2VxlanNetworkPoolAction() + def queryGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGCJobAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGCJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29917,8 +30775,8 @@ abstract class ApiHelper { } - def queryL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryL3NetworkAction() + def queryGlobalConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGlobalConfigAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGlobalConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29946,8 +30804,8 @@ abstract class ApiHelper { } - def queryLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLdapBindingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLdapBindingAction() + def queryGlobalConfigTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGlobalConfigTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGlobalConfigTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -29975,8 +30833,8 @@ abstract class ApiHelper { } - def queryLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLdapServerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLdapServerAction() + def queryGpuDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGpuDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGpuDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30004,8 +30862,8 @@ abstract class ApiHelper { } - def queryLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLoadBalancerAction() + def queryGuestToolsState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestToolsStateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGuestToolsStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30033,8 +30891,8 @@ abstract class ApiHelper { } - def queryLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLoadBalancerListenerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLoadBalancerListenerAction() + def queryGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestVmScriptAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGuestVmScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30062,8 +30920,8 @@ abstract class ApiHelper { } - def queryLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLoadBalancerServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLoadBalancerServerGroupAction() + def queryGuestVmScriptExecutedRecord(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestVmScriptExecutedRecordAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGuestVmScriptExecutedRecordAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30091,8 +30949,8 @@ abstract class ApiHelper { } - def queryLocalRaidController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLocalRaidControllerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLocalRaidControllerAction() + def queryGuestVmScriptExecutedRecordDetail(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryGuestVmScriptExecutedRecordDetailAction.class) Closure c) { + def a = new org.zstack.sdk.QueryGuestVmScriptExecutedRecordDetailAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30120,8 +30978,8 @@ abstract class ApiHelper { } - def queryLocalRaidPhysicalDrive(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLocalRaidPhysicalDriveAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLocalRaidPhysicalDriveAction() + def queryHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30149,8 +31007,8 @@ abstract class ApiHelper { } - def queryLocalStorageResourceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLocalStorageResourceRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLocalStorageResourceRefAction() + def queryHostNetworkBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostNetworkBondingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostNetworkBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30178,8 +31036,8 @@ abstract class ApiHelper { } - def queryLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLongJobAction.class) Closure c) { - def a = new org.zstack.sdk.QueryLongJobAction() + def queryHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostNetworkInterfaceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostNetworkInterfaceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30207,8 +31065,8 @@ abstract class ApiHelper { } - def queryManagementNode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryManagementNodeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryManagementNodeAction() + def queryHostNetworkInterfaceLldp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostNetworkInterfaceLldpAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostNetworkInterfaceLldpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30236,8 +31094,8 @@ abstract class ApiHelper { } - def queryMdevDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMdevDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMdevDeviceAction() + def queryHostOsCategory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostOsCategoryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostOsCategoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30265,8 +31123,8 @@ abstract class ApiHelper { } - def queryMdevDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMdevDeviceSpecAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMdevDeviceSpecAction() + def queryHostPhysicalMemory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostPhysicalMemoryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostPhysicalMemoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30294,8 +31152,8 @@ abstract class ApiHelper { } - def queryMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMediaAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMediaAction() + def queryHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHostSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHostSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30323,8 +31181,8 @@ abstract class ApiHelper { } - def queryMiniStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMiniStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMiniStorageAction() + def queryHybridEipFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHybridEipFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHybridEipFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30352,8 +31210,37 @@ abstract class ApiHelper { } - def queryMiniStorageHostRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMiniStorageHostRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMiniStorageHostRefAction() + def queryHybridKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryHybridKeySecretAction.class) Closure c) { + def a = new org.zstack.sdk.QueryHybridKeySecretAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2LdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIAM2LdapBindingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIAM2LdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30381,8 +31268,8 @@ abstract class ApiHelper { } - def queryMiniStorageResourceReplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMiniStorageResourceReplicationAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMiniStorageResourceReplicationAction() + def queryIPSecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIPSecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIPSecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30410,8 +31297,8 @@ abstract class ApiHelper { } - def queryMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMonitorTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMonitorTriggerAction() + def queryIdentityZoneFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIdentityZoneFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIdentityZoneFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30439,8 +31326,8 @@ abstract class ApiHelper { } - def queryMonitorTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMonitorTriggerActionAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMonitorTriggerActionAction() + def queryImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30468,8 +31355,8 @@ abstract class ApiHelper { } - def queryMttyDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMttyDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMttyDeviceAction() + def queryImageCache(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageCacheAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageCacheAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30497,8 +31384,8 @@ abstract class ApiHelper { } - def queryMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMulticastRouterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryMulticastRouterAction() + def queryImageGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30526,8 +31413,8 @@ abstract class ApiHelper { } - def queryNasFileSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNasFileSystemAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNasFileSystemAction() + def queryImageGroupRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageGroupRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageGroupRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30555,8 +31442,8 @@ abstract class ApiHelper { } - def queryNasMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNasMountTargetAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNasMountTargetAction() + def queryImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImagePackageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImagePackageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30584,8 +31471,8 @@ abstract class ApiHelper { } - def queryNetworkServiceL3NetworkRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNetworkServiceL3NetworkRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNetworkServiceL3NetworkRefAction() + def queryImageReplicationGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageReplicationGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageReplicationGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30613,8 +31500,8 @@ abstract class ApiHelper { } - def queryNetworkServiceProvider(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNetworkServiceProviderAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNetworkServiceProviderAction() + def queryImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30642,8 +31529,8 @@ abstract class ApiHelper { } - def queryNvmeLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeLunAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNvmeLunAction() + def queryInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryInstanceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryInstanceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30671,8 +31558,8 @@ abstract class ApiHelper { } - def queryNvmeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeServerAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNvmeServerAction() + def queryIpAddress(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIpAddressAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIpAddressAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30700,8 +31587,8 @@ abstract class ApiHelper { } - def queryNvmeTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeTargetAction.class) Closure c) { - def a = new org.zstack.sdk.QueryNvmeTargetAction() + def queryIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIpRangeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIpRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30729,8 +31616,8 @@ abstract class ApiHelper { } - def queryOssBucketFileName(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryOssBucketFileNameAction.class) Closure c) { - def a = new org.zstack.sdk.QueryOssBucketFileNameAction() + def queryIscsiLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIscsiLunAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIscsiLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30758,8 +31645,8 @@ abstract class ApiHelper { } - def queryPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPciDeviceAction() + def queryIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryIscsiServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryIscsiServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30787,8 +31674,8 @@ abstract class ApiHelper { } - def queryPciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPciDeviceOfferingAction() + def queryKvmHypervisorInfo(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryKvmHypervisorInfoAction.class) Closure c) { + def a = new org.zstack.sdk.QueryKvmHypervisorInfoAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30816,8 +31703,8 @@ abstract class ApiHelper { } - def queryPciDevicePciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDevicePciDeviceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPciDevicePciDeviceOfferingAction() + def queryL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL2NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30845,8 +31732,8 @@ abstract class ApiHelper { } - def queryPciDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceSpecAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPciDeviceSpecAction() + def queryL2PortGroupNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2PortGroupNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL2PortGroupNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30874,8 +31761,8 @@ abstract class ApiHelper { } - def queryPhysicalDriveSelfTestHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPhysicalDriveSelfTestHistoryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPhysicalDriveSelfTestHistoryAction() + def queryL2VirtualSwitchNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VirtualSwitchNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL2VirtualSwitchNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30903,8 +31790,8 @@ abstract class ApiHelper { } - def queryPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyAction() + def queryL2VlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VlanNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL2VlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30932,8 +31819,8 @@ abstract class ApiHelper { } - def queryPolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteRuleAction() + def queryL2VxlanNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VxlanNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL2VxlanNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30961,8 +31848,8 @@ abstract class ApiHelper { } - def queryPolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteRuleSetAction() + def queryL2VxlanNetworkPool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL2VxlanNetworkPoolAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL2VxlanNetworkPoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -30990,8 +31877,8 @@ abstract class ApiHelper { } - def queryPolicyRouteRuleSetL3Ref(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleSetL3RefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteRuleSetL3RefAction() + def queryL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31019,8 +31906,8 @@ abstract class ApiHelper { } - def queryPolicyRouteRuleSetVRouterRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleSetVRouterRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteRuleSetVRouterRefAction() + def queryLdapBinding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLdapBindingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLdapBindingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31048,8 +31935,8 @@ abstract class ApiHelper { } - def queryPolicyRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteTableAction() + def queryLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLdapServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLdapServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31077,8 +31964,8 @@ abstract class ApiHelper { } - def queryPolicyRouteTableRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteTableRouteEntryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteTableRouteEntryAction() + def queryLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31106,8 +31993,8 @@ abstract class ApiHelper { } - def queryPolicyRouteTableVRouterRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteTableVRouterRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPolicyRouteTableVRouterRefAction() + def queryLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLoadBalancerListenerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLoadBalancerListenerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31135,8 +32022,8 @@ abstract class ApiHelper { } - def queryPortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortForwardingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPortForwardingRuleAction() + def queryLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLoadBalancerServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLoadBalancerServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31164,8 +32051,8 @@ abstract class ApiHelper { } - def queryPortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortMirrorAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPortMirrorAction() + def queryLocalRaidController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLocalRaidControllerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLocalRaidControllerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31193,8 +32080,8 @@ abstract class ApiHelper { } - def queryPortMirrorNetworkUsedIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortMirrorNetworkUsedIpAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPortMirrorNetworkUsedIpAction() + def queryLocalRaidPhysicalDrive(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLocalRaidPhysicalDriveAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLocalRaidPhysicalDriveAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31222,8 +32109,8 @@ abstract class ApiHelper { } - def queryPortMirrorSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortMirrorSessionAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPortMirrorSessionAction() + def queryLocalStorageResourceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLocalStorageResourceRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLocalStorageResourceRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31251,8 +32138,8 @@ abstract class ApiHelper { } - def queryPreconfigurationTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPreconfigurationTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPreconfigurationTemplateAction() + def queryLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLogServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31280,8 +32167,8 @@ abstract class ApiHelper { } - def queryPriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPriceTableAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPriceTableAction() + def queryLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.QueryLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31309,8 +32196,8 @@ abstract class ApiHelper { } - def queryPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPrimaryStorageAction() + def queryManagementNode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryManagementNodeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryManagementNodeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31338,8 +32225,8 @@ abstract class ApiHelper { } - def queryPublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPublishAppAction.class) Closure c) { - def a = new org.zstack.sdk.QueryPublishAppAction() + def queryMdevDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMdevDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMdevDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31367,8 +32254,8 @@ abstract class ApiHelper { } - def queryQuota(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryQuotaAction.class) Closure c) { - def a = new org.zstack.sdk.QueryQuotaAction() + def queryMdevDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMdevDeviceSpecAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMdevDeviceSpecAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31396,8 +32283,8 @@ abstract class ApiHelper { } - def queryResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryResourceConfigAction.class) Closure c) { - def a = new org.zstack.sdk.QueryResourceConfigAction() + def queryMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMediaAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMediaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31425,8 +32312,8 @@ abstract class ApiHelper { } - def queryResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryResourcePriceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryResourcePriceAction() + def queryMiniStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMiniStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMiniStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31454,8 +32341,8 @@ abstract class ApiHelper { } - def queryResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.QueryResourceStackAction() + def queryMiniStorageHostRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMiniStorageHostRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMiniStorageHostRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31483,8 +32370,8 @@ abstract class ApiHelper { } - def querySchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerJobAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySchedulerJobAction() + def queryMiniStorageResourceReplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMiniStorageResourceReplicationAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMiniStorageResourceReplicationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31512,8 +32399,8 @@ abstract class ApiHelper { } - def querySchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerJobGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySchedulerJobGroupAction() + def queryModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31541,8 +32428,8 @@ abstract class ApiHelper { } - def querySchedulerJobHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerJobHistoryAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySchedulerJobHistoryAction() + def queryModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31570,8 +32457,8 @@ abstract class ApiHelper { } - def querySchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySchedulerTriggerAction() + def queryModelEvalServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelEvalServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelEvalServiceInstanceGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31599,8 +32486,8 @@ abstract class ApiHelper { } - def queryScsiLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryScsiLunAction.class) Closure c) { - def a = new org.zstack.sdk.QueryScsiLunAction() + def queryModelEvaluationTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelEvaluationTaskAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelEvaluationTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31628,8 +32515,8 @@ abstract class ApiHelper { } - def querySdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySdnControllerAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySdnControllerAction() + def queryModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31657,8 +32544,8 @@ abstract class ApiHelper { } - def querySecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySecretResourcePoolAction() + def queryModelServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryModelServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryModelServiceInstanceGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31686,8 +32573,8 @@ abstract class ApiHelper { } - def querySecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySecurityGroupAction() + def queryMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMonitorTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31715,8 +32602,95 @@ abstract class ApiHelper { } - def querySecurityGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecurityGroupRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySecurityGroupRuleAction() + def queryMonitorTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMonitorTriggerActionAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMonitorTriggerActionAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryMttyDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMttyDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMttyDeviceAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryMulticastRouterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryMulticastRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryNasFileSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNasFileSystemAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNasFileSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31744,8 +32718,8 @@ abstract class ApiHelper { } - def querySecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySecurityMachineAction() + def queryNasMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNasMountTargetAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNasMountTargetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31773,8 +32747,8 @@ abstract class ApiHelper { } - def querySftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySftpBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySftpBackupStorageAction() + def queryNativeCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNativeClusterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNativeClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31802,8 +32776,8 @@ abstract class ApiHelper { } - def queryShareableVolumeVmInstanceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryShareableVolumeVmInstanceRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryShareableVolumeVmInstanceRefAction() + def queryNativeHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNativeHostAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNativeHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31831,8 +32805,8 @@ abstract class ApiHelper { } - def querySharedBlock(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedBlockAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySharedBlockAction() + def queryNetworkServiceL3NetworkRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNetworkServiceL3NetworkRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNetworkServiceL3NetworkRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31860,8 +32834,8 @@ abstract class ApiHelper { } - def querySharedBlockGroupPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageAction() + def queryNetworkServiceProvider(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNetworkServiceProviderAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNetworkServiceProviderAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31889,8 +32863,8 @@ abstract class ApiHelper { } - def querySharedBlockGroupPrimaryStorageHostRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageHostRefAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageHostRefAction() + def queryNvmeLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeLunAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNvmeLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31918,8 +32892,8 @@ abstract class ApiHelper { } - def querySharedResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedResourceAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySharedResourceAction() + def queryNvmeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeServerAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNvmeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31947,8 +32921,8 @@ abstract class ApiHelper { } - def querySlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySlbGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySlbGroupAction() + def queryNvmeTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryNvmeTargetAction.class) Closure c) { + def a = new org.zstack.sdk.QueryNvmeTargetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -31976,8 +32950,8 @@ abstract class ApiHelper { } - def querySlbOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySlbOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySlbOfferingAction() + def queryOssBucketFileName(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryOssBucketFileNameAction.class) Closure c) { + def a = new org.zstack.sdk.QueryOssBucketFileNameAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32005,8 +32979,8 @@ abstract class ApiHelper { } - def querySlbVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySlbVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySlbVmInstanceAction() + def queryPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPciDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32034,8 +33008,8 @@ abstract class ApiHelper { } - def querySnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySnmpAgentAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySnmpAgentAction() + def queryPciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPciDeviceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32063,8 +33037,8 @@ abstract class ApiHelper { } - def querySshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySshKeyPairAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySshKeyPairAction() + def queryPciDevicePciDeviceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDevicePciDeviceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPciDevicePciDeviceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32092,8 +33066,8 @@ abstract class ApiHelper { } - def queryStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryStackTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryStackTemplateAction() + def queryPciDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPciDeviceSpecAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPciDeviceSpecAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32121,8 +33095,8 @@ abstract class ApiHelper { } - def querySystemTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySystemTagAction.class) Closure c) { - def a = new org.zstack.sdk.QuerySystemTagAction() + def queryPhysicalDriveSelfTestHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPhysicalDriveSelfTestHistoryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPhysicalDriveSelfTestHistoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32150,8 +33124,8 @@ abstract class ApiHelper { } - def queryTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTagAction.class) Closure c) { - def a = new org.zstack.sdk.QueryTagAction() + def queryPhysicalSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPhysicalSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPhysicalSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32179,8 +33153,8 @@ abstract class ApiHelper { } - def queryTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTemplateConfigAction.class) Closure c) { - def a = new org.zstack.sdk.QueryTemplateConfigAction() + def queryPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPluginDriversAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32208,8 +33182,8 @@ abstract class ApiHelper { } - def queryTwoFactorAuthentication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTwoFactorAuthenticationAction.class) Closure c) { - def a = new org.zstack.sdk.QueryTwoFactorAuthenticationAction() + def queryPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32237,8 +33211,8 @@ abstract class ApiHelper { } - def queryUsbDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUsbDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryUsbDeviceAction() + def queryPolicyRouteRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32266,8 +33240,8 @@ abstract class ApiHelper { } - def queryUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserAction.class) Closure c) { - def a = new org.zstack.sdk.QueryUserAction() + def queryPolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32295,8 +33269,8 @@ abstract class ApiHelper { } - def queryUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryUserGroupAction() + def queryPolicyRouteRuleSetL3Ref(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleSetL3RefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteRuleSetL3RefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32324,8 +33298,8 @@ abstract class ApiHelper { } - def queryUserTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserTagAction.class) Closure c) { - def a = new org.zstack.sdk.QueryUserTagAction() + def queryPolicyRouteRuleSetVRouterRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteRuleSetVRouterRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteRuleSetVRouterRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32353,8 +33327,8 @@ abstract class ApiHelper { } - def queryV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryV2VConversionHostAction.class) Closure c) { - def a = new org.zstack.sdk.QueryV2VConversionHostAction() + def queryPolicyRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32382,8 +33356,8 @@ abstract class ApiHelper { } - def queryVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVCenterAction() + def queryPolicyRouteTableRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteTableRouteEntryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteTableRouteEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32411,8 +33385,8 @@ abstract class ApiHelper { } - def queryVCenterBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVCenterBackupStorageAction() + def queryPolicyRouteTableVRouterRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPolicyRouteTableVRouterRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPolicyRouteTableVRouterRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32440,8 +33414,8 @@ abstract class ApiHelper { } - def queryVCenterCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterClusterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVCenterClusterAction() + def queryPortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortForwardingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPortForwardingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32469,8 +33443,8 @@ abstract class ApiHelper { } - def queryVCenterDatacenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterDatacenterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVCenterDatacenterAction() + def queryPortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortMirrorAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPortMirrorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32498,8 +33472,8 @@ abstract class ApiHelper { } - def queryVCenterPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVCenterPrimaryStorageAction() + def queryPortMirrorNetworkUsedIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortMirrorNetworkUsedIpAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPortMirrorNetworkUsedIpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32527,8 +33501,8 @@ abstract class ApiHelper { } - def queryVCenterResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVCenterResourcePoolAction() + def queryPortMirrorSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPortMirrorSessionAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPortMirrorSessionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32556,8 +33530,8 @@ abstract class ApiHelper { } - def queryVRouterFlowMeterNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterFlowMeterNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVRouterFlowMeterNetworkAction() + def queryPreconfigurationTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPreconfigurationTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPreconfigurationTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32585,8 +33559,8 @@ abstract class ApiHelper { } - def queryVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterOspfAreaAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVRouterOspfAreaAction() + def queryPriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPriceTableAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPriceTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32614,8 +33588,8 @@ abstract class ApiHelper { } - def queryVRouterOspfNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterOspfNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVRouterOspfNetworkAction() + def queryPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32643,8 +33617,8 @@ abstract class ApiHelper { } - def queryVRouterRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterRouteEntryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVRouterRouteEntryAction() + def queryPublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryPublishAppAction.class) Closure c) { + def a = new org.zstack.sdk.QueryPublishAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32672,8 +33646,8 @@ abstract class ApiHelper { } - def queryVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVRouterRouteTableAction() + def queryQuota(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryQuotaAction.class) Closure c) { + def a = new org.zstack.sdk.QueryQuotaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32701,8 +33675,8 @@ abstract class ApiHelper { } - def queryVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVipAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVipAction() + def queryResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryResourceConfigAction.class) Closure c) { + def a = new org.zstack.sdk.QueryResourceConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32730,8 +33704,8 @@ abstract class ApiHelper { } - def queryVirtualBorderRouterFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualBorderRouterFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVirtualBorderRouterFromLocalAction() + def queryResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryResourcePriceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryResourcePriceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32759,8 +33733,8 @@ abstract class ApiHelper { } - def queryVirtualRouterOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualRouterOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVirtualRouterOfferingAction() + def queryResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.QueryResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32788,8 +33762,8 @@ abstract class ApiHelper { } - def queryVirtualRouterVRouterRouteTableRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualRouterVRouterRouteTableRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVirtualRouterVRouterRouteTableRefAction() + def querySchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerJobAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySchedulerJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32817,8 +33791,8 @@ abstract class ApiHelper { } - def queryVirtualRouterVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualRouterVmAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVirtualRouterVmAction() + def querySchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerJobGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySchedulerJobGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32846,8 +33820,8 @@ abstract class ApiHelper { } - def queryVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmCdRomAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmCdRomAction() + def querySchedulerJobHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerJobHistoryAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySchedulerJobHistoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32875,8 +33849,8 @@ abstract class ApiHelper { } - def queryVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmInstanceAction() + def querySchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySchedulerTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32904,8 +33878,8 @@ abstract class ApiHelper { } - def queryVmInstanceDeviceAddressArchive(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceDeviceAddressArchiveAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmInstanceDeviceAddressArchiveAction() + def queryScsiLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryScsiLunAction.class) Closure c) { + def a = new org.zstack.sdk.QueryScsiLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32933,8 +33907,8 @@ abstract class ApiHelper { } - def queryVmInstanceDeviceAddressGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceDeviceAddressGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmInstanceDeviceAddressGroupAction() + def querySdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySdnControllerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32962,8 +33936,8 @@ abstract class ApiHelper { } - def queryVmInstanceMdevDeviceSpecRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceMdevDeviceSpecRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmInstanceMdevDeviceSpecRefAction() + def querySecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -32991,8 +33965,8 @@ abstract class ApiHelper { } - def queryVmInstancePciDeviceSpecRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstancePciDeviceSpecRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmInstancePciDeviceSpecRefAction() + def querySecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33020,8 +33994,8 @@ abstract class ApiHelper { } - def queryVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmNicAction() + def querySecurityGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecurityGroupRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySecurityGroupRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33049,8 +34023,8 @@ abstract class ApiHelper { } - def queryVmNicInSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicInSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmNicInSecurityGroupAction() + def querySecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33078,8 +34052,8 @@ abstract class ApiHelper { } - def queryVmNicSecurityPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicSecurityPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmNicSecurityPolicyAction() + def querySftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySftpBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySftpBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33107,8 +34081,8 @@ abstract class ApiHelper { } - def queryVmPriorityConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmPriorityConfigAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmPriorityConfigAction() + def queryShareableVolumeVmInstanceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryShareableVolumeVmInstanceRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryShareableVolumeVmInstanceRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33136,8 +34110,8 @@ abstract class ApiHelper { } - def queryVmSchedHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedHistoryAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmSchedHistoryAction() + def querySharedBlock(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedBlockAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySharedBlockAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33165,8 +34139,8 @@ abstract class ApiHelper { } - def queryVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedulingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmSchedulingRuleAction() + def querySharedBlockGroupPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33194,8 +34168,8 @@ abstract class ApiHelper { } - def queryVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmSchedulingRuleGroupAction() + def querySharedBlockGroupPrimaryStorageHostRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageHostRefAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySharedBlockGroupPrimaryStorageHostRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33223,8 +34197,8 @@ abstract class ApiHelper { } - def queryVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmUserDefinedXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVmUserDefinedXmlHookScriptAction() + def querySharedResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySharedResourceAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySharedResourceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33252,8 +34226,8 @@ abstract class ApiHelper { } - def queryVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVniRangeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVniRangeAction() + def querySlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySlbGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySlbGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33281,8 +34255,8 @@ abstract class ApiHelper { } - def queryVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVolumeAction() + def querySlbOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySlbOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySlbOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33310,8 +34284,8 @@ abstract class ApiHelper { } - def queryVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVolumeSnapshotAction() + def querySlbVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySlbVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySlbVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33339,8 +34313,8 @@ abstract class ApiHelper { } - def queryVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVolumeSnapshotGroupAction() + def querySnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySnmpAgentAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySnmpAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33368,8 +34342,8 @@ abstract class ApiHelper { } - def queryVolumeSnapshotTree(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeSnapshotTreeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVolumeSnapshotTreeAction() + def querySshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySshKeyPairAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySshKeyPairAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33397,8 +34371,8 @@ abstract class ApiHelper { } - def queryVpcFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcFirewallAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcFirewallAction() + def queryStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryStackTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryStackTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33426,8 +34400,37 @@ abstract class ApiHelper { } - def queryVpcFirewallVRouterRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcFirewallVRouterRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcFirewallVRouterRefAction() + def querySystemTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QuerySystemTagAction.class) Closure c) { + def a = new org.zstack.sdk.QuerySystemTagAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTagAction.class) Closure c) { + def a = new org.zstack.sdk.QueryTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33455,8 +34458,8 @@ abstract class ApiHelper { } - def queryVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcHaGroupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcHaGroupAction() + def queryTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTemplateConfigAction.class) Closure c) { + def a = new org.zstack.sdk.QueryTemplateConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33484,8 +34487,8 @@ abstract class ApiHelper { } - def queryVpcHaGroupNetworkServiceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcHaGroupNetworkServiceRefAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcHaGroupNetworkServiceRefAction() + def queryTrainedModelRecord(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTrainedModelRecordAction.class) Closure c) { + def a = new org.zstack.sdk.QueryTrainedModelRecordAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33513,8 +34516,8 @@ abstract class ApiHelper { } - def queryVpcIkeConfigFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcIkeConfigFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcIkeConfigFromLocalAction() + def queryTwoFactorAuthentication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryTwoFactorAuthenticationAction.class) Closure c) { + def a = new org.zstack.sdk.QueryTwoFactorAuthenticationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33542,8 +34545,8 @@ abstract class ApiHelper { } - def queryVpcIpSecConfigFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcIpSecConfigFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcIpSecConfigFromLocalAction() + def queryUsbDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUsbDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryUsbDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33571,8 +34574,8 @@ abstract class ApiHelper { } - def queryVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcRouterAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcRouterAction() + def queryUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserAction.class) Closure c) { + def a = new org.zstack.sdk.QueryUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33600,8 +34603,8 @@ abstract class ApiHelper { } - def queryVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcSharedQosAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcSharedQosAction() + def queryUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryUserGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33629,8 +34632,8 @@ abstract class ApiHelper { } - def queryVpcSnatState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcSnatStateAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcSnatStateAction() + def queryUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.QueryUserProxyConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33658,8 +34661,8 @@ abstract class ApiHelper { } - def queryVpcUserVpnGatewayFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcUserVpnGatewayFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcUserVpnGatewayFromLocalAction() + def queryUserTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryUserTagAction.class) Closure c) { + def a = new org.zstack.sdk.QueryUserTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33687,8 +34690,8 @@ abstract class ApiHelper { } - def queryVpcVpnConnectionFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcVpnConnectionFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcVpnConnectionFromLocalAction() + def queryV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryV2VConversionHostAction.class) Closure c) { + def a = new org.zstack.sdk.QueryV2VConversionHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33716,8 +34719,8 @@ abstract class ApiHelper { } - def queryVpcVpnGatewayFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcVpnGatewayFromLocalAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVpcVpnGatewayFromLocalAction() + def queryVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33745,8 +34748,8 @@ abstract class ApiHelper { } - def queryVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVtepAction.class) Closure c) { - def a = new org.zstack.sdk.QueryVtepAction() + def queryVCenterBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVCenterBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33774,8 +34777,8 @@ abstract class ApiHelper { } - def queryWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryWebhookAction.class) Closure c) { - def a = new org.zstack.sdk.QueryWebhookAction() + def queryVCenterCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterClusterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVCenterClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33803,8 +34806,8 @@ abstract class ApiHelper { } - def queryXskyBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryXskyBlockVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.QueryXskyBlockVolumeAction() + def queryVCenterDatacenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterDatacenterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVCenterDatacenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33832,8 +34835,8 @@ abstract class ApiHelper { } - def queryZBox(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZBoxAction.class) Closure c) { - def a = new org.zstack.sdk.QueryZBoxAction() + def queryVCenterPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVCenterPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33861,8 +34864,8 @@ abstract class ApiHelper { } - def queryZBoxBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZBoxBackupAction.class) Closure c) { - def a = new org.zstack.sdk.QueryZBoxBackupAction() + def queryVCenterResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVCenterResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVCenterResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33890,8 +34893,8 @@ abstract class ApiHelper { } - def queryZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZoneAction.class) Closure c) { - def a = new org.zstack.sdk.QueryZoneAction() + def queryVRouterFlowMeterNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterFlowMeterNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVRouterFlowMeterNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -33919,13 +34922,15 @@ abstract class ApiHelper { } - def rebootBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RebootBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RebootBaremetalInstanceAction() + def queryVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterOspfAreaAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVRouterOspfAreaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -33946,13 +34951,15 @@ abstract class ApiHelper { } - def rebootEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RebootEcsInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RebootEcsInstanceAction() + def queryVRouterOspfNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterOspfNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVRouterOspfNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -33973,13 +34980,15 @@ abstract class ApiHelper { } - def rebootVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RebootVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RebootVmInstanceAction() + def queryVRouterRouteEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterRouteEntryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVRouterRouteEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34000,13 +35009,15 @@ abstract class ApiHelper { } - def reclaimSpaceFromImageStore(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReclaimSpaceFromImageStoreAction.class) Closure c) { - def a = new org.zstack.sdk.ReclaimSpaceFromImageStoreAction() + def queryVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVRouterRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVRouterRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34027,13 +35038,15 @@ abstract class ApiHelper { } - def reconnectAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectAppBuildSystemAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectAppBuildSystemAction() + def queryVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVipAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34054,13 +35067,15 @@ abstract class ApiHelper { } - def reconnectBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectBackupStorageAction() + def queryVirtualBorderRouterFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualBorderRouterFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVirtualBorderRouterFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34081,13 +35096,15 @@ abstract class ApiHelper { } - def reconnectBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBareMetal2GatewayAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectBareMetal2GatewayAction() + def queryVirtualRouterOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualRouterOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVirtualRouterOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34108,13 +35125,15 @@ abstract class ApiHelper { } - def reconnectBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBareMetal2InstanceAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectBareMetal2InstanceAction() + def queryVirtualRouterVRouterRouteTableRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualRouterVRouterRouteTableRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVirtualRouterVRouterRouteTableRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34135,13 +35154,15 @@ abstract class ApiHelper { } - def reconnectBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBaremetalPxeServerAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectBaremetalPxeServerAction() + def queryVirtualRouterVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVirtualRouterVmAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVirtualRouterVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34162,13 +35183,15 @@ abstract class ApiHelper { } - def reconnectConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectConsoleProxyAgentAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectConsoleProxyAgentAction() + def queryVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmCdRomAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmCdRomAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34189,13 +35212,15 @@ abstract class ApiHelper { } - def reconnectHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectHostAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectHostAction() + def queryVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34216,13 +35241,15 @@ abstract class ApiHelper { } - def reconnectIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectIPsecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectIPsecConnectionAction() + def queryVmInstanceDeviceAddressArchive(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceDeviceAddressArchiveAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmInstanceDeviceAddressArchiveAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34243,13 +35270,15 @@ abstract class ApiHelper { } - def reconnectImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectImageStoreBackupStorageAction() + def queryVmInstanceDeviceAddressGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceDeviceAddressGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmInstanceDeviceAddressGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34270,13 +35299,15 @@ abstract class ApiHelper { } - def reconnectPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectPrimaryStorageAction() + def queryVmInstanceMdevDeviceSpecRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstanceMdevDeviceSpecRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmInstanceMdevDeviceSpecRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34297,13 +35328,15 @@ abstract class ApiHelper { } - def reconnectSftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectSftpBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectSftpBackupStorageAction() + def queryVmInstancePciDeviceSpecRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmInstancePciDeviceSpecRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmInstancePciDeviceSpecRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34324,13 +35357,15 @@ abstract class ApiHelper { } - def reconnectVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectVirtualRouterAction.class) Closure c) { - def a = new org.zstack.sdk.ReconnectVirtualRouterAction() + def queryVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34351,13 +35386,15 @@ abstract class ApiHelper { } - def recoverBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RecoverBaremetalInstanceAction() + def queryVmNicInSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicInSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmNicInSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34378,13 +35415,15 @@ abstract class ApiHelper { } - def recoverDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverDataVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.RecoverDataVolumeAction() + def queryVmNicSecurityPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicSecurityPolicyAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmNicSecurityPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34405,13 +35444,15 @@ abstract class ApiHelper { } - def recoverImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverImageAction.class) Closure c) { - def a = new org.zstack.sdk.RecoverImageAction() + def queryVmPriorityConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmPriorityConfigAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmPriorityConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34432,13 +35473,15 @@ abstract class ApiHelper { } - def recoverResourceSplitBrain(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverResourceSplitBrainAction.class) Closure c) { - def a = new org.zstack.sdk.RecoverResourceSplitBrainAction() + def queryVmSchedHistory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedHistoryAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmSchedHistoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34459,13 +35502,15 @@ abstract class ApiHelper { } - def recoverVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RecoverVmInstanceAction() + def queryVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedulingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmSchedulingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34486,13 +35531,15 @@ abstract class ApiHelper { } - def recoveryImageFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoveryImageFromImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.RecoveryImageFromImageStoreBackupStorageAction() + def queryVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34513,13 +35560,15 @@ abstract class ApiHelper { } - def recoveryVirtualBorderRouterRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoveryVirtualBorderRouterRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.RecoveryVirtualBorderRouterRemoteAction() + def queryVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmUserDefinedXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmUserDefinedXmlHookScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34540,13 +35589,44 @@ abstract class ApiHelper { } - def refreshCaptcha(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshCaptchaAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshCaptchaAction() + def queryVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVniRangeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVniRangeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVolumeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34567,13 +35647,15 @@ abstract class ApiHelper { } - def refreshFiberChannelStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshFiberChannelStorageAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshFiberChannelStorageAction() + def queryVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34594,13 +35676,15 @@ abstract class ApiHelper { } - def refreshFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshFirewallAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshFirewallAction() + def queryVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVolumeSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34621,13 +35705,15 @@ abstract class ApiHelper { } - def refreshGuestOsMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshGuestOsMetadataAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshGuestOsMetadataAction() + def queryVolumeSnapshotTree(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVolumeSnapshotTreeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVolumeSnapshotTreeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34648,13 +35734,15 @@ abstract class ApiHelper { } - def refreshIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshIscsiServerAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshIscsiServerAction() + def queryVpcFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcFirewallAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcFirewallAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34675,40 +35763,15 @@ abstract class ApiHelper { } - def refreshLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshLoadBalancerAction() + def queryVpcFirewallVRouterRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcFirewallVRouterRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcFirewallVRouterRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } - 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 refreshLocalRaid(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshLocalRaidAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshLocalRaidAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid - c.resolveStrategy = Closure.OWNER_FIRST - c.delegate = a - c() - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34729,13 +35792,15 @@ abstract class ApiHelper { } - def refreshNvmeTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshNvmeTargetAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshNvmeTargetAction() + def queryVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcHaGroupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcHaGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34756,13 +35821,15 @@ abstract class ApiHelper { } - def refreshSearchIndexes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSearchIndexesAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshSearchIndexesAction() + def queryVpcHaGroupNetworkServiceRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcHaGroupNetworkServiceRefAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcHaGroupNetworkServiceRefAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34783,13 +35850,15 @@ abstract class ApiHelper { } - def refreshSharedblockDeviceCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSharedblockDeviceCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.RefreshSharedblockDeviceCapacityAction() + def queryVpcIkeConfigFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcIkeConfigFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcIkeConfigFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34810,13 +35879,15 @@ abstract class ApiHelper { } - def registerLicenseRequestedApplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RegisterLicenseRequestedApplicationAction.class) Closure c) { - def a = new org.zstack.sdk.RegisterLicenseRequestedApplicationAction() + def queryVpcIpSecConfigFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcIpSecConfigFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcIpSecConfigFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34837,13 +35908,15 @@ abstract class ApiHelper { } - def reimageVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReimageVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.ReimageVmInstanceAction() + def queryVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcRouterAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34864,13 +35937,15 @@ abstract class ApiHelper { } - def reloadElaboration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReloadElaborationAction.class) Closure c) { - def a = new org.zstack.sdk.ReloadElaborationAction() + def queryVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcSharedQosAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcSharedQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34891,13 +35966,15 @@ abstract class ApiHelper { } - def reloadExternalService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReloadExternalServiceAction.class) Closure c) { - def a = new org.zstack.sdk.ReloadExternalServiceAction() + def queryVpcSnatState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcSnatStateAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcSnatStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34918,13 +35995,15 @@ abstract class ApiHelper { } - def reloadLicense(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReloadLicenseAction.class) Closure c) { - def a = new org.zstack.sdk.ReloadLicenseAction() + def queryVpcUserVpnGatewayFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcUserVpnGatewayFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcUserVpnGatewayFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34945,13 +36024,15 @@ abstract class ApiHelper { } - def removeAccessControlListEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveAccessControlListEntryAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveAccessControlListEntryAction() + def queryVpcVpnConnectionFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcVpnConnectionFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcVpnConnectionFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34972,13 +36053,15 @@ abstract class ApiHelper { } - def removeAccessControlListFromLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveAccessControlListFromLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveAccessControlListFromLoadBalancerAction() + def queryVpcVpnGatewayFromLocal(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcVpnGatewayFromLocalAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcVpnGatewayFromLocalAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -34999,13 +36082,15 @@ abstract class ApiHelper { } - def removeBackendServerFromServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveBackendServerFromServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveBackendServerFromServerGroupAction() + def queryVtep(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVtepAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVtepAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35026,13 +36111,15 @@ abstract class ApiHelper { } - def removeCertificateFromLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveCertificateFromLoadBalancerListenerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveCertificateFromLoadBalancerListenerAction() + def queryWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryWebhookAction.class) Closure c) { + def a = new org.zstack.sdk.QueryWebhookAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35053,13 +36140,15 @@ abstract class ApiHelper { } - def removeDnsFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveDnsFromL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveDnsFromL3NetworkAction() + def queryXskyBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryXskyBlockVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.QueryXskyBlockVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35080,13 +36169,15 @@ abstract class ApiHelper { } - def removeDnsFromVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveDnsFromVpcRouterAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveDnsFromVpcRouterAction() + def queryZBox(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZBoxAction.class) Closure c) { + def a = new org.zstack.sdk.QueryZBoxAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35107,13 +36198,15 @@ abstract class ApiHelper { } - def removeHostRouteFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveHostRouteFromL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveHostRouteFromL3NetworkAction() + def queryZBoxBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZBoxBackupAction.class) Closure c) { + def a = new org.zstack.sdk.QueryZBoxBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35134,13 +36227,15 @@ abstract class ApiHelper { } - def removeMdevDeviceSpecFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveMdevDeviceSpecFromVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveMdevDeviceSpecFromVmInstanceAction() + def queryZdfs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZdfsAction.class) Closure c) { + def a = new org.zstack.sdk.QueryZdfsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35161,13 +36256,15 @@ abstract class ApiHelper { } - def removeMonFromCephBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveMonFromCephBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveMonFromCephBackupStorageAction() + def queryZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryZoneAction.class) Closure c) { + def a = new org.zstack.sdk.QueryZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -35188,8 +36285,8 @@ abstract class ApiHelper { } - def removeMonFromCephPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveMonFromCephPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveMonFromCephPrimaryStorageAction() + def rebootBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RebootBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RebootBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35215,8 +36312,8 @@ abstract class ApiHelper { } - def removePciDeviceSpecFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemovePciDeviceSpecFromVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.RemovePciDeviceSpecFromVmInstanceAction() + def rebootEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RebootEcsInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RebootEcsInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35242,8 +36339,8 @@ abstract class ApiHelper { } - def removeRemoteCidrsFromIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveRemoteCidrsFromIPsecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveRemoteCidrsFromIPsecConnectionAction() + def rebootVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RebootVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RebootVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35269,8 +36366,8 @@ abstract class ApiHelper { } - def removeRendezvousPointFromMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveRendezvousPointFromMulticastRouterAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveRendezvousPointFromMulticastRouterAction() + def reclaimSpaceFromImageStore(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReclaimSpaceFromImageStoreAction.class) Closure c) { + def a = new org.zstack.sdk.ReclaimSpaceFromImageStoreAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35296,8 +36393,8 @@ abstract class ApiHelper { } - def removeResourcesFromDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveResourcesFromDirectoryAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveResourcesFromDirectoryAction() + def reconnectAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectAppBuildSystemAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectAppBuildSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35323,8 +36420,8 @@ abstract class ApiHelper { } - def removeSchedulerJobFromSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSchedulerJobFromSchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveSchedulerJobFromSchedulerTriggerAction() + def reconnectBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35350,8 +36447,8 @@ abstract class ApiHelper { } - def removeSchedulerJobGroupFromSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSchedulerJobGroupFromSchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveSchedulerJobGroupFromSchedulerTriggerAction() + def reconnectBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBareMetal2GatewayAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectBareMetal2GatewayAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35377,8 +36474,8 @@ abstract class ApiHelper { } - def removeSchedulerJobsFromSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSchedulerJobsFromSchedulerJobGroupAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveSchedulerJobsFromSchedulerJobGroupAction() + def reconnectBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBareMetal2InstanceAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectBareMetal2InstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35404,8 +36501,8 @@ abstract class ApiHelper { } - def removeSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSdnControllerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveSdnControllerAction() + def reconnectBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectBaremetalPxeServerAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectBaremetalPxeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35431,8 +36528,8 @@ abstract class ApiHelper { } - def removeServerGroupFromLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveServerGroupFromLoadBalancerListenerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveServerGroupFromLoadBalancerListenerAction() + def reconnectConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectConsoleProxyAgentAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectConsoleProxyAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35458,8 +36555,8 @@ abstract class ApiHelper { } - def removeUserFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveUserFromGroupAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveUserFromGroupAction() + def reconnectHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectHostAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35485,8 +36582,8 @@ abstract class ApiHelper { } - def removeVRouterNetworksFromFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVRouterNetworksFromFlowMeterAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveVRouterNetworksFromFlowMeterAction() + def reconnectIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectIPsecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35512,8 +36609,8 @@ abstract class ApiHelper { } - def removeVRouterNetworksFromOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVRouterNetworksFromOspfAreaAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveVRouterNetworksFromOspfAreaAction() + def reconnectImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35539,8 +36636,8 @@ abstract class ApiHelper { } - def removeVmFromAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVmFromAffinityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveVmFromAffinityGroupAction() + def reconnectPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35566,8 +36663,8 @@ abstract class ApiHelper { } - def removeVmNicFromLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVmNicFromLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveVmNicFromLoadBalancerAction() + def reconnectSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectSdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectSdnControllerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35593,8 +36690,8 @@ abstract class ApiHelper { } - def removeVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVmSchedulingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.RemoveVmSchedulingRuleAction() + def reconnectSftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectSftpBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectSftpBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35620,8 +36717,8 @@ abstract class ApiHelper { } - def renewSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RenewSessionAction.class) Closure c) { - def a = new org.zstack.sdk.RenewSessionAction() + def reconnectVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectVirtualRouterAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectVirtualRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35647,8 +36744,8 @@ abstract class ApiHelper { } - def requestConsoleAccess(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RequestConsoleAccessAction.class) Closure c) { - def a = new org.zstack.sdk.RequestConsoleAccessAction() + def reconnectZdfs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectZdfsAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectZdfsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35674,8 +36771,8 @@ abstract class ApiHelper { } - def rerunLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RerunLongJobAction.class) Closure c) { - def a = new org.zstack.sdk.RerunLongJobAction() + def recoverBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RecoverBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35701,8 +36798,8 @@ abstract class ApiHelper { } - def resetGlobalConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResetGlobalConfigAction.class) Closure c) { - def a = new org.zstack.sdk.ResetGlobalConfigAction() + def recoverDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverDataVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.RecoverDataVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35728,8 +36825,8 @@ abstract class ApiHelper { } - def resetTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResetTemplateConfigAction.class) Closure c) { - def a = new org.zstack.sdk.ResetTemplateConfigAction() + def recoverImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverImageAction.class) Closure c) { + def a = new org.zstack.sdk.RecoverImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35755,8 +36852,8 @@ abstract class ApiHelper { } - def resetTwoFactorAuthenticationSecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResetTwoFactorAuthenticationSecretAction.class) Closure c) { - def a = new org.zstack.sdk.ResetTwoFactorAuthenticationSecretAction() + def recoverResourceSplitBrain(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverResourceSplitBrainAction.class) Closure c) { + def a = new org.zstack.sdk.RecoverResourceSplitBrainAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35782,8 +36879,8 @@ abstract class ApiHelper { } - def resizeDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResizeDataVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.ResizeDataVolumeAction() + def recoverVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoverVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RecoverVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35809,8 +36906,8 @@ abstract class ApiHelper { } - def resizeRootVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResizeRootVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.ResizeRootVolumeAction() + def recoveryImageFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoveryImageFromImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.RecoveryImageFromImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35836,8 +36933,8 @@ abstract class ApiHelper { } - def restartResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RestartResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.RestartResourceStackAction() + def recoveryVirtualBorderRouterRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RecoveryVirtualBorderRouterRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.RecoveryVirtualBorderRouterRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35863,9 +36960,9 @@ abstract class ApiHelper { } - def resumeLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResumeLongJobAction.class) Closure c) { - def a = new org.zstack.sdk.ResumeLongJobAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def refreshCaptcha(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshCaptchaAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshCaptchaAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -35890,8 +36987,8 @@ abstract class ApiHelper { } - def resumeVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResumeVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.ResumeVmInstanceAction() + def refreshFiberChannelStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshFiberChannelStorageAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshFiberChannelStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35917,8 +37014,8 @@ abstract class ApiHelper { } - def revertTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertTemplateConfigAction.class) Closure c) { - def a = new org.zstack.sdk.RevertTemplateConfigAction() + def refreshFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshFirewallAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshFirewallAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35944,8 +37041,8 @@ abstract class ApiHelper { } - def revertVmFromCdpBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertVmFromCdpBackupAction.class) Closure c) { - def a = new org.zstack.sdk.RevertVmFromCdpBackupAction() + def refreshGuestOsMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshGuestOsMetadataAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshGuestOsMetadataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35971,8 +37068,8 @@ abstract class ApiHelper { } - def revertVmFromSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertVmFromSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.RevertVmFromSnapshotGroupAction() + def refreshIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshIscsiServerAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshIscsiServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -35998,8 +37095,8 @@ abstract class ApiHelper { } - def revertVolumeFromSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertVolumeFromSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.RevertVolumeFromSnapshotAction() + def refreshLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36025,8 +37122,8 @@ abstract class ApiHelper { } - def revokeResourceSharing(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevokeResourceSharingAction.class) Closure c) { - def a = new org.zstack.sdk.RevokeResourceSharingAction() + def refreshLocalRaid(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshLocalRaidAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshLocalRaidAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36052,8 +37149,8 @@ abstract class ApiHelper { } - def runIAM2Script(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RunIAM2ScriptAction.class) Closure c) { - def a = new org.zstack.sdk.RunIAM2ScriptAction() + def refreshNvmeTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshNvmeTargetAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshNvmeTargetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36079,8 +37176,8 @@ abstract class ApiHelper { } - def runSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RunSchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.RunSchedulerTriggerAction() + def refreshPluginDrivers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshPluginDriversAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshPluginDriversAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36106,8 +37203,8 @@ abstract class ApiHelper { } - def securityMachineDetectSync(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SecurityMachineDetectSyncAction.class) Closure c) { - def a = new org.zstack.sdk.SecurityMachineDetectSyncAction() + def refreshSSOServerToken(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSSOServerTokenAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshSSOServerTokenAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36133,8 +37230,8 @@ abstract class ApiHelper { } - def securityMachineEncrypt(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SecurityMachineEncryptAction.class) Closure c) { - def a = new org.zstack.sdk.SecurityMachineEncryptAction() + def refreshSearchIndexes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSearchIndexesAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshSearchIndexesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36160,8 +37257,8 @@ abstract class ApiHelper { } - def selfTestLocalRaid(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SelfTestLocalRaidAction.class) Closure c) { - def a = new org.zstack.sdk.SelfTestLocalRaidAction() + def refreshSharedblockDeviceCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RefreshSharedblockDeviceCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.RefreshSharedblockDeviceCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36187,8 +37284,8 @@ abstract class ApiHelper { } - def setFlowMeterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetFlowMeterRouterIdAction.class) Closure c) { - def a = new org.zstack.sdk.SetFlowMeterRouterIdAction() + def registerLicenseRequestedApplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RegisterLicenseRequestedApplicationAction.class) Closure c) { + def a = new org.zstack.sdk.RegisterLicenseRequestedApplicationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36214,8 +37311,8 @@ abstract class ApiHelper { } - def setImageBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageBootModeAction.class) Closure c) { - def a = new org.zstack.sdk.SetImageBootModeAction() + def reimageVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReimageVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.ReimageVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36241,8 +37338,8 @@ abstract class ApiHelper { } - def setImageQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageQgaAction.class) Closure c) { - def a = new org.zstack.sdk.SetImageQgaAction() + def reloadElaboration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReloadElaborationAction.class) Closure c) { + def a = new org.zstack.sdk.ReloadElaborationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36268,8 +37365,8 @@ abstract class ApiHelper { } - def setImageSecurityLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageSecurityLevelAction.class) Closure c) { - def a = new org.zstack.sdk.SetImageSecurityLevelAction() + def reloadExternalService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReloadExternalServiceAction.class) Closure c) { + def a = new org.zstack.sdk.ReloadExternalServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36295,8 +37392,8 @@ abstract class ApiHelper { } - def setImageStoreBackupStorageQuota(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageStoreBackupStorageQuotaAction.class) Closure c) { - def a = new org.zstack.sdk.SetImageStoreBackupStorageQuotaAction() + def reloadLicense(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReloadLicenseAction.class) Closure c) { + def a = new org.zstack.sdk.ReloadLicenseAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36322,8 +37419,8 @@ abstract class ApiHelper { } - def setIpOnHostNetworkBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetIpOnHostNetworkBondingAction.class) Closure c) { - def a = new org.zstack.sdk.SetIpOnHostNetworkBondingAction() + def removeAccessControlListEntry(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveAccessControlListEntryAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveAccessControlListEntryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36349,8 +37446,8 @@ abstract class ApiHelper { } - def setIpOnHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetIpOnHostNetworkInterfaceAction.class) Closure c) { - def a = new org.zstack.sdk.SetIpOnHostNetworkInterfaceAction() + def removeAccessControlListFromLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveAccessControlListFromLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveAccessControlListFromLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36376,8 +37473,8 @@ abstract class ApiHelper { } - def setL3NetworkMtu(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetL3NetworkMtuAction.class) Closure c) { - def a = new org.zstack.sdk.SetL3NetworkMtuAction() + def removeBackendServerFromServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveBackendServerFromServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveBackendServerFromServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36403,8 +37500,8 @@ abstract class ApiHelper { } - def setL3NetworkRouterInterfaceIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetL3NetworkRouterInterfaceIpAction.class) Closure c) { - def a = new org.zstack.sdk.SetL3NetworkRouterInterfaceIpAction() + def removeCertificateFromLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveCertificateFromLoadBalancerListenerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveCertificateFromLoadBalancerListenerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36430,8 +37527,8 @@ abstract class ApiHelper { } - def setNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetNicQosAction.class) Closure c) { - def a = new org.zstack.sdk.SetNicQosAction() + def removeDnsFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveDnsFromL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveDnsFromL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36457,8 +37554,8 @@ abstract class ApiHelper { } - def setSecurityMachineKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetSecurityMachineKeyAction.class) Closure c) { - def a = new org.zstack.sdk.SetSecurityMachineKeyAction() + def removeDnsFromVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveDnsFromVpcRouterAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveDnsFromVpcRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36484,8 +37581,8 @@ abstract class ApiHelper { } - def setServiceTypeOnHostNetworkBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetServiceTypeOnHostNetworkBondingAction.class) Closure c) { - def a = new org.zstack.sdk.SetServiceTypeOnHostNetworkBondingAction() + def removeHostRouteFromL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveHostRouteFromL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveHostRouteFromL3NetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36511,8 +37608,8 @@ abstract class ApiHelper { } - def setServiceTypeOnHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetServiceTypeOnHostNetworkInterfaceAction.class) Closure c) { - def a = new org.zstack.sdk.SetServiceTypeOnHostNetworkInterfaceAction() + def removeMdevDeviceSpecFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveMdevDeviceSpecFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveMdevDeviceSpecFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36538,8 +37635,8 @@ abstract class ApiHelper { } - def setVRouterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVRouterRouterIdAction.class) Closure c) { - def a = new org.zstack.sdk.SetVRouterRouterIdAction() + def removeMonFromCephBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveMonFromCephBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveMonFromCephBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36565,8 +37662,8 @@ abstract class ApiHelper { } - def setVipQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVipQosAction.class) Closure c) { - def a = new org.zstack.sdk.SetVipQosAction() + def removeMonFromCephPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveMonFromCephPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveMonFromCephPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36592,8 +37689,8 @@ abstract class ApiHelper { } - def setVmBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmBootModeAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmBootModeAction() + def removePciDeviceSpecFromVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemovePciDeviceSpecFromVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.RemovePciDeviceSpecFromVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36619,8 +37716,8 @@ abstract class ApiHelper { } - def setVmBootOrder(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmBootOrderAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmBootOrderAction() + def removeRemoteCidrsFromIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveRemoteCidrsFromIPsecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveRemoteCidrsFromIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36646,8 +37743,8 @@ abstract class ApiHelper { } - def setVmBootVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmBootVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmBootVolumeAction() + def removeRendezvousPointFromMulticastRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveRendezvousPointFromMulticastRouterAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveRendezvousPointFromMulticastRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36673,8 +37770,8 @@ abstract class ApiHelper { } - def setVmCleanTraffic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmCleanTrafficAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmCleanTrafficAction() + def removeResourcesFromDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveResourcesFromDirectoryAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveResourcesFromDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36700,8 +37797,8 @@ abstract class ApiHelper { } - def setVmClockTrack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmClockTrackAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmClockTrackAction() + def removeSchedulerJobFromSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSchedulerJobFromSchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveSchedulerJobFromSchedulerTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36727,8 +37824,8 @@ abstract class ApiHelper { } - def setVmConsoleMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmConsoleModeAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmConsoleModeAction() + def removeSchedulerJobGroupFromSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSchedulerJobGroupFromSchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveSchedulerJobGroupFromSchedulerTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36754,8 +37851,8 @@ abstract class ApiHelper { } - def setVmConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmConsolePasswordAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmConsolePasswordAction() + def removeSchedulerJobsFromSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSchedulerJobsFromSchedulerJobGroupAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveSchedulerJobsFromSchedulerJobGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36781,8 +37878,8 @@ abstract class ApiHelper { } - def setVmEmulatorPinning(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmEmulatorPinningAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmEmulatorPinningAction() + def removeSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveSdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveSdnControllerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36808,8 +37905,8 @@ abstract class ApiHelper { } - def setVmHostname(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmHostnameAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmHostnameAction() + def removeServerGroupFromLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveServerGroupFromLoadBalancerListenerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveServerGroupFromLoadBalancerListenerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36835,8 +37932,8 @@ abstract class ApiHelper { } - def setVmInstanceDefaultCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmInstanceDefaultCdRomAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmInstanceDefaultCdRomAction() + def removeUserFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveUserFromGroupAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveUserFromGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36862,8 +37959,8 @@ abstract class ApiHelper { } - def setVmInstanceHaLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmInstanceHaLevelAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmInstanceHaLevelAction() + def removeVRouterNetworksFromFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVRouterNetworksFromFlowMeterAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveVRouterNetworksFromFlowMeterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36889,8 +37986,8 @@ abstract class ApiHelper { } - def setVmMonitorNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmMonitorNumberAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmMonitorNumberAction() + def removeVRouterNetworksFromOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVRouterNetworksFromOspfAreaAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveVRouterNetworksFromOspfAreaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36916,8 +38013,8 @@ abstract class ApiHelper { } - def setVmNicSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmNicSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmNicSecurityGroupAction() + def removeVmFromAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVmFromAffinityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveVmFromAffinityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36943,8 +38040,8 @@ abstract class ApiHelper { } - def setVmNuma(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmNumaAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmNumaAction() + def removeVmNicFromLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVmNicFromLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveVmNicFromLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36970,8 +38067,8 @@ abstract class ApiHelper { } - def setVmQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmQgaAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmQgaAction() + def removeVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveVmSchedulingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveVmSchedulingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -36997,8 +38094,8 @@ abstract class ApiHelper { } - def setVmQxlMemory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmQxlMemoryAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmQxlMemoryAction() + def renewSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RenewSessionAction.class) Closure c) { + def a = new org.zstack.sdk.RenewSessionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37024,8 +38121,8 @@ abstract class ApiHelper { } - def setVmRDP(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmRDPAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmRDPAction() + def requestConsoleAccess(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RequestConsoleAccessAction.class) Closure c) { + def a = new org.zstack.sdk.RequestConsoleAccessAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37051,8 +38148,8 @@ abstract class ApiHelper { } - def setVmSecurityLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmSecurityLevelAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmSecurityLevelAction() + def rerunLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RerunLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.RerunLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37078,8 +38175,8 @@ abstract class ApiHelper { } - def setVmSoundType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmSoundTypeAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmSoundTypeAction() + def resetGlobalConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResetGlobalConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ResetGlobalConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37105,8 +38202,8 @@ abstract class ApiHelper { } - def setVmSshKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmSshKeyAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmSshKeyAction() + def resetTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResetTemplateConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ResetTemplateConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37132,8 +38229,8 @@ abstract class ApiHelper { } - def setVmStaticIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmStaticIpAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmStaticIpAction() + def resetTwoFactorAuthenticationSecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResetTwoFactorAuthenticationSecretAction.class) Closure c) { + def a = new org.zstack.sdk.ResetTwoFactorAuthenticationSecretAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37159,8 +38256,8 @@ abstract class ApiHelper { } - def setVmUsbRedirect(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmUsbRedirectAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmUsbRedirectAction() + def resizeDataVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResizeDataVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.ResizeDataVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37186,8 +38283,8 @@ abstract class ApiHelper { } - def setVmUserDefinedXml(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmUserDefinedXmlAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmUserDefinedXmlAction() + def resizeRootVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResizeRootVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.ResizeRootVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37213,8 +38310,8 @@ abstract class ApiHelper { } - def setVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmUserDefinedXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.SetVmUserDefinedXmlHookScriptAction() + def restartModelServiceGroups(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RestartModelServiceGroupsAction.class) Closure c) { + def a = new org.zstack.sdk.RestartModelServiceGroupsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37240,8 +38337,8 @@ abstract class ApiHelper { } - def setVolumeIoThreadPin(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVolumeIoThreadPinAction.class) Closure c) { - def a = new org.zstack.sdk.SetVolumeIoThreadPinAction() + def restartResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RestartResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.RestartResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37267,8 +38364,8 @@ abstract class ApiHelper { } - def setVolumeQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVolumeQosAction.class) Closure c) { - def a = new org.zstack.sdk.SetVolumeQosAction() + def resumeLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResumeLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.ResumeLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37294,8 +38391,8 @@ abstract class ApiHelper { } - def setVpcVRouterDistributedRoutingEnabled(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVpcVRouterDistributedRoutingEnabledAction.class) Closure c) { - def a = new org.zstack.sdk.SetVpcVRouterDistributedRoutingEnabledAction() + def resumeVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ResumeVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.ResumeVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37321,8 +38418,8 @@ abstract class ApiHelper { } - def setVpcVRouterNetworkServiceState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVpcVRouterNetworkServiceStateAction.class) Closure c) { - def a = new org.zstack.sdk.SetVpcVRouterNetworkServiceStateAction() + def revertTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertTemplateConfigAction.class) Closure c) { + def a = new org.zstack.sdk.RevertTemplateConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37348,8 +38445,8 @@ abstract class ApiHelper { } - def shareResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ShareResourceAction.class) Closure c) { - def a = new org.zstack.sdk.ShareResourceAction() + def revertVmFromCdpBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertVmFromCdpBackupAction.class) Closure c) { + def a = new org.zstack.sdk.RevertVmFromCdpBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37375,8 +38472,8 @@ abstract class ApiHelper { } - def shrinkVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ShrinkVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.ShrinkVolumeSnapshotAction() + def revertVmFromSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertVmFromSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.RevertVmFromSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37402,8 +38499,8 @@ abstract class ApiHelper { } - def shutdownHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ShutdownHostAction.class) Closure c) { - def a = new org.zstack.sdk.ShutdownHostAction() + def revertVolumeFromSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevertVolumeFromSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.RevertVolumeFromSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37429,8 +38526,8 @@ abstract class ApiHelper { } - def startBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBareMetal2InstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StartBareMetal2InstanceAction() + def revokeResourceSharing(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RevokeResourceSharingAction.class) Closure c) { + def a = new org.zstack.sdk.RevokeResourceSharingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37456,8 +38553,62 @@ abstract class ApiHelper { } - def startBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StartBaremetalInstanceAction() + def runIAM2Script(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RunIAM2ScriptAction.class) Closure c) { + def a = new org.zstack.sdk.RunIAM2ScriptAction() + 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 runSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RunSchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.RunSchedulerTriggerAction() + 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 sdnControllerAddHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SdnControllerAddHostAction.class) Closure c) { + def a = new org.zstack.sdk.SdnControllerAddHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37483,8 +38634,8 @@ abstract class ApiHelper { } - def startBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBaremetalPxeServerAction.class) Closure c) { - def a = new org.zstack.sdk.StartBaremetalPxeServerAction() + def sdnControllerChangeHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SdnControllerChangeHostAction.class) Closure c) { + def a = new org.zstack.sdk.SdnControllerChangeHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37510,8 +38661,8 @@ abstract class ApiHelper { } - def startConnectionBetweenAliyunRouterInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartConnectionBetweenAliyunRouterInterfaceAction.class) Closure c) { - def a = new org.zstack.sdk.StartConnectionBetweenAliyunRouterInterfaceAction() + def sdnControllerRemoveHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SdnControllerRemoveHostAction.class) Closure c) { + def a = new org.zstack.sdk.SdnControllerRemoveHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37537,8 +38688,8 @@ abstract class ApiHelper { } - def startDataProtection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartDataProtectionAction.class) Closure c) { - def a = new org.zstack.sdk.StartDataProtectionAction() + def securityMachineDetectSync(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SecurityMachineDetectSyncAction.class) Closure c) { + def a = new org.zstack.sdk.SecurityMachineDetectSyncAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37564,8 +38715,8 @@ abstract class ApiHelper { } - def startEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartEcsInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StartEcsInstanceAction() + def securityMachineEncrypt(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SecurityMachineEncryptAction.class) Closure c) { + def a = new org.zstack.sdk.SecurityMachineEncryptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37591,8 +38742,8 @@ abstract class ApiHelper { } - def startSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartSnmpAgentAction.class) Closure c) { - def a = new org.zstack.sdk.StartSnmpAgentAction() + def selfTestLocalRaid(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SelfTestLocalRaidAction.class) Closure c) { + def a = new org.zstack.sdk.SelfTestLocalRaidAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37618,8 +38769,8 @@ abstract class ApiHelper { } - def startVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StartVmInstanceAction() + def setFlowMeterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetFlowMeterRouterIdAction.class) Closure c) { + def a = new org.zstack.sdk.SetFlowMeterRouterIdAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37645,8 +38796,8 @@ abstract class ApiHelper { } - def stopBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StopBaremetalInstanceAction() + def setImageBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageBootModeAction.class) Closure c) { + def a = new org.zstack.sdk.SetImageBootModeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37672,8 +38823,8 @@ abstract class ApiHelper { } - def stopBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopBaremetalPxeServerAction.class) Closure c) { - def a = new org.zstack.sdk.StopBaremetalPxeServerAction() + def setImageQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageQgaAction.class) Closure c) { + def a = new org.zstack.sdk.SetImageQgaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37699,8 +38850,8 @@ abstract class ApiHelper { } - def stopEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopEcsInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StopEcsInstanceAction() + def setImageSecurityLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageSecurityLevelAction.class) Closure c) { + def a = new org.zstack.sdk.SetImageSecurityLevelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37726,8 +38877,8 @@ abstract class ApiHelper { } - def stopSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopSnmpAgentAction.class) Closure c) { - def a = new org.zstack.sdk.StopSnmpAgentAction() + def setImageStoreBackupStorageQuota(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetImageStoreBackupStorageQuotaAction.class) Closure c) { + def a = new org.zstack.sdk.SetImageStoreBackupStorageQuotaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37753,8 +38904,8 @@ abstract class ApiHelper { } - def stopVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.StopVmInstanceAction() + def setIpOnHostNetworkBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetIpOnHostNetworkBondingAction.class) Closure c) { + def a = new org.zstack.sdk.SetIpOnHostNetworkBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37780,8 +38931,8 @@ abstract class ApiHelper { } - def submitLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SubmitLongJobAction.class) Closure c) { - def a = new org.zstack.sdk.SubmitLongJobAction() + def setIpOnHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetIpOnHostNetworkInterfaceAction.class) Closure c) { + def a = new org.zstack.sdk.SetIpOnHostNetworkInterfaceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37807,8 +38958,8 @@ abstract class ApiHelper { } - def syncAliyunRouteEntryFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunRouteEntryFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncAliyunRouteEntryFromRemoteAction() + def setL3NetworkMtu(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetL3NetworkMtuAction.class) Closure c) { + def a = new org.zstack.sdk.SetL3NetworkMtuAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37834,8 +38985,8 @@ abstract class ApiHelper { } - def syncAliyunRouterInterfaceFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunRouterInterfaceFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncAliyunRouterInterfaceFromRemoteAction() + def setL3NetworkRouterInterfaceIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetL3NetworkRouterInterfaceIpAction.class) Closure c) { + def a = new org.zstack.sdk.SetL3NetworkRouterInterfaceIpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37861,8 +39012,8 @@ abstract class ApiHelper { } - def syncAliyunSnapshotRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunSnapshotRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncAliyunSnapshotRemoteAction() + def setNicQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetNicQosAction.class) Closure c) { + def a = new org.zstack.sdk.SetNicQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37888,8 +39039,8 @@ abstract class ApiHelper { } - def syncAliyunVirtualRouterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunVirtualRouterFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncAliyunVirtualRouterFromRemoteAction() + def setSecurityMachineKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetSecurityMachineKeyAction.class) Closure c) { + def a = new org.zstack.sdk.SetSecurityMachineKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37915,8 +39066,8 @@ abstract class ApiHelper { } - def syncChronyServers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncChronyServersAction.class) Closure c) { - def a = new org.zstack.sdk.SyncChronyServersAction() + def setServiceTypeOnHostNetworkBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetServiceTypeOnHostNetworkBondingAction.class) Closure c) { + def a = new org.zstack.sdk.SetServiceTypeOnHostNetworkBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37942,8 +39093,8 @@ abstract class ApiHelper { } - def syncConnectionAccessPointFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncConnectionAccessPointFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncConnectionAccessPointFromRemoteAction() + def setServiceTypeOnHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetServiceTypeOnHostNetworkInterfaceAction.class) Closure c) { + def a = new org.zstack.sdk.SetServiceTypeOnHostNetworkInterfaceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37969,8 +39120,8 @@ abstract class ApiHelper { } - def syncDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncDataCenterFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncDataCenterFromRemoteAction() + def setVRouterRouterId(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVRouterRouterIdAction.class) Closure c) { + def a = new org.zstack.sdk.SetVRouterRouterIdAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -37996,8 +39147,8 @@ abstract class ApiHelper { } - def syncDiskFromAliyunFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncDiskFromAliyunFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncDiskFromAliyunFromRemoteAction() + def setVipQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVipQosAction.class) Closure c) { + def a = new org.zstack.sdk.SetVipQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38023,8 +39174,8 @@ abstract class ApiHelper { } - def syncEcsImageFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsImageFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncEcsImageFromRemoteAction() + def setVmBootMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmBootModeAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmBootModeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38050,8 +39201,8 @@ abstract class ApiHelper { } - def syncEcsInstanceFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsInstanceFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncEcsInstanceFromRemoteAction() + def setVmBootOrder(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmBootOrderAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmBootOrderAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38077,8 +39228,8 @@ abstract class ApiHelper { } - def syncEcsSecurityGroupFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsSecurityGroupFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncEcsSecurityGroupFromRemoteAction() + def setVmBootVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmBootVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmBootVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38104,8 +39255,8 @@ abstract class ApiHelper { } - def syncEcsSecurityGroupRuleFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsSecurityGroupRuleFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncEcsSecurityGroupRuleFromRemoteAction() + def setVmCleanTraffic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmCleanTrafficAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmCleanTrafficAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38131,8 +39282,8 @@ abstract class ApiHelper { } - def syncEcsVSwitchFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsVSwitchFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncEcsVSwitchFromRemoteAction() + def setVmClockTrack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmClockTrackAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmClockTrackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38158,8 +39309,8 @@ abstract class ApiHelper { } - def syncEcsVpcFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsVpcFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncEcsVpcFromRemoteAction() + def setVmConsoleMode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmConsoleModeAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmConsoleModeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38185,8 +39336,8 @@ abstract class ApiHelper { } - def syncHybridEipFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncHybridEipFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncHybridEipFromRemoteAction() + def setVmConsolePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmConsolePasswordAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmConsolePasswordAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38212,8 +39363,8 @@ abstract class ApiHelper { } - def syncIdentityFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncIdentityFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncIdentityFromRemoteAction() + 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 c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38239,8 +39390,8 @@ abstract class ApiHelper { } - def syncImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageAction.class) Closure c) { - def a = new org.zstack.sdk.SyncImageAction() + def setVmHostname(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmHostnameAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmHostnameAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38266,8 +39417,8 @@ abstract class ApiHelper { } - def syncImageFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction() + def setVmInstanceDefaultCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmInstanceDefaultCdRomAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmInstanceDefaultCdRomAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38293,8 +39444,8 @@ abstract class ApiHelper { } - def syncImageSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageSizeAction.class) Closure c) { - def a = new org.zstack.sdk.SyncImageSizeAction() + def setVmInstanceHaLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmInstanceHaLevelAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmInstanceHaLevelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38320,8 +39471,8 @@ abstract class ApiHelper { } - def syncLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncLdapServerAction.class) Closure c) { - def a = new org.zstack.sdk.SyncLdapServerAction() + def setVmMonitorNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmMonitorNumberAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmMonitorNumberAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38347,8 +39498,8 @@ abstract class ApiHelper { } - def syncPrimaryStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncPrimaryStorageCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.SyncPrimaryStorageCapacityAction() + def setVmNicSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmNicSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmNicSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38374,8 +39525,8 @@ abstract class ApiHelper { } - def syncVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVCenterAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVCenterAction() + def setVmNuma(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmNumaAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmNumaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38401,8 +39552,8 @@ abstract class ApiHelper { } - def syncVirtualBorderRouterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVirtualBorderRouterFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVirtualBorderRouterFromRemoteAction() + def setVmQga(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmQgaAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmQgaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38428,8 +39579,8 @@ abstract class ApiHelper { } - def syncVmClock(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVmClockAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVmClockAction() + def setVmQxlMemory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmQxlMemoryAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmQxlMemoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38455,8 +39606,8 @@ abstract class ApiHelper { } - def syncVolumeSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVolumeSizeAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVolumeSizeAction() + def setVmRDP(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmRDPAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmRDPAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38482,8 +39633,8 @@ abstract class ApiHelper { } - def syncVpcUserVpnGatewayFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVpcUserVpnGatewayFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVpcUserVpnGatewayFromRemoteAction() + def setVmSecurityLevel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmSecurityLevelAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmSecurityLevelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38509,8 +39660,8 @@ abstract class ApiHelper { } - def syncVpcVpnConnectionFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVpcVpnConnectionFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVpcVpnConnectionFromRemoteAction() + def setVmSoundType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmSoundTypeAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmSoundTypeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38536,8 +39687,8 @@ abstract class ApiHelper { } - def syncVpcVpnGatewayFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVpcVpnGatewayFromRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.SyncVpcVpnGatewayFromRemoteAction() + def setVmSshKey(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmSshKeyAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmSshKeyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38563,8 +39714,8 @@ abstract class ApiHelper { } - def syncZBoxCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncZBoxCapacityAction.class) Closure c) { - def a = new org.zstack.sdk.SyncZBoxCapacityAction() + def setVmStaticIp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmStaticIpAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmStaticIpAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38590,8 +39741,8 @@ abstract class ApiHelper { } - def takeVmConsoleScreenshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TakeVmConsoleScreenshotAction.class) Closure c) { - def a = new org.zstack.sdk.TakeVmConsoleScreenshotAction() + def setVmUsbRedirect(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmUsbRedirectAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmUsbRedirectAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38617,8 +39768,8 @@ abstract class ApiHelper { } - def terminateVirtualBorderRouterRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TerminateVirtualBorderRouterRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.TerminateVirtualBorderRouterRemoteAction() + def setVmUserDefinedXml(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmUserDefinedXmlAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmUserDefinedXmlAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38644,9 +39795,36 @@ abstract class ApiHelper { } - def tokenIntrospection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TokenIntrospectionAction.class) Closure c) { - def a = new org.zstack.sdk.TokenIntrospectionAction() + def setVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVmUserDefinedXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.SetVmUserDefinedXmlHookScriptAction() + 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 setVolumeIoThreadPin(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVolumeIoThreadPinAction.class) Closure c) { + def a = new org.zstack.sdk.SetVolumeIoThreadPinAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -38671,8 +39849,8 @@ abstract class ApiHelper { } - def triggerGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TriggerGCJobAction.class) Closure c) { - def a = new org.zstack.sdk.TriggerGCJobAction() + def setVolumeQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVolumeQosAction.class) Closure c) { + def a = new org.zstack.sdk.SetVolumeQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38698,8 +39876,8 @@ abstract class ApiHelper { } - def undoSnapshotCreation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UndoSnapshotCreationAction.class) Closure c) { - def a = new org.zstack.sdk.UndoSnapshotCreationAction() + def setVpcVRouterDistributedRoutingEnabled(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVpcVRouterDistributedRoutingEnabledAction.class) Closure c) { + def a = new org.zstack.sdk.SetVpcVRouterDistributedRoutingEnabledAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38725,8 +39903,8 @@ abstract class ApiHelper { } - def ungenerateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateMdevDevicesAction.class) Closure c) { - def a = new org.zstack.sdk.UngenerateMdevDevicesAction() + def setVpcVRouterNetworkServiceState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SetVpcVRouterNetworkServiceStateAction.class) Closure c) { + def a = new org.zstack.sdk.SetVpcVRouterNetworkServiceStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38752,8 +39930,8 @@ abstract class ApiHelper { } - def ungenerateSeMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateSeMdevDevicesAction.class) Closure c) { - def a = new org.zstack.sdk.UngenerateSeMdevDevicesAction() + def shareResource(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ShareResourceAction.class) Closure c) { + def a = new org.zstack.sdk.ShareResourceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38779,8 +39957,8 @@ abstract class ApiHelper { } - def ungenerateSriovPciDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateSriovPciDevicesAction.class) Closure c) { - def a = new org.zstack.sdk.UngenerateSriovPciDevicesAction() + def shrinkVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ShrinkVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.ShrinkVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38806,8 +39984,8 @@ abstract class ApiHelper { } - def ungroupVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngroupVolumeSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UngroupVolumeSnapshotGroupAction() + def shutdownHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ShutdownHostAction.class) Closure c) { + def a = new org.zstack.sdk.ShutdownHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38833,8 +40011,8 @@ abstract class ApiHelper { } - def unlockIdentity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnlockIdentityAction.class) Closure c) { - def a = new org.zstack.sdk.UnlockIdentityAction() + def ssoClientPushData(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SsoClientPushDataAction.class) Closure c) { + def a = new org.zstack.sdk.SsoClientPushDataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38860,8 +40038,8 @@ abstract class ApiHelper { } - def unmountVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnmountVmInstanceRecoveryPointAction.class) Closure c) { - def a = new org.zstack.sdk.UnmountVmInstanceRecoveryPointAction() + def startBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBareMetal2InstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StartBareMetal2InstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38887,8 +40065,8 @@ abstract class ApiHelper { } - def unprotectVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnprotectVmInstanceRecoveryPointAction.class) Closure c) { - def a = new org.zstack.sdk.UnprotectVmInstanceRecoveryPointAction() + def startBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StartBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38914,8 +40092,8 @@ abstract class ApiHelper { } - def updateAccessControlRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAccessControlRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAccessControlRuleAction() + def startBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartBaremetalPxeServerAction.class) Closure c) { + def a = new org.zstack.sdk.StartBaremetalPxeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38941,8 +40119,8 @@ abstract class ApiHelper { } - def updateAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAccountAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAccountAction() + def startConnectionBetweenAliyunRouterInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartConnectionBetweenAliyunRouterInterfaceAction.class) Closure c) { + def a = new org.zstack.sdk.StartConnectionBetweenAliyunRouterInterfaceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38968,8 +40146,8 @@ abstract class ApiHelper { } - def updateAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAffinityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAffinityGroupAction() + def startDataProtection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartDataProtectionAction.class) Closure c) { + def a = new org.zstack.sdk.StartDataProtectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -38995,8 +40173,8 @@ abstract class ApiHelper { } - def updateAliyunDisk(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunDiskAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunDiskAction() + def startEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartEcsInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StartEcsInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39022,8 +40200,8 @@ abstract class ApiHelper { } - def updateAliyunEbsBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunEbsBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunEbsBackupStorageAction() + def startSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartSnmpAgentAction.class) Closure c) { + def a = new org.zstack.sdk.StartSnmpAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39049,8 +40227,8 @@ abstract class ApiHelper { } - def updateAliyunEbsPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunEbsPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunEbsPrimaryStorageAction() + def startVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StartVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StartVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39076,8 +40254,8 @@ abstract class ApiHelper { } - def updateAliyunKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunKeySecretAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunKeySecretAction() + def stopBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StopBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39103,8 +40281,8 @@ abstract class ApiHelper { } - def updateAliyunMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunMountTargetAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunMountTargetAction() + def stopBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopBaremetalPxeServerAction.class) Closure c) { + def a = new org.zstack.sdk.StopBaremetalPxeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39130,8 +40308,8 @@ abstract class ApiHelper { } - def updateAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunNasAccessGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunNasAccessGroupAction() + def stopEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopEcsInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StopEcsInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39157,8 +40335,8 @@ abstract class ApiHelper { } - def updateAliyunPanguPartition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunPanguPartitionAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunPanguPartitionAction() + def stopSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopSnmpAgentAction.class) Closure c) { + def a = new org.zstack.sdk.StopSnmpAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39184,8 +40362,8 @@ abstract class ApiHelper { } - def updateAliyunProxyVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunProxyVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunProxyVSwitchAction() + def stopVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.StopVmInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.StopVmInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39211,8 +40389,8 @@ abstract class ApiHelper { } - def updateAliyunProxyVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunProxyVpcAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunProxyVpcAction() + def submitLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SubmitLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.SubmitLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39238,8 +40416,8 @@ abstract class ApiHelper { } - def updateAliyunRouteInterfaceRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunRouteInterfaceRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunRouteInterfaceRemoteAction() + def syncAINginxConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAINginxConfigurationAction.class) Closure c) { + def a = new org.zstack.sdk.SyncAINginxConfigurationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39265,8 +40443,8 @@ abstract class ApiHelper { } - def updateAliyunSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunSnapshotAction() + def syncAliyunRouteEntryFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunRouteEntryFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncAliyunRouteEntryFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39292,8 +40470,8 @@ abstract class ApiHelper { } - def updateAliyunVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunVirtualRouterAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAliyunVirtualRouterAction() + def syncAliyunRouterInterfaceFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunRouterInterfaceFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncAliyunRouterInterfaceFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39319,8 +40497,8 @@ abstract class ApiHelper { } - def updateAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAppBuildSystemAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAppBuildSystemAction() + def syncAliyunSnapshotRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunSnapshotRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncAliyunSnapshotRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39346,8 +40524,8 @@ abstract class ApiHelper { } - def updateAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAutoScalingGroupAction() + def syncAliyunVirtualRouterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncAliyunVirtualRouterFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncAliyunVirtualRouterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39373,8 +40551,8 @@ abstract class ApiHelper { } - def updateAutoScalingGroupAddingNewInstanceRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupAddingNewInstanceRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAutoScalingGroupAddingNewInstanceRuleAction() + def syncChronyServers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncChronyServersAction.class) Closure c) { + def a = new org.zstack.sdk.SyncChronyServersAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39400,8 +40578,8 @@ abstract class ApiHelper { } - def updateAutoScalingGroupInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAutoScalingGroupInstanceAction() + def syncConnectionAccessPointFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncConnectionAccessPointFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncConnectionAccessPointFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39427,8 +40605,8 @@ abstract class ApiHelper { } - def updateAutoScalingGroupRemovalInstanceRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupRemovalInstanceRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAutoScalingGroupRemovalInstanceRuleAction() + def syncContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.SyncContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39454,8 +40632,8 @@ abstract class ApiHelper { } - def updateAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAutoScalingRuleAction() + def syncDataCenterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncDataCenterFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncDataCenterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39481,8 +40659,8 @@ abstract class ApiHelper { } - def updateAutoScalingVmTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingVmTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateAutoScalingVmTemplateAction() + def syncDiskFromAliyunFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncDiskFromAliyunFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncDiskFromAliyunFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39508,8 +40686,8 @@ abstract class ApiHelper { } - def updateBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBackupStorageAction() + def syncEcsImageFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsImageFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncEcsImageFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39535,8 +40713,8 @@ abstract class ApiHelper { } - def updateBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ChassisAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2ChassisAction() + def syncEcsInstanceFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsInstanceFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncEcsInstanceFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39562,8 +40740,8 @@ abstract class ApiHelper { } - def updateBareMetal2ChassisOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ChassisOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2ChassisOfferingAction() + def syncEcsSecurityGroupFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsSecurityGroupFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncEcsSecurityGroupFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39589,8 +40767,8 @@ abstract class ApiHelper { } - def updateBareMetal2ChassisPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ChassisPciDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2ChassisPciDeviceAction() + def syncEcsSecurityGroupRuleFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsSecurityGroupRuleFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncEcsSecurityGroupRuleFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39616,8 +40794,8 @@ abstract class ApiHelper { } - def updateBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2GatewayAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2GatewayAction() + def syncEcsVSwitchFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsVSwitchFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncEcsVSwitchFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39643,8 +40821,8 @@ abstract class ApiHelper { } - def updateBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2InstanceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2InstanceAction() + def syncEcsVpcFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncEcsVpcFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncEcsVpcFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39670,8 +40848,8 @@ abstract class ApiHelper { } - def updateBareMetal2IpmiChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2IpmiChassisAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2IpmiChassisAction() + def syncHybridEipFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncHybridEipFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncHybridEipFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39697,8 +40875,8 @@ abstract class ApiHelper { } - def updateBareMetal2ProvisionNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ProvisionNetworkAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBareMetal2ProvisionNetworkAction() + def syncIdentityFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncIdentityFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncIdentityFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39724,8 +40902,8 @@ abstract class ApiHelper { } - def updateBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBaremetalChassisAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBaremetalChassisAction() + def syncImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageAction.class) Closure c) { + def a = new org.zstack.sdk.SyncImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39751,8 +40929,8 @@ abstract class ApiHelper { } - def updateBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBaremetalInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBaremetalInstanceAction() + def syncImageFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.SyncImageFromImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39778,8 +40956,8 @@ abstract class ApiHelper { } - def updateBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBaremetalPxeServerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBaremetalPxeServerAction() + def syncImageSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncImageSizeAction.class) Closure c) { + def a = new org.zstack.sdk.SyncImageSizeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39805,8 +40983,8 @@ abstract class ApiHelper { } - def updateBlockPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBlockPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBlockPrimaryStorageAction() + def syncLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncLdapServerAction.class) Closure c) { + def a = new org.zstack.sdk.SyncLdapServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39832,8 +41010,8 @@ abstract class ApiHelper { } - def updateBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBlockVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBlockVolumeAction() + def syncPrimaryStorageCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncPrimaryStorageCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.SyncPrimaryStorageCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39859,8 +41037,8 @@ abstract class ApiHelper { } - def updateBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBondingAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBondingAction() + def syncVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVCenterAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39886,8 +41064,8 @@ abstract class ApiHelper { } - def updateBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBuildAppAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateBuildAppAction() + def syncVirtualBorderRouterFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVirtualBorderRouterFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVirtualBorderRouterFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39913,8 +41091,8 @@ abstract class ApiHelper { } - def updateCCSCertificateUserState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCCSCertificateUserStateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCCSCertificateUserStateAction() + def syncVmClock(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVmClockAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVmClockAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39940,8 +41118,8 @@ abstract class ApiHelper { } - def updateCSPSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCSPSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCSPSecretResourcePoolAction() + def syncVolumeSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVolumeSizeAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVolumeSizeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39967,8 +41145,8 @@ abstract class ApiHelper { } - def updateCasClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCasClientAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCasClientAction() + def syncVpcUserVpnGatewayFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVpcUserVpnGatewayFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVpcUserVpnGatewayFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -39994,8 +41172,8 @@ abstract class ApiHelper { } - def updateCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCdpPolicyAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCdpPolicyAction() + def syncVpcVpnConnectionFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVpcVpnConnectionFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVpcVpnConnectionFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40021,8 +41199,8 @@ abstract class ApiHelper { } - def updateCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCdpTaskAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCdpTaskAction() + def syncVpcVpnGatewayFromRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVpcVpnGatewayFromRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVpcVpnGatewayFromRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40048,8 +41226,8 @@ abstract class ApiHelper { } - def updateCephBackupStorageMon(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCephBackupStorageMonAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCephBackupStorageMonAction() + def syncZBoxCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncZBoxCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.SyncZBoxCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40075,8 +41253,8 @@ abstract class ApiHelper { } - def updateCephPrimaryStorageMon(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCephPrimaryStorageMonAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCephPrimaryStorageMonAction() + def takeVmConsoleScreenshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TakeVmConsoleScreenshotAction.class) Closure c) { + def a = new org.zstack.sdk.TakeVmConsoleScreenshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40102,8 +41280,8 @@ abstract class ApiHelper { } - def updateCephPrimaryStoragePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCephPrimaryStoragePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCephPrimaryStoragePoolAction() + def terminateVirtualBorderRouterRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TerminateVirtualBorderRouterRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.TerminateVirtualBorderRouterRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40129,8 +41307,35 @@ abstract class ApiHelper { } - def updateCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCertificateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateCertificateAction() + def tokenIntrospection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TokenIntrospectionAction.class) Closure c) { + def a = new org.zstack.sdk.TokenIntrospectionAction() + + 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 triggerGCJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.TriggerGCJobAction.class) Closure c) { + def a = new org.zstack.sdk.TriggerGCJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40156,8 +41361,8 @@ abstract class ApiHelper { } - def updateChronyServers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateChronyServersAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateChronyServersAction() + def unbindModelFromService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnbindModelFromServiceAction.class) Closure c) { + def a = new org.zstack.sdk.UnbindModelFromServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40183,8 +41388,8 @@ abstract class ApiHelper { } - def updateCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateClusterAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateClusterAction() + def undoSnapshotCreation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UndoSnapshotCreationAction.class) Closure c) { + def a = new org.zstack.sdk.UndoSnapshotCreationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40210,8 +41415,8 @@ abstract class ApiHelper { } - def updateClusterDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateClusterDRSAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateClusterDRSAction() + def unexportNbdVolumes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnexportNbdVolumesAction.class) Closure c) { + def a = new org.zstack.sdk.UnexportNbdVolumesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40237,8 +41442,8 @@ abstract class ApiHelper { } - def updateClusterOS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateClusterOSAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateClusterOSAction() + def ungenerateMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateMdevDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.UngenerateMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40264,8 +41469,8 @@ abstract class ApiHelper { } - def updateConnectionBetweenL3NetWorkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction() + def ungenerateSeMdevDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateSeMdevDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.UngenerateSeMdevDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40291,8 +41496,8 @@ abstract class ApiHelper { } - def updateConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateConsoleProxyAgentAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateConsoleProxyAgentAction() + def ungenerateSriovPciDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngenerateSriovPciDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.UngenerateSriovPciDevicesAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40318,8 +41523,8 @@ abstract class ApiHelper { } - def updateDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDirectoryAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateDirectoryAction() + def ungroupVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UngroupVolumeSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UngroupVolumeSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40345,8 +41550,8 @@ abstract class ApiHelper { } - def updateDiskOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDiskOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateDiskOfferingAction() + def unlockIdentity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnlockIdentityAction.class) Closure c) { + def a = new org.zstack.sdk.UnlockIdentityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40372,8 +41577,8 @@ abstract class ApiHelper { } - def updateEcsImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsImageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEcsImageAction() + def unmountVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnmountVmInstanceRecoveryPointAction.class) Closure c) { + def a = new org.zstack.sdk.UnmountVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40399,8 +41604,8 @@ abstract class ApiHelper { } - def updateEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEcsInstanceAction() + def unprotectVmInstanceRecoveryPoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UnprotectVmInstanceRecoveryPointAction.class) Closure c) { + def a = new org.zstack.sdk.UnprotectVmInstanceRecoveryPointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40426,8 +41631,8 @@ abstract class ApiHelper { } - def updateEcsInstanceVncPassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsInstanceVncPasswordAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEcsInstanceVncPasswordAction() + def updateAccessControlList(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAccessControlListAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAccessControlListAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40453,8 +41658,8 @@ abstract class ApiHelper { } - def updateEcsSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEcsSecurityGroupAction() + def updateAccessControlRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAccessControlRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAccessControlRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40480,8 +41685,8 @@ abstract class ApiHelper { } - def updateEcsVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsVSwitchAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEcsVSwitchAction() + def updateAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAccountAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40507,8 +41712,8 @@ abstract class ApiHelper { } - def updateEcsVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsVpcAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEcsVpcAction() + def updateAffinityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAffinityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAffinityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40534,8 +41739,8 @@ abstract class ApiHelper { } - def updateEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEipAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEipAction() + def updateAliyunDisk(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunDiskAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunDiskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40561,8 +41766,8 @@ abstract class ApiHelper { } - def updateEmailMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEmailMediaAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEmailMediaAction() + def updateAliyunEbsBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunEbsBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunEbsBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40588,8 +41793,8 @@ abstract class ApiHelper { } - def updateEmailMonitorTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEmailMonitorTriggerActionAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateEmailMonitorTriggerActionAction() + def updateAliyunEbsPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunEbsPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunEbsPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40615,8 +41820,8 @@ abstract class ApiHelper { } - def updateExternalPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateExternalPrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateExternalPrimaryStorageAction() + def updateAliyunKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunKeySecretAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunKeySecretAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40642,8 +41847,8 @@ abstract class ApiHelper { } - def updateFactoryModeState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFactoryModeStateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFactoryModeStateAction() + def updateAliyunMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunMountTargetAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunMountTargetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40669,8 +41874,8 @@ abstract class ApiHelper { } - def updateFiSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFiSecSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFiSecSecretResourcePoolAction() + def updateAliyunNasAccessGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunNasAccessGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunNasAccessGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40696,8 +41901,8 @@ abstract class ApiHelper { } - def updateFiSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFiSecSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFiSecSecurityMachineAction() + def updateAliyunPanguPartition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunPanguPartitionAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunPanguPartitionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40723,8 +41928,8 @@ abstract class ApiHelper { } - def updateFirewallIpSetTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallIpSetTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFirewallIpSetTemplateAction() + def updateAliyunProxyVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunProxyVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunProxyVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40750,8 +41955,8 @@ abstract class ApiHelper { } - def updateFirewallRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFirewallRuleAction() + def updateAliyunProxyVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunProxyVpcAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunProxyVpcAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40777,8 +41982,8 @@ abstract class ApiHelper { } - def updateFirewallRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFirewallRuleSetAction() + def updateAliyunRouteInterfaceRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunRouteInterfaceRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunRouteInterfaceRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40804,8 +42009,8 @@ abstract class ApiHelper { } - def updateFirewallRuleTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallRuleTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFirewallRuleTemplateAction() + def updateAliyunSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40831,8 +42036,8 @@ abstract class ApiHelper { } - def updateFlkSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlkSecSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFlkSecSecretResourcePoolAction() + def updateAliyunVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAliyunVirtualRouterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAliyunVirtualRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40858,8 +42063,8 @@ abstract class ApiHelper { } - def updateFlkSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlkSecSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFlkSecSecurityMachineAction() + def updateAppBuildSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAppBuildSystemAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAppBuildSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40885,8 +42090,8 @@ abstract class ApiHelper { } - def updateFlowCollector(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlowCollectorAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFlowCollectorAction() + def updateAutoScalingGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAutoScalingGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40912,8 +42117,8 @@ abstract class ApiHelper { } - def updateFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlowMeterAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateFlowMeterAction() + def updateAutoScalingGroupAddingNewInstanceRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupAddingNewInstanceRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAutoScalingGroupAddingNewInstanceRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40939,8 +42144,8 @@ abstract class ApiHelper { } - def updateGlobalConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateGlobalConfigAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateGlobalConfigAction() + def updateAutoScalingGroupInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAutoScalingGroupInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40966,8 +42171,8 @@ abstract class ApiHelper { } - def updateGuestToolsState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateGuestToolsStateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateGuestToolsStateAction() + def updateAutoScalingGroupRemovalInstanceRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingGroupRemovalInstanceRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAutoScalingGroupRemovalInstanceRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -40993,8 +42198,8 @@ abstract class ApiHelper { } - def updateGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateGuestVmScriptAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateGuestVmScriptAction() + def updateAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAutoScalingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41020,8 +42225,8 @@ abstract class ApiHelper { } - def updateHaStrategyCondition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHaStrategyConditionAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHaStrategyConditionAction() + def updateAutoScalingVmTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateAutoScalingVmTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateAutoScalingVmTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41047,8 +42252,8 @@ abstract class ApiHelper { } - def updateHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHostAction() + def updateBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41074,8 +42279,8 @@ abstract class ApiHelper { } - def updateHostIommuState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostIommuStateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHostIommuStateAction() + def updateBareMetal2Chassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ChassisAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2ChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41101,8 +42306,8 @@ abstract class ApiHelper { } - def updateHostIpmi(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostIpmiAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHostIpmiAction() + def updateBareMetal2ChassisOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ChassisOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2ChassisOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41128,8 +42333,8 @@ abstract class ApiHelper { } - def updateHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostNetworkInterfaceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHostNetworkInterfaceAction() + def updateBareMetal2ChassisPciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ChassisPciDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2ChassisPciDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41155,8 +42360,8 @@ abstract class ApiHelper { } - def updateHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHostSchedulingRuleGroupAction() + def updateBareMetal2Gateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2GatewayAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2GatewayAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41182,8 +42387,8 @@ abstract class ApiHelper { } - def updateHybridEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHybridEipAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHybridEipAction() + def updateBareMetal2Instance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2InstanceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2InstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41209,8 +42414,8 @@ abstract class ApiHelper { } - def updateHybridKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHybridKeySecretAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateHybridKeySecretAction() + def updateBareMetal2IpmiChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2IpmiChassisAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2IpmiChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41236,8 +42441,8 @@ abstract class ApiHelper { } - def updateIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateIPsecConnectionAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateIPsecConnectionAction() + def updateBareMetal2ProvisionNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBareMetal2ProvisionNetworkAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBareMetal2ProvisionNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41263,8 +42468,8 @@ abstract class ApiHelper { } - def updateImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateImageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateImageAction() + def updateBaremetalChassis(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBaremetalChassisAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBaremetalChassisAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41290,8 +42495,8 @@ abstract class ApiHelper { } - def updateImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateImagePackageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateImagePackageAction() + def updateBaremetalInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBaremetalInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBaremetalInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41317,8 +42522,8 @@ abstract class ApiHelper { } - def updateImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateImageStoreBackupStorageAction() + def updateBaremetalPxeServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBaremetalPxeServerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBaremetalPxeServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41344,8 +42549,8 @@ abstract class ApiHelper { } - def updateInfoSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateInfoSecSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateInfoSecSecretResourcePoolAction() + def updateBlockPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBlockPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBlockPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41371,8 +42576,8 @@ abstract class ApiHelper { } - def updateInfoSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateInfoSecSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateInfoSecSecurityMachineAction() + def updateBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBlockVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBlockVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41398,8 +42603,8 @@ abstract class ApiHelper { } - def updateInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateInstanceOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateInstanceOfferingAction() + def updateBonding(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBondingAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBondingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41425,8 +42630,8 @@ abstract class ApiHelper { } - def updateIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateIpRangeAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateIpRangeAction() + def updateBuildApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateBuildAppAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateBuildAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41452,8 +42657,8 @@ abstract class ApiHelper { } - def updateIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateIscsiServerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateIscsiServerAction() + def updateCCSCertificateUserState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCCSCertificateUserStateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCCSCertificateUserStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41479,8 +42684,8 @@ abstract class ApiHelper { } - def updateJitSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateJitSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateJitSecurityMachineAction() + def updateCSPSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCSPSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCSPSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41506,8 +42711,8 @@ abstract class ApiHelper { } - def updateKVMHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateKVMHostAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateKVMHostAction() + def updateCasClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCasClientAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCasClientAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41533,8 +42738,8 @@ abstract class ApiHelper { } - def updateL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateL2NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateL2NetworkAction() + def updateCdpPolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCdpPolicyAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCdpPolicyAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41560,8 +42765,8 @@ abstract class ApiHelper { } - def updateL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateL3NetworkAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateL3NetworkAction() + def updateCdpTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCdpTaskAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCdpTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41587,8 +42792,8 @@ abstract class ApiHelper { } - def updateLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLdapServerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLdapServerAction() + def updateCephBackupStorageMon(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCephBackupStorageMonAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCephBackupStorageMonAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41614,8 +42819,8 @@ abstract class ApiHelper { } - def updateLicense(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLicenseAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLicenseAction() + def updateCephPrimaryStorageMon(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCephPrimaryStorageMonAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCephPrimaryStorageMonAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41641,8 +42846,8 @@ abstract class ApiHelper { } - def updateLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLoadBalancerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLoadBalancerAction() + def updateCephPrimaryStoragePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCephPrimaryStoragePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCephPrimaryStoragePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41668,8 +42873,8 @@ abstract class ApiHelper { } - def updateLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLoadBalancerListenerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLoadBalancerListenerAction() + def updateCertificate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateCertificateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateCertificateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41695,8 +42900,8 @@ abstract class ApiHelper { } - def updateLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLoadBalancerServerGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLoadBalancerServerGroupAction() + def updateChronyServers(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateChronyServersAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateChronyServersAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41722,8 +42927,8 @@ abstract class ApiHelper { } - def updateLogConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLogConfigurationAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLogConfigurationAction() + def updateCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateClusterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateClusterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41749,8 +42954,8 @@ abstract class ApiHelper { } - def updateLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLongJobAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateLongJobAction() + def updateClusterDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateClusterDRSAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateClusterDRSAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41776,8 +42981,8 @@ abstract class ApiHelper { } - def updateMdevDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMdevDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateMdevDeviceAction() + def updateClusterOS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateClusterOSAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateClusterOSAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41803,8 +43008,8 @@ abstract class ApiHelper { } - def updateMdevDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMdevDeviceSpecAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateMdevDeviceSpecAction() + def updateConnectionBetweenL3NetWorkAndAliyunVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateConnectionBetweenL3NetWorkAndAliyunVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41830,8 +43035,8 @@ abstract class ApiHelper { } - def updateMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMonitorTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateMonitorTriggerAction() + def updateConsoleProxyAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateConsoleProxyAgentAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateConsoleProxyAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41857,8 +43062,8 @@ abstract class ApiHelper { } - def updateNasFileSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateNasFileSystemAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateNasFileSystemAction() + def updateContainerManagementEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateContainerManagementEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateContainerManagementEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41884,8 +43089,8 @@ abstract class ApiHelper { } - def updateNasMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateNasMountTargetAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateNasMountTargetAction() + def updateDataset(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDatasetAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDatasetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41911,8 +43116,8 @@ abstract class ApiHelper { } - def updateOAuthClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateOAuthClientAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateOAuthClientAction() + def updateDatasets(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDatasetsAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDatasetsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41938,8 +43143,8 @@ abstract class ApiHelper { } - def updateOssBucket(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateOssBucketAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateOssBucketAction() + def updateDirectory(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDirectoryAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDirectoryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41965,8 +43170,8 @@ abstract class ApiHelper { } - def updatePciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePciDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePciDeviceAction() + def updateDiskOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDiskOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDiskOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -41992,8 +43197,8 @@ abstract class ApiHelper { } - def updatePciDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePciDeviceSpecAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePciDeviceSpecAction() + def updateEcsImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsImageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEcsImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42019,8 +43224,8 @@ abstract class ApiHelper { } - def updatePolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePolicyRouteRuleSetAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePolicyRouteRuleSetAction() + def updateEcsInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsInstanceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEcsInstanceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42046,8 +43251,8 @@ abstract class ApiHelper { } - def updatePortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePortForwardingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePortForwardingRuleAction() + def updateEcsInstanceVncPassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsInstanceVncPasswordAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEcsInstanceVncPasswordAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42073,8 +43278,8 @@ abstract class ApiHelper { } - def updatePortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePortMirrorAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePortMirrorAction() + def updateEcsSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEcsSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42100,8 +43305,8 @@ abstract class ApiHelper { } - def updatePreconfigurationTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePreconfigurationTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePreconfigurationTemplateAction() + def updateEcsVSwitch(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsVSwitchAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEcsVSwitchAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42127,8 +43332,8 @@ abstract class ApiHelper { } - def updatePriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePriceTableAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePriceTableAction() + def updateEcsVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEcsVpcAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEcsVpcAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42154,8 +43359,8 @@ abstract class ApiHelper { } - def updatePrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePrimaryStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePrimaryStorageAction() + def updateEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEipAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42181,8 +43386,8 @@ abstract class ApiHelper { } - def updatePriorityConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePriorityConfigAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePriorityConfigAction() + def updateEmailMedia(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEmailMediaAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEmailMediaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42208,8 +43413,8 @@ abstract class ApiHelper { } - def updatePublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePublishAppAction.class) Closure c) { - def a = new org.zstack.sdk.UpdatePublishAppAction() + def updateEmailMonitorTriggerAction(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateEmailMonitorTriggerActionAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateEmailMonitorTriggerActionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42235,8 +43440,8 @@ abstract class ApiHelper { } - def updateQuota(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateQuotaAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateQuotaAction() + def updateExternalPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateExternalPrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateExternalPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42262,8 +43467,8 @@ abstract class ApiHelper { } - def updateResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourceConfigAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateResourceConfigAction() + def updateFactoryModeState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFactoryModeStateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFactoryModeStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42289,8 +43494,8 @@ abstract class ApiHelper { } - def updateResourceConfigs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourceConfigsAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateResourceConfigsAction() + def updateFiSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFiSecSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFiSecSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42316,8 +43521,8 @@ abstract class ApiHelper { } - def updateResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourcePriceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateResourcePriceAction() + def updateFiSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFiSecSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFiSecSecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42343,8 +43548,8 @@ abstract class ApiHelper { } - def updateResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourceStackAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateResourceStackAction() + def updateFirewallIpSetTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallIpSetTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFirewallIpSetTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42370,8 +43575,8 @@ abstract class ApiHelper { } - def updateSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSSORedirectTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSSORedirectTemplateAction() + def updateFirewallRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFirewallRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42397,8 +43602,8 @@ abstract class ApiHelper { } - def updateSanSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSanSecSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSanSecSecretResourcePoolAction() + def updateFirewallRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFirewallRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42424,8 +43629,8 @@ abstract class ApiHelper { } - def updateSanSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSanSecSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSanSecSecurityMachineAction() + def updateFirewallRuleTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFirewallRuleTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFirewallRuleTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42451,8 +43656,8 @@ abstract class ApiHelper { } - def updateSchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSchedulerJobAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSchedulerJobAction() + def updateFlkSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlkSecSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFlkSecSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42478,8 +43683,8 @@ abstract class ApiHelper { } - def updateSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSchedulerJobGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSchedulerJobGroupAction() + def updateFlkSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlkSecSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFlkSecSecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42505,8 +43710,8 @@ abstract class ApiHelper { } - def updateSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSchedulerTriggerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSchedulerTriggerAction() + def updateFlowCollector(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlowCollectorAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFlowCollectorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42532,8 +43737,8 @@ abstract class ApiHelper { } - def updateScsiLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateScsiLunAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateScsiLunAction() + def updateFlowMeter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateFlowMeterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateFlowMeterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42559,8 +43764,8 @@ abstract class ApiHelper { } - def updateSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSdnControllerAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSdnControllerAction() + def updateGlobalConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateGlobalConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateGlobalConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42586,8 +43791,8 @@ abstract class ApiHelper { } - def updateSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecretResourcePoolAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSecretResourcePoolAction() + def updateGuestToolsState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateGuestToolsStateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateGuestToolsStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42613,8 +43818,8 @@ abstract class ApiHelper { } - def updateSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecurityGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSecurityGroupAction() + def updateGuestVmScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateGuestVmScriptAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateGuestVmScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42640,8 +43845,8 @@ abstract class ApiHelper { } - def updateSecurityGroupRulePriority(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecurityGroupRulePriorityAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSecurityGroupRulePriorityAction() + def updateHaStrategyCondition(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHaStrategyConditionAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHaStrategyConditionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42667,8 +43872,8 @@ abstract class ApiHelper { } - def updateSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecurityMachineAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSecurityMachineAction() + def updateHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42694,8 +43899,8 @@ abstract class ApiHelper { } - def updateSftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSftpBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSftpBackupStorageAction() + def updateHostIommuState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostIommuStateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostIommuStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42721,8 +43926,8 @@ abstract class ApiHelper { } - def updateSharedBlock(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSharedBlockAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSharedBlockAction() + def updateHostIpmi(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostIpmiAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostIpmiAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42748,8 +43953,8 @@ abstract class ApiHelper { } - def updateSlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSlbGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSlbGroupAction() + def updateHostNetworkInterface(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostNetworkInterfaceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostNetworkInterfaceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42775,8 +43980,8 @@ abstract class ApiHelper { } - def updateSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSnmpAgentAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSnmpAgentAction() + def updateHostNetworkServiceType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostNetworkServiceTypeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostNetworkServiceTypeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42802,8 +44007,8 @@ abstract class ApiHelper { } - def updateSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSshKeyPairAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSshKeyPairAction() + def updateHostSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHostSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHostSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42829,8 +44034,8 @@ abstract class ApiHelper { } - def updateStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateStackTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateStackTemplateAction() + def updateHybridEip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHybridEipAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHybridEipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42856,8 +44061,8 @@ abstract class ApiHelper { } - def updateSystemTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSystemTagAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateSystemTagAction() + def updateHybridKeySecret(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateHybridKeySecretAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateHybridKeySecretAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42883,8 +44088,8 @@ abstract class ApiHelper { } - def updateTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateTagAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateTagAction() + def updateIPsecConnection(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateIPsecConnectionAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateIPsecConnectionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42910,8 +44115,8 @@ abstract class ApiHelper { } - def updateTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateTemplateConfigAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateTemplateConfigAction() + def updateImage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateImageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateImageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42937,8 +44142,8 @@ abstract class ApiHelper { } - def updateUsbDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUsbDeviceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateUsbDeviceAction() + def updateImagePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateImagePackageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateImagePackageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42964,8 +44169,8 @@ abstract class ApiHelper { } - def updateUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUserAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateUserAction() + def updateImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -42991,8 +44196,8 @@ abstract class ApiHelper { } - def updateUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUserGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateUserGroupAction() + def updateInfoSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateInfoSecSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateInfoSecSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43018,8 +44223,8 @@ abstract class ApiHelper { } - def updateV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateV2VConversionHostAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateV2VConversionHostAction() + def updateInfoSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateInfoSecSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateInfoSecSecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43045,8 +44250,8 @@ abstract class ApiHelper { } - def updateVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVCenterAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVCenterAction() + def updateInstanceOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateInstanceOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateInstanceOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43072,8 +44277,8 @@ abstract class ApiHelper { } - def updateVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVRouterOspfAreaAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVRouterOspfAreaAction() + def updateIpRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateIpRangeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateIpRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43099,8 +44304,8 @@ abstract class ApiHelper { } - def updateVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVRouterRouteTableAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVRouterRouteTableAction() + def updateIscsiServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateIscsiServerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateIscsiServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43126,8 +44331,170 @@ abstract class ApiHelper { } - def updateVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVipAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVipAction() + def updateJitSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateJitSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateJitSecurityMachineAction() + 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 updateKVMHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateKVMHostAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateKVMHostAction() + 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 updateKoAlSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateKoAlSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateKoAlSecretResourcePoolAction() + 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 updateL2Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateL2NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateL2NetworkAction() + 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 updateL3Network(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateL3NetworkAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateL3NetworkAction() + 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 updateLdapServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLdapServerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLdapServerAction() + 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 updateLicense(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLicenseAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLicenseAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43153,8 +44520,8 @@ abstract class ApiHelper { } - def updateVirtualBorderRouterRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualBorderRouterRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVirtualBorderRouterRemoteAction() + def updateLoadBalancer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLoadBalancerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLoadBalancerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43180,8 +44547,8 @@ abstract class ApiHelper { } - def updateVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualRouterAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVirtualRouterAction() + def updateLoadBalancerListener(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLoadBalancerListenerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLoadBalancerListenerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43207,8 +44574,8 @@ abstract class ApiHelper { } - def updateVirtualRouterOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualRouterOfferingAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVirtualRouterOfferingAction() + def updateLoadBalancerServerGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLoadBalancerServerGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLoadBalancerServerGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43234,8 +44601,8 @@ abstract class ApiHelper { } - def updateVirtualRouterSoftwareVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualRouterSoftwareVersionAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVirtualRouterSoftwareVersionAction() + def updateLogConfiguration(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLogConfigurationAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLogConfigurationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43261,8 +44628,8 @@ abstract class ApiHelper { } - def updateVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmCdRomAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmCdRomAction() + def updateLogServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLogServerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLogServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43288,8 +44655,8 @@ abstract class ApiHelper { } - def updateVmInstance(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmInstanceAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmInstanceAction() + def updateLongJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateLongJobAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateLongJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43315,8 +44682,8 @@ abstract class ApiHelper { } - def updateVmNetworkConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNetworkConfigAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmNetworkConfigAction() + def updateMdevDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMdevDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateMdevDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43342,8 +44709,8 @@ abstract class ApiHelper { } - def updateVmNicDriver(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNicDriverAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmNicDriverAction() + def updateMdevDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMdevDeviceSpecAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateMdevDeviceSpecAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43369,8 +44736,8 @@ abstract class ApiHelper { } - def updateVmNicMac(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNicMacAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmNicMacAction() + def updateModel(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43396,8 +44763,8 @@ abstract class ApiHelper { } - def updateVmPriority(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmPriorityAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmPriorityAction() + def updateModelCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelCenterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43423,8 +44790,8 @@ abstract class ApiHelper { } - def updateVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmSchedulingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmSchedulingRuleAction() + def updateModelEvaluationTask(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelEvaluationTaskAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelEvaluationTaskAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43450,8 +44817,8 @@ abstract class ApiHelper { } - def updateVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmSchedulingRuleGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmSchedulingRuleGroupAction() + def updateModelService(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelServiceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelServiceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43477,8 +44844,8 @@ abstract class ApiHelper { } - def updateVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmUserDefinedXmlHookScriptAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVmUserDefinedXmlHookScriptAction() + def updateModelServiceInstanceGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateModelServiceInstanceGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateModelServiceInstanceGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43504,8 +44871,8 @@ abstract class ApiHelper { } - def updateVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVniRangeAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVniRangeAction() + def updateMonitorTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateMonitorTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateMonitorTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43531,8 +44898,8 @@ abstract class ApiHelper { } - def updateVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVolumeAction() + def updateNasFileSystem(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateNasFileSystemAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateNasFileSystemAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43558,8 +44925,8 @@ abstract class ApiHelper { } - def updateVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVolumeSnapshotAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVolumeSnapshotAction() + def updateNasMountTarget(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateNasMountTargetAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateNasMountTargetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43585,8 +44952,8 @@ abstract class ApiHelper { } - def updateVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVolumeSnapshotGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVolumeSnapshotGroupAction() + def updateOAuthClient(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateOAuthClientAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateOAuthClientAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43612,8 +44979,8 @@ abstract class ApiHelper { } - def updateVpcFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcFirewallAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVpcFirewallAction() + def updateOssBucket(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateOssBucketAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateOssBucketAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43639,8 +45006,8 @@ abstract class ApiHelper { } - def updateVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcHaGroupAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVpcHaGroupAction() + def updatePciDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePciDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePciDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43666,8 +45033,8 @@ abstract class ApiHelper { } - def updateVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcSharedQosAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVpcSharedQosAction() + def updatePciDeviceSpec(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePciDeviceSpecAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePciDeviceSpecAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43693,8 +45060,8 @@ abstract class ApiHelper { } - def updateVpcUserVpnGateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcUserVpnGatewayAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVpcUserVpnGatewayAction() + def updatePluginSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePluginSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePluginSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43720,8 +45087,8 @@ abstract class ApiHelper { } - def updateVpcVpnConnectionRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcVpnConnectionRemoteAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVpcVpnConnectionRemoteAction() + def updatePolicyRouteRuleSet(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePolicyRouteRuleSetAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePolicyRouteRuleSetAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43747,8 +45114,8 @@ abstract class ApiHelper { } - def updateVpcVpnGateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcVpnGatewayAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateVpcVpnGatewayAction() + def updatePortForwardingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePortForwardingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePortForwardingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43774,8 +45141,8 @@ abstract class ApiHelper { } - def updateWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateWebhookAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateWebhookAction() + def updatePortMirror(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePortMirrorAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePortMirrorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43801,8 +45168,8 @@ abstract class ApiHelper { } - def updateXskyBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateXskyBlockVolumeAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateXskyBlockVolumeAction() + def updatePreconfigurationTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePreconfigurationTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePreconfigurationTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43828,8 +45195,8 @@ abstract class ApiHelper { } - def updateZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateZoneAction.class) Closure c) { - def a = new org.zstack.sdk.UpdateZoneAction() + def updatePriceTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePriceTableAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePriceTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43855,8 +45222,8 @@ abstract class ApiHelper { } - def upgradeBackupStorageCdpTasks(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpgradeBackupStorageCdpTasksAction.class) Closure c) { - def a = new org.zstack.sdk.UpgradeBackupStorageCdpTasksAction() + def updatePrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePrimaryStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43882,8 +45249,8 @@ abstract class ApiHelper { } - def uploadFileToVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UploadFileToVmAction.class) Closure c) { - def a = new org.zstack.sdk.UploadFileToVmAction() + def updatePriorityConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePriorityConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePriorityConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43909,8 +45276,8 @@ abstract class ApiHelper { } - def validateClusterSupportDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateClusterSupportDRSAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateClusterSupportDRSAction() + def updatePublishApp(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdatePublishAppAction.class) Closure c) { + def a = new org.zstack.sdk.UpdatePublishAppAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43936,8 +45303,8 @@ abstract class ApiHelper { } - def validateDiskOfferingUserConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateDiskOfferingUserConfigAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateDiskOfferingUserConfigAction() + def updateQuota(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateQuotaAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateQuotaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43963,8 +45330,8 @@ abstract class ApiHelper { } - def validateInstanceOfferingUserConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateInstanceOfferingUserConfigAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateInstanceOfferingUserConfigAction() + def updateResourceConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourceConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateResourceConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -43990,9 +45357,9 @@ abstract class ApiHelper { } - def validatePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidatePasswordAction.class) Closure c) { - def a = new org.zstack.sdk.ValidatePasswordAction() - + def updateResourceConfigs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourceConfigsAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateResourceConfigsAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -44017,8 +45384,8 @@ abstract class ApiHelper { } - def validatePriceUserConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidatePriceUserConfigAction.class) Closure c) { - def a = new org.zstack.sdk.ValidatePriceUserConfigAction() + def updateResourcePrice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourcePriceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateResourcePriceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44044,8 +45411,8 @@ abstract class ApiHelper { } - def validateSecurityGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateSecurityGroupRuleAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateSecurityGroupRuleAction() + def updateResourceStack(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateResourceStackAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateResourceStackAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44071,9 +45438,9 @@ abstract class ApiHelper { } - def validateSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateSessionAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateSessionAction() - + def updateSAML2Client(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSAML2ClientAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSAML2ClientAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() @@ -44098,8 +45465,8 @@ abstract class ApiHelper { } - def validateVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateVmSchedulingRuleAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateVmSchedulingRuleAction() + def updateSSOClientAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSSOClientAttributeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSSOClientAttributeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44125,8 +45492,8 @@ abstract class ApiHelper { } - def validateVolumeSnapshotChain(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateVolumeSnapshotChainAction.class) Closure c) { - def a = new org.zstack.sdk.ValidateVolumeSnapshotChainAction() + def updateSSORedirectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSSORedirectTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSSORedirectTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44152,8 +45519,8 @@ abstract class ApiHelper { } - def zQLQuery(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ZQLQueryAction.class) Closure c) { - def a = new org.zstack.sdk.ZQLQueryAction() + def updateSanSecSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSanSecSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSanSecSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44179,8 +45546,8 @@ abstract class ApiHelper { } - def createDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.CreateDatabaseBackupAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.CreateDatabaseBackupAction() + def updateSanSecSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSanSecSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSanSecSecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44206,8 +45573,8 @@ abstract class ApiHelper { } - def deleteDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.DeleteDatabaseBackupAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.DeleteDatabaseBackupAction() + def updateSchedulerJob(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSchedulerJobAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSchedulerJobAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44233,8 +45600,8 @@ abstract class ApiHelper { } - def deleteExportedDatabaseBackupFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.DeleteExportedDatabaseBackupFromBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.DeleteExportedDatabaseBackupFromBackupStorageAction() + def updateSchedulerJobGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSchedulerJobGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSchedulerJobGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44260,8 +45627,8 @@ abstract class ApiHelper { } - def exportDatabaseBackupFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.ExportDatabaseBackupFromBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.ExportDatabaseBackupFromBackupStorageAction() + def updateSchedulerTrigger(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSchedulerTriggerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSchedulerTriggerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44287,8 +45654,8 @@ abstract class ApiHelper { } - def getDatabaseBackupFromImageStore(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.GetDatabaseBackupFromImageStoreAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.GetDatabaseBackupFromImageStoreAction() + def updateScsiLun(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateScsiLunAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateScsiLunAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44314,15 +45681,13 @@ abstract class ApiHelper { } - def queryDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.QueryDatabaseBackupAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.QueryDatabaseBackupAction() + def updateSdnController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSdnControllerAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSdnControllerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -44343,8 +45708,8 @@ abstract class ApiHelper { } - def recoverDatabaseFromBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.RecoverDatabaseFromBackupAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.RecoverDatabaseFromBackupAction() + def updateSecretResourcePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecretResourcePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSecretResourcePoolAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44370,8 +45735,8 @@ abstract class ApiHelper { } - def syncDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.SyncDatabaseBackupAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.SyncDatabaseBackupAction() + def updateSecurityGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecurityGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSecurityGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44397,8 +45762,8 @@ abstract class ApiHelper { } - def syncDatabaseBackupFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.SyncDatabaseBackupFromImageStoreBackupStorageAction.class) Closure c) { - def a = new org.zstack.sdk.databasebackup.SyncDatabaseBackupFromImageStoreBackupStorageAction() + def updateSecurityGroupRulePriority(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecurityGroupRulePriorityAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSecurityGroupRulePriorityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44424,8 +45789,8 @@ abstract class ApiHelper { } - def addAttributesToIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2OrganizationAction() + def updateSecurityMachine(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSecurityMachineAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSecurityMachineAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44451,8 +45816,8 @@ abstract class ApiHelper { } - def addAttributesToIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2ProjectAction() + def updateSftpBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSftpBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSftpBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44478,8 +45843,8 @@ abstract class ApiHelper { } - def addAttributesToIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDAction() + def updateSharedBlock(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSharedBlockAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSharedBlockAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44505,8 +45870,8 @@ abstract class ApiHelper { } - def addAttributesToIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDGroupAction() + def updateSlbGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSlbGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSlbGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44532,8 +45897,8 @@ abstract class ApiHelper { } - def addIAM2VirtualIDGroupToProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDGroupToProjectsAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDGroupToProjectsAction() + def updateSnmpAgent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSnmpAgentAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSnmpAgentAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44559,8 +45924,8 @@ abstract class ApiHelper { } - def addIAM2VirtualIDsToGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToGroupAction() + def updateSshKeyPair(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSshKeyPairAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSshKeyPairAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44586,8 +45951,8 @@ abstract class ApiHelper { } - def addIAM2VirtualIDsToOrganization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToOrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToOrganizationAction() + def updateStackTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateStackTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateStackTemplateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44613,8 +45978,8 @@ abstract class ApiHelper { } - def addIAM2VirtualIDsToProject(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectAction() + def updateSystemTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateSystemTagAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateSystemTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44640,8 +46005,8 @@ abstract class ApiHelper { } - def addIAM2VirtualIDsToProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectsAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectsAction() + def updateTag(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateTagAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateTagAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44667,8 +46032,8 @@ abstract class ApiHelper { } - def addResourceToIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddResourceToIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddResourceToIAM2ProjectAction() + def updateTemplateConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateTemplateConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateTemplateConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44694,8 +46059,8 @@ abstract class ApiHelper { } - def addRolesToIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDAction() + def updateUsbDevice(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUsbDeviceAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateUsbDeviceAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44721,8 +46086,8 @@ abstract class ApiHelper { } - def addRolesToIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDGroupAction() + def updateUser(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUserAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateUserAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44748,8 +46113,8 @@ abstract class ApiHelper { } - def attachIAM2ProjectToIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AttachIAM2ProjectToIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.AttachIAM2ProjectToIAM2OrganizationAction() + def updateUserGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUserGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateUserGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44775,8 +46140,8 @@ abstract class ApiHelper { } - def batchCreateIAM2VirtualIDFromConfigFile(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.BatchCreateIAM2VirtualIDFromConfigFileAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.BatchCreateIAM2VirtualIDFromConfigFileAction() + def updateUserProxyConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateUserProxyConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateUserProxyConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44802,8 +46167,8 @@ abstract class ApiHelper { } - def changeIAM2OrganizationParent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2OrganizationParentAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ChangeIAM2OrganizationParentAction() + def updateV2VConversionHost(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateV2VConversionHostAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateV2VConversionHostAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44829,8 +46194,8 @@ abstract class ApiHelper { } - def changeIAM2OrganizationState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2OrganizationStateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ChangeIAM2OrganizationStateAction() + def updateVCenter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVCenterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVCenterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44856,8 +46221,8 @@ abstract class ApiHelper { } - def changeIAM2ProjectState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2ProjectStateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ChangeIAM2ProjectStateAction() + def updateVRouterOspfArea(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVRouterOspfAreaAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVRouterOspfAreaAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44883,8 +46248,8 @@ abstract class ApiHelper { } - def changeIAM2VirtualIDGroupState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDGroupStateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDGroupStateAction() + def updateVRouterRouteTable(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVRouterRouteTableAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVRouterRouteTableAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44910,8 +46275,8 @@ abstract class ApiHelper { } - def changeIAM2VirtualIDState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDStateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDStateAction() + def updateVip(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVipAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVipAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44937,8 +46302,8 @@ abstract class ApiHelper { } - def changeIAM2VirtualIDType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDTypeAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDTypeAction() + def updateVirtualBorderRouterRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualBorderRouterRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVirtualBorderRouterRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44964,8 +46329,8 @@ abstract class ApiHelper { } - def checkIAM2OrganizationAvailability(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CheckIAM2OrganizationAvailabilityAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CheckIAM2OrganizationAvailabilityAction() + def updateVirtualRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualRouterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVirtualRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -44991,8 +46356,8 @@ abstract class ApiHelper { } - def checkIAM2VirtualIDConfigFile(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CheckIAM2VirtualIDConfigFileAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CheckIAM2VirtualIDConfigFileAction() + def updateVirtualRouterOffering(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualRouterOfferingAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVirtualRouterOfferingAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45018,8 +46383,8 @@ abstract class ApiHelper { } - def createIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2OrganizationAction() + def updateVirtualRouterSoftwareVersion(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVirtualRouterSoftwareVersionAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVirtualRouterSoftwareVersionAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45045,8 +46410,8 @@ abstract class ApiHelper { } - def createIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectAction() + def updateVmCdRom(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmCdRomAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmCdRomAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45072,8 +46437,8 @@ abstract class ApiHelper { } - def createIAM2ProjectFromTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectFromTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectFromTemplateAction() + 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 c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45099,8 +46464,8 @@ abstract class ApiHelper { } - def createIAM2ProjectRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectRoleAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectRoleAction() + def updateVmNetworkConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNetworkConfigAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmNetworkConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45126,8 +46491,8 @@ abstract class ApiHelper { } - def createIAM2ProjectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateAction() + def updateVmNicDriver(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNicDriverAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmNicDriverAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45153,8 +46518,8 @@ abstract class ApiHelper { } - def createIAM2ProjectTemplateFromProject(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateFromProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateFromProjectAction() + def updateVmNicMac(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNicMacAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmNicMacAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45180,8 +46545,8 @@ abstract class ApiHelper { } - def createIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2VirtualIDAction() + def updateVmPriority(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmPriorityAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmPriorityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45207,8 +46572,8 @@ abstract class ApiHelper { } - def createIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.CreateIAM2VirtualIDGroupAction() + def updateVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmSchedulingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmSchedulingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45234,8 +46599,8 @@ abstract class ApiHelper { } - def deleteIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.DeleteIAM2OrganizationAction() + def updateVmSchedulingRuleGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmSchedulingRuleGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmSchedulingRuleGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45261,8 +46626,8 @@ abstract class ApiHelper { } - def deleteIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.DeleteIAM2ProjectAction() + def updateVmUserDefinedXmlHookScript(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmUserDefinedXmlHookScriptAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmUserDefinedXmlHookScriptAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45288,8 +46653,8 @@ abstract class ApiHelper { } - def deleteIAM2ProjectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2ProjectTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.DeleteIAM2ProjectTemplateAction() + def updateVniRange(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVniRangeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVniRangeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45315,8 +46680,8 @@ abstract class ApiHelper { } - def deleteIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDAction() + def updateVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45342,8 +46707,8 @@ abstract class ApiHelper { } - def deleteIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDGroupAction() + def updateVolumeSnapshot(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVolumeSnapshotAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVolumeSnapshotAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45369,8 +46734,8 @@ abstract class ApiHelper { } - def detachIAM2ProjectFromIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DetachIAM2ProjectFromIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.DetachIAM2ProjectFromIAM2OrganizationAction() + def updateVolumeSnapshotGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVolumeSnapshotGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVolumeSnapshotGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45396,8 +46761,8 @@ abstract class ApiHelper { } - def expungeIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ExpungeIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.ExpungeIAM2ProjectAction() + def updateVpcFirewall(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcFirewallAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVpcFirewallAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45423,8 +46788,8 @@ abstract class ApiHelper { } - def getIAM2OrganizationVirtualIDNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2OrganizationVirtualIDNumberAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.GetIAM2OrganizationVirtualIDNumberAction() + def updateVpcHaGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcHaGroupAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVpcHaGroupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45450,8 +46815,8 @@ abstract class ApiHelper { } - def getIAM2ProjectsOfVirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2ProjectsOfVirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.GetIAM2ProjectsOfVirtualIDAction() + def updateVpcSharedQos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcSharedQosAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVpcSharedQosAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45477,8 +46842,8 @@ abstract class ApiHelper { } - def getIAM2SystemAttributes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2SystemAttributesAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.GetIAM2SystemAttributesAction() + def updateVpcUserVpnGateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcUserVpnGatewayAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVpcUserVpnGatewayAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45504,8 +46869,8 @@ abstract class ApiHelper { } - def getIAM2VirtualIDAPIPermission(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2VirtualIDAPIPermissionAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.GetIAM2VirtualIDAPIPermissionAction() + def updateVpcVpnConnectionRemote(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcVpnConnectionRemoteAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVpcVpnConnectionRemoteAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45531,8 +46896,8 @@ abstract class ApiHelper { } - def getIAM2VirtualIDInGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2VirtualIDInGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.GetIAM2VirtualIDInGroupAction() + def updateVpcVpnGateway(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVpcVpnGatewayAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVpcVpnGatewayAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45558,8 +46923,8 @@ abstract class ApiHelper { } - def getOrganizationQuotaUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetOrganizationQuotaUsageAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.GetOrganizationQuotaUsageAction() + def updateWebhook(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateWebhookAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateWebhookAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45585,8 +46950,8 @@ abstract class ApiHelper { } - def loginIAM2Platform(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.LoginIAM2PlatformAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.LoginIAM2PlatformAction() + def updateXskyBlockVolume(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateXskyBlockVolumeAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateXskyBlockVolumeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45612,8 +46977,8 @@ abstract class ApiHelper { } - def loginIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.LoginIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.LoginIAM2ProjectAction() + def updateZone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateZoneAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateZoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -45639,42 +47004,13 @@ abstract class ApiHelper { } - def loginIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.LoginIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.LoginIAM2VirtualIDAction() - - 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 queryIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2OrganizationAction() + def upgradeBackupStorageCdpTasks(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpgradeBackupStorageCdpTasksAction.class) Closure c) { + def a = new org.zstack.sdk.UpgradeBackupStorageCdpTasksAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45695,15 +47031,13 @@ abstract class ApiHelper { } - def queryIAM2OrganizationAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2OrganizationAttributeAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2OrganizationAttributeAction() + def uploadFileToVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UploadFileToVmAction.class) Closure c) { + def a = new org.zstack.sdk.UploadFileToVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45724,15 +47058,13 @@ abstract class ApiHelper { } - def queryIAM2OrganizationProjectRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2OrganizationProjectRefAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2OrganizationProjectRefAction() + def validateClusterSupportDRS(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateClusterSupportDRSAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateClusterSupportDRSAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45753,15 +47085,13 @@ abstract class ApiHelper { } - def queryIAM2ProjectAccountRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectAccountRefAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectAccountRefAction() + def validateDiskOfferingUserConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateDiskOfferingUserConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateDiskOfferingUserConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45782,15 +47112,13 @@ abstract class ApiHelper { } - def queryIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectAction() + def validateInstanceOfferingUserConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateInstanceOfferingUserConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateInstanceOfferingUserConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45811,15 +47139,13 @@ abstract class ApiHelper { } - def queryIAM2ProjectAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectAttributeAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectAttributeAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def validatePassword(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidatePasswordAction.class) Closure c) { + def a = new org.zstack.sdk.ValidatePasswordAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45840,15 +47166,13 @@ abstract class ApiHelper { } - def queryIAM2ProjectRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectRoleAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectRoleAction() + def validatePriceUserConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidatePriceUserConfigAction.class) Closure c) { + def a = new org.zstack.sdk.ValidatePriceUserConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45869,15 +47193,13 @@ abstract class ApiHelper { } - def queryIAM2ProjectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectTemplateAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectTemplateAction() + def validateSecurityGroupRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateSecurityGroupRuleAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateSecurityGroupRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45898,15 +47220,13 @@ abstract class ApiHelper { } - def queryIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAction() - a.sessionId = Test.currentEnvSpec?.session?.uuid + def validateSession(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateSessionAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateSessionAction() + c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45927,15 +47247,13 @@ abstract class ApiHelper { } - def queryIAM2VirtualIDAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAttributeAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAttributeAction() + def validateVmSchedulingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateVmSchedulingRuleAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateVmSchedulingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45956,15 +47274,13 @@ abstract class ApiHelper { } - def queryIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAction() + def validateVolumeSnapshotChain(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ValidateVolumeSnapshotChainAction.class) Closure c) { + def a = new org.zstack.sdk.ValidateVolumeSnapshotChainAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -45985,15 +47301,13 @@ abstract class ApiHelper { } - def queryIAM2VirtualIDGroupAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAttributeAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAttributeAction() + def zQLQuery(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ZQLQueryAction.class) Closure c) { + def a = new org.zstack.sdk.ZQLQueryAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() - a.conditions = a.conditions.collect { it.toString() } - if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -46014,8 +47328,8 @@ abstract class ApiHelper { } - def recoverIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RecoverIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RecoverIAM2ProjectAction() + def createDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.CreateDatabaseBackupAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.CreateDatabaseBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46041,8 +47355,8 @@ abstract class ApiHelper { } - def removeAttributesFromIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2OrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2OrganizationAction() + def deleteDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.DeleteDatabaseBackupAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.DeleteDatabaseBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46068,8 +47382,8 @@ abstract class ApiHelper { } - def removeAttributesFromIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2ProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2ProjectAction() + def deleteExportedDatabaseBackupFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.DeleteExportedDatabaseBackupFromBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.DeleteExportedDatabaseBackupFromBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46095,8 +47409,8 @@ abstract class ApiHelper { } - def removeAttributesFromIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDAction() + def exportDatabaseBackupFromBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.ExportDatabaseBackupFromBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.ExportDatabaseBackupFromBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46122,8 +47436,8 @@ abstract class ApiHelper { } - def removeAttributesFromIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDGroupAction() + def getDatabaseBackupFromImageStore(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.GetDatabaseBackupFromImageStoreAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.GetDatabaseBackupFromImageStoreAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46149,13 +47463,15 @@ abstract class ApiHelper { } - def removeIAM2ProjectLoginExpired(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2ProjectLoginExpiredAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveIAM2ProjectLoginExpiredAction() + def queryDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.QueryDatabaseBackupAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.QueryDatabaseBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -46176,8 +47492,8 @@ abstract class ApiHelper { } - def removeIAM2VirtualIDGroupFromProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDGroupFromProjectsAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDGroupFromProjectsAction() + def recoverDatabaseFromBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.RecoverDatabaseFromBackupAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.RecoverDatabaseFromBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46203,8 +47519,8 @@ abstract class ApiHelper { } - def removeIAM2VirtualIDsFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromGroupAction() + def syncDatabaseBackup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.SyncDatabaseBackupAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.SyncDatabaseBackupAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46230,8 +47546,8 @@ abstract class ApiHelper { } - def removeIAM2VirtualIDsFromOrganization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromOrganizationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromOrganizationAction() + def syncDatabaseBackupFromImageStoreBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.databasebackup.SyncDatabaseBackupFromImageStoreBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.databasebackup.SyncDatabaseBackupFromImageStoreBackupStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46257,8 +47573,8 @@ abstract class ApiHelper { } - def removeIAM2VirtualIDsFromProject(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectAction() + def createHuaweiIMasterVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.CreateHuaweiIMasterVRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46284,8 +47600,8 @@ abstract class ApiHelper { } - def removeIAM2VirtualIDsFromProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectsAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectsAction() + def deleteHuaweiIMasterFabric(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterFabricAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46311,8 +47627,8 @@ abstract class ApiHelper { } - def removeRolesFromIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDAction() + def deleteHuaweiIMasterTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterTenantAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46338,8 +47654,8 @@ abstract class ApiHelper { } - def removeRolesFromIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDGroupAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDGroupAction() + def deleteHuaweiIMasterVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVRouterAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46365,8 +47681,8 @@ abstract class ApiHelper { } - def setIAM2ProjectLoginExpired(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetIAM2ProjectLoginExpiredAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.SetIAM2ProjectLoginExpiredAction() + def deleteHuaweiIMasterVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.DeleteHuaweiIMasterVpcAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46392,8 +47708,8 @@ abstract class ApiHelper { } - def setIAM2ProjectRetirePolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetIAM2ProjectRetirePolicyAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.SetIAM2ProjectRetirePolicyAction() + def pullHuaweiIMasterController(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.PullHuaweiIMasterControllerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46419,13 +47735,15 @@ abstract class ApiHelper { } - def setOrganizationOperation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetOrganizationOperationAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.SetOrganizationOperationAction() + def queryHuaweiIMasterFabric(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterFabricAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -46446,8 +47764,2117 @@ abstract class ApiHelper { } - def setOrganizationSupervisor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetOrganizationSupervisorAction.class) Closure c) { - def a = new org.zstack.sdk.iam2.api.SetOrganizationSupervisorAction() + def queryHuaweiIMasterTenant(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterTenantAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryHuaweiIMasterVRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryHuaweiIMasterVpc(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcAction.class) Closure c) { + def a = new org.zstack.sdk.huawei.imaster.QueryHuaweiIMasterVpcAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 addAttributesToIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2OrganizationAction() + 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 addAttributesToIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2ProjectAction() + 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 addAttributesToIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDAction() + 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 addAttributesToIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddAttributesToIAM2VirtualIDGroupAction() + 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 addIAM2VirtualIDGroupToProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDGroupToProjectsAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDGroupToProjectsAction() + 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 addIAM2VirtualIDsToGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToGroupAction() + 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 addIAM2VirtualIDsToOrganization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToOrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToOrganizationAction() + 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 addIAM2VirtualIDsToProject(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectAction() + 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 addIAM2VirtualIDsToProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectsAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddIAM2VirtualIDsToProjectsAction() + 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 addResourceToIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddResourceToIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddResourceToIAM2ProjectAction() + 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 addRolesToIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDAction() + 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 addRolesToIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AddRolesToIAM2VirtualIDGroupAction() + 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 attachIAM2ProjectToIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.AttachIAM2ProjectToIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.AttachIAM2ProjectToIAM2OrganizationAction() + 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 batchCreateIAM2VirtualIDFromConfigFile(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.BatchCreateIAM2VirtualIDFromConfigFileAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.BatchCreateIAM2VirtualIDFromConfigFileAction() + 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 changeIAM2OrganizationParent(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2OrganizationParentAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ChangeIAM2OrganizationParentAction() + 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 changeIAM2OrganizationState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2OrganizationStateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ChangeIAM2OrganizationStateAction() + 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 changeIAM2ProjectState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2ProjectStateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ChangeIAM2ProjectStateAction() + 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 changeIAM2VirtualIDGroupState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDGroupStateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDGroupStateAction() + 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 changeIAM2VirtualIDState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDStateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDStateAction() + 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 changeIAM2VirtualIDType(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDTypeAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ChangeIAM2VirtualIDTypeAction() + 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 checkIAM2OrganizationAvailability(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CheckIAM2OrganizationAvailabilityAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CheckIAM2OrganizationAvailabilityAction() + 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 checkIAM2VirtualIDConfigFile(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CheckIAM2VirtualIDConfigFileAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CheckIAM2VirtualIDConfigFileAction() + 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 createIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2OrganizationAction() + 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 createIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectAction() + 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 createIAM2ProjectFromTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectFromTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectFromTemplateAction() + 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 createIAM2ProjectRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectRoleAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectRoleAction() + 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 createIAM2ProjectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateAction() + 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 createIAM2ProjectTemplateFromProject(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateFromProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2ProjectTemplateFromProjectAction() + 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 createIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2VirtualIDAction() + 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 createIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.CreateIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.CreateIAM2VirtualIDGroupAction() + 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 deleteIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.DeleteIAM2OrganizationAction() + 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 deleteIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.DeleteIAM2ProjectAction() + 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 deleteIAM2ProjectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2ProjectTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.DeleteIAM2ProjectTemplateAction() + 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 deleteIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDAction() + 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 deleteIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.DeleteIAM2VirtualIDGroupAction() + 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 detachIAM2ProjectFromIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.DetachIAM2ProjectFromIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.DetachIAM2ProjectFromIAM2OrganizationAction() + 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 expungeIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.ExpungeIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.ExpungeIAM2ProjectAction() + 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 getIAM2OrganizationVirtualIDNumber(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2OrganizationVirtualIDNumberAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.GetIAM2OrganizationVirtualIDNumberAction() + 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 getIAM2ProjectsOfVirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2ProjectsOfVirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.GetIAM2ProjectsOfVirtualIDAction() + 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 getIAM2SystemAttributes(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2SystemAttributesAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.GetIAM2SystemAttributesAction() + 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 getIAM2VirtualIDAPIPermission(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2VirtualIDAPIPermissionAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.GetIAM2VirtualIDAPIPermissionAction() + 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 getIAM2VirtualIDInGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetIAM2VirtualIDInGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.GetIAM2VirtualIDInGroupAction() + 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 getOrganizationQuotaUsage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.GetOrganizationQuotaUsageAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.GetOrganizationQuotaUsageAction() + 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 loginIAM2Platform(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.LoginIAM2PlatformAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.LoginIAM2PlatformAction() + 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 loginIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.LoginIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.LoginIAM2ProjectAction() + 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 loginIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.LoginIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.LoginIAM2VirtualIDAction() + + 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 queryIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2OrganizationAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2OrganizationAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2OrganizationAttributeAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2OrganizationAttributeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2OrganizationProjectRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2OrganizationProjectRefAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2OrganizationProjectRefAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2ProjectAccountRef(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectAccountRefAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectAccountRefAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2ProjectAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectAttributeAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectAttributeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2ProjectRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectRoleAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectRoleAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2ProjectTemplate(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2ProjectTemplateAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2ProjectTemplateAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2VirtualIDAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAttributeAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDAttributeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryIAM2VirtualIDGroupAttribute(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAttributeAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.QueryIAM2VirtualIDGroupAttributeAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 recoverIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RecoverIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RecoverIAM2ProjectAction() + 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 removeAttributesFromIAM2Organization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2OrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2OrganizationAction() + 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 removeAttributesFromIAM2Project(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2ProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2ProjectAction() + 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 removeAttributesFromIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDAction() + 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 removeAttributesFromIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveAttributesFromIAM2VirtualIDGroupAction() + 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 removeIAM2ProjectLoginExpired(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2ProjectLoginExpiredAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveIAM2ProjectLoginExpiredAction() + 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 removeIAM2VirtualIDGroupFromProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDGroupFromProjectsAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDGroupFromProjectsAction() + 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 removeIAM2VirtualIDsFromGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromGroupAction() + 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 removeIAM2VirtualIDsFromOrganization(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromOrganizationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromOrganizationAction() + 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 removeIAM2VirtualIDsFromProject(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectAction() + 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 removeIAM2VirtualIDsFromProjects(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectsAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveIAM2VirtualIDsFromProjectsAction() + 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 removeRolesFromIAM2VirtualID(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDAction() + 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 removeRolesFromIAM2VirtualIDGroup(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDGroupAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.RemoveRolesFromIAM2VirtualIDGroupAction() + 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 setIAM2ProjectLoginExpired(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetIAM2ProjectLoginExpiredAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.SetIAM2ProjectLoginExpiredAction() + 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 setIAM2ProjectRetirePolicy(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetIAM2ProjectRetirePolicyAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.SetIAM2ProjectRetirePolicyAction() + 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 setOrganizationOperation(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetOrganizationOperationAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.SetOrganizationOperationAction() + 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 setOrganizationSupervisor(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.api.SetOrganizationSupervisorAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.api.SetOrganizationSupervisorAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46770,6 +50197,141 @@ abstract class ApiHelper { } + def getIAM2ProjectContainerClusterCandidates(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerClusterCandidatesAction() + 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 getIAM2ProjectContainerImageTags(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImageTagsAction() + 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 getIAM2ProjectContainerImages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectContainerImagesAction() + 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 getIAM2ProjectRepository(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.GetIAM2ProjectRepositoryAction() + 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 setIAM2ProjectContainerCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterAction.class) Closure c) { + def a = new org.zstack.sdk.iam2.container.SetIAM2ProjectContainerClusterAction() + 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 addPolicyStatementsToRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction.class) Closure c) { def a = new org.zstack.sdk.identity.role.api.AddPolicyStatementsToRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -46797,8 +50359,170 @@ abstract class ApiHelper { } - def attachPolicyToRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AttachPolicyToRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.AttachPolicyToRoleAction() + def attachPolicyToRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AttachPolicyToRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.AttachPolicyToRoleAction() + 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 attachRoleToAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AttachRoleToAccountAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.AttachRoleToAccountAction() + 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 changeRoleState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.ChangeRoleStateAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.ChangeRoleStateAction() + 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 createRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.CreateRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.CreateRoleAction() + 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 deleteRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.DeleteRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.DeleteRoleAction() + 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 detachPolicyFromRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.DetachPolicyFromRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.DetachPolicyFromRoleAction() + 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 detachRoleFromAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.DetachRoleFromAccountAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.DetachRoleFromAccountAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46824,13 +50548,15 @@ abstract class ApiHelper { } - def attachRoleToAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.AttachRoleToAccountAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.AttachRoleToAccountAction() + def queryRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.QueryRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.QueryRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a c() + a.conditions = a.conditions.collect { it.toString() } + if (System.getProperty("apipath") != null) { if (a.apiId == null) { @@ -46851,8 +50577,8 @@ abstract class ApiHelper { } - def changeRoleState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.ChangeRoleStateAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.ChangeRoleStateAction() + def removePolicyStatementsFromRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.RemovePolicyStatementsFromRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.RemovePolicyStatementsFromRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46878,8 +50604,8 @@ abstract class ApiHelper { } - def createRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.CreateRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.CreateRoleAction() + def updateRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.UpdateRoleAction.class) Closure c) { + def a = new org.zstack.sdk.identity.role.api.UpdateRoleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46905,8 +50631,8 @@ abstract class ApiHelper { } - def deleteRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.DeleteRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.DeleteRoleAction() + def degradeFromLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.DegradeFromLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.DegradeFromLicenseServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46932,8 +50658,8 @@ abstract class ApiHelper { } - def detachPolicyFromRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.DetachPolicyFromRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.DetachPolicyFromRoleAction() + def getLicenseAuthorizedCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.GetLicenseAuthorizedCapacityAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46959,8 +50685,8 @@ abstract class ApiHelper { } - def detachRoleFromAccount(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.DetachRoleFromAccountAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.DetachRoleFromAccountAction() + def isLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.IsLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.IsLicenseServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -46986,8 +50712,8 @@ abstract class ApiHelper { } - def queryRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.QueryRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.QueryRoleAction() + def queryLicenseAuthorizedNode(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.QueryLicenseAuthorizedNodeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -47015,8 +50741,8 @@ abstract class ApiHelper { } - def removePolicyStatementsFromRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.RemovePolicyStatementsFromRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.RemovePolicyStatementsFromRoleAction() + def registerLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.RegisterLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.RegisterLicenseServerAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -47042,8 +50768,170 @@ abstract class ApiHelper { } - def updateRole(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.identity.role.api.UpdateRoleAction.class) Closure c) { - def a = new org.zstack.sdk.identity.role.api.UpdateRoleAction() + def requestLicenseCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.RequestLicenseCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.RequestLicenseCapacityAction() + 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 syncLicenseCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.SyncLicenseCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.SyncLicenseCapacityAction() + 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 unregisterLicenseRequestedApplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.UnregisterLicenseRequestedApplicationAction() + 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 unregisterLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.UnregisterLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.UnregisterLicenseServerAction() + 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 upgradeToLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.UpgradeToLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.UpgradeToLicenseServerAction() + 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 verifyLicenseServer(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.VerifyLicenseServerAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.VerifyLicenseServerAction() + 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 withdrawLicenseCapacityApplication(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationAction.class) Closure c) { + def a = new org.zstack.sdk.license.api.server.WithdrawLicenseCapacityApplicationAction() a.sessionId = Test.currentEnvSpec?.session?.uuid c.resolveStrategy = Closure.OWNER_FIRST c.delegate = a @@ -48582,6 +52470,62 @@ abstract class ApiHelper { } + def createSNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.CreateSNSPluginEndpointAction() + 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 querySNSPluginEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction.class) Closure c) { + def a = new org.zstack.sdk.sns.platform.plugin.QuerySNSPluginEndpointAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 createSNSSnmpEndpoint(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.sns.platform.snmp.CreateSNSSnmpEndpointAction.class) Closure c) { def a = new org.zstack.sdk.sns.platform.snmp.CreateSNSSnmpEndpointAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -50967,6 +54911,33 @@ abstract class ApiHelper { } + def getPrometheusMetricLabelValue(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueAction.class) Closure c) { + def a = new org.zstack.sdk.zwatch.api.GetPrometheusMetricLabelValueAction() + 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 getZWatchAlertHistogram(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zwatch.api.GetZWatchAlertHistogramAction.class) Closure c) { def a = new org.zstack.sdk.zwatch.api.GetZWatchAlertHistogramAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy index d4b460d53be..e8f90f1d110 100755 --- a/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/CephPrimaryStorageSpec.groovy @@ -9,6 +9,7 @@ import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.ceph.CephConstants +import org.zstack.storage.ceph.CephMonSystemTags import org.zstack.storage.ceph.CephPoolCapacity import org.zstack.storage.ceph.CephSystemTags import org.zstack.storage.ceph.DataSecurityPolicy @@ -19,6 +20,7 @@ import org.zstack.testlib.vfs.VFSFile import org.zstack.utils.data.SizeUnit import org.zstack.utils.gson.JSONObjectUtil +import javax.persistence.Tuple import java.nio.file.Path /** @@ -32,11 +34,11 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { @SpecParam Map monAddrs = [:] @SpecParam - String rootVolumePoolName = "pri-c-" + Platform.getUuid() + String rootVolumePoolName = "pri-v-r-" + Platform.getUuid() @SpecParam String dataVolumePoolName = "pri-v-d-" + Platform.getUuid() @SpecParam - String imageCachePoolName = "pri-v-r-" + Platform.getUuid() + String imageCachePoolName = "pri-c-" + Platform.getUuid() CephPrimaryStorageSpec(EnvSpec envSpec) { super(envSpec) @@ -566,7 +568,7 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { return } - if (f.parent?.pathString() == snapshotPath) { + if (f.parent?.setVolumeChainInstallPaths() == snapshotPath) { children.add(f.pathString()) } } @@ -665,6 +667,18 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { .select(CephPrimaryStorageMonVO_.primaryStorageUuid) .eq(CephPrimaryStorageMonVO_.hostname, cmd.dstMonHostname) .findValue() + if (dstPrimaryStorageUuid == null) { + List ts = Q.New(CephPrimaryStorageMonVO.class) + .select(CephPrimaryStorageMonVO_.uuid, CephPrimaryStorageMonVO_.primaryStorageUuid) + .listTuple() + for (final def t in ts) { + String extraIp = CephMonSystemTags.EXTRA_IPS.getTokenByResourceUuid(t.get(0, String.class), CephMonSystemTags.EXTRA_IPS_TOKEN) + if (extraIp != null && extraIp.split(",").contains(cmd.dstMonHostname)) { + dstPrimaryStorageUuid = t.get(1, String.class) + break + } + } + } String dstFsid = Q.New(CephPrimaryStorageVO.class) .select(CephPrimaryStorageVO_.fsid) .eq(CephPrimaryStorageVO_.uuid, dstPrimaryStorageUuid) @@ -737,12 +751,17 @@ class CephPrimaryStorageSpec extends PrimaryStorageSpec { } simulator(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH) { HttpEntity e, EnvSpec spec -> - return new CephPrimaryStorageBase.GetBackingChainRsp() + def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteVolumeChainCmd.class) + def rsp = new CephPrimaryStorageBase.DeleteVolumeChainRsp() + rsp.undeletedInstallPaths = [] + return rsp } - VFS.vfsHook(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH, espec) { CephPrimaryStorageBase.AgentResponse rsp, HttpEntity e, EnvSpec spec -> + // TODO Need to implement ceph trash in VFS + VFS.vfsHook(CephPrimaryStorageBase.DELETE_VOLUME_CHAIN_PATH, espec) { CephPrimaryStorageBase.DeleteVolumeChainRsp rsp, HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, CephPrimaryStorageBase.DeleteVolumeChainCmd.class) VFS vfs = vfs(cmd, spec) + rsp.undeletedInstallPaths = [] for (String path : cmd.installPaths) { String vfsPath = cephPathToVFSPath(path) diff --git a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy index 68c1cafe297..5491d321f1b 100755 --- a/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/EnvSpec.groovy @@ -706,8 +706,8 @@ class EnvSpec extends ApiHelper implements Node { "PortMirrorSessionSequenceNumberVO", "LicenseHistoryVO", "EventLogVO", "VmSchedHistoryVO", "EventRecordsVO", "AuditsVO", "AlarmRecordsVO", "VmCrashHistoryVO", "EncryptionIntegrityVO", "FileIntegrityVerificationVO", "EncryptEntityMetadataVO", "VmInstanceDeviceAddressGroupVO", "HostOsCategoryVO", "KvmHostHypervisorMetadataVO", - "HaStrategyConditionVO", "SystemTagVO", "ConsoleProxyAgentVO", "ConsoleProxyVO", "XmlHookVO", "SSOServerTokenVO"]) { - // those tables will continue having entries during running a test suite + "HaStrategyConditionVO", "SystemTagVO", "ConsoleProxyAgentVO", "ConsoleProxyVO", "XmlHookVO", "SSOServerTokenVO", + "HostNetworkLabelVO", "L3NetworkSequenceNumberVO"]) { return } @@ -1049,7 +1049,7 @@ class EnvSpec extends ApiHelper implements Node { ret = handler() } else if (handler.maximumNumberOfParameters == 1) { ret = handler(entity) - } else if (handler.maximumNumberOfParameters == 3) { + } else if (handler.maximumNumberOfParameters >= 3) { ret = handler(req, entity, this) } else { ret = handler(entity, this) @@ -1058,7 +1058,8 @@ class EnvSpec extends ApiHelper implements Node { Closure postHandler = httpPostHandlers[url] if (postHandler == null) { - for (String httpUrl : httpPostHandlers.keys()) { + List keys = (httpHandlers.keySet() as List).sort {a, b -> b.size() - a.size() } + for (String httpUrl : keys) { if (Pattern.matches(httpUrl, url)) { postHandler = httpPostHandlers.get(httpUrl) break @@ -1123,7 +1124,8 @@ class EnvSpec extends ApiHelper implements Node { def handler = httpHandlers[url] if (handler == null) { - for (String httpUrl : httpHandlers.keys()) { + List keys = (httpHandlers.keySet() as List).sort {a, b -> b.size() - a.size() } + for (String httpUrl : keys) { if (Pattern.matches(httpUrl, url)) { handler = httpHandlers.get(httpUrl) break diff --git a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy index 38a1ab13775..19dedb00cce 100644 --- a/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ExternalPrimaryStorageSpec.groovy @@ -1,6 +1,9 @@ package org.zstack.testlib import org.springframework.http.HttpEntity +import org.zstack.cbd.LogicalPoolInfo +import org.zstack.cbd.kvm.KvmCbdCommands +import org.zstack.kvm.KVMAgentCommands import org.zstack.sdk.PrimaryStorageInventory import org.zstack.storage.zbs.ZbsPrimaryStorageMdsBase import org.zstack.storage.zbs.ZbsStorageController @@ -44,13 +47,56 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { return [:] } + simulator(ZbsPrimaryStorageMdsBase.PING_PATH) { + ZbsPrimaryStorageMdsBase.PingRsp rsp = new ZbsPrimaryStorageMdsBase.PingRsp() + rsp.success = true + return rsp + } + + simulator(ZbsPrimaryStorageMdsBase.SYNC_METADATA_PATH) { + ZbsPrimaryStorageMdsBase.SyncMetadataRsp rsp = new ZbsPrimaryStorageMdsBase.SyncMetadataRsp() + rsp.success = true + rsp.externalAddr = "127.0.0.1" + return rsp + } + + simulator(ZbsStorageController.DEPLOY_CLIENT_PATH) { HttpEntity e, EnvSpec spec -> + ZbsStorageController.DeployClientCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.DeployClientCmd.class) + ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) + assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." + + def rsp = new ZbsStorageController.DeployClientRsp() + rsp.success = true + + return rsp + } + + simulator(ZbsStorageController.UPDATE_HOST_DEPENDENCY_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new ZbsStorageController.UpdateHostDependencyRsp() + rsp.success = true + + return rsp + } + simulator(ZbsStorageController.GET_FACTS_PATH) { HttpEntity e, EnvSpec spec -> ZbsStorageController.GetFactsCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.GetFactsCmd.class) ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.GetFactsRsp() - rsp.setVersion("1.4.0+6e9353ad+release") + rsp.uuid = "123456789" + rsp.version = "1.6.1-for-test" + rsp.success = true + + return rsp + } + + simulator(ZbsStorageController.CHECK_HOST_STORAGE_CONNECTION_PATH) { HttpEntity e -> + ZbsStorageController.CheckHostStorageConnectionCmd cmd = JSONObjectUtil.toObject(e.body, ZbsStorageController.CheckHostStorageConnectionCmd) + assert cmd.hostUuid != null + + def rsp = new ZbsStorageController.CheckHostStorageConnectionRsp() + rsp.success = true return rsp } @@ -60,9 +106,33 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { ExternalPrimaryStorageSpec zspec = spec.specByUuid(cmd.uuid) assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." + LogicalPoolInfo.RedundanceAndPlaceMentPolicy redundanceAndPlaceMentPolicy = new LogicalPoolInfo.RedundanceAndPlaceMentPolicy() + redundanceAndPlaceMentPolicy.setCopysetNum(300) + redundanceAndPlaceMentPolicy.setReplicaNum(3) + redundanceAndPlaceMentPolicy.setZoneNum(3) + + LogicalPoolInfo logicalPoolInfo = new LogicalPoolInfo() + logicalPoolInfo.setPhysicalPoolID(1); + logicalPoolInfo.setRedundanceAndPlaceMentPolicy(redundanceAndPlaceMentPolicy); + logicalPoolInfo.setLogicalPoolID(1); + logicalPoolInfo.setUsedSize(322961408); + logicalPoolInfo.setQuota(0); + logicalPoolInfo.setCreateTime(1735875794); + logicalPoolInfo.setType(0); + logicalPoolInfo.setRawWalUsedSize(0); + logicalPoolInfo.setAllocateStatus(0); + logicalPoolInfo.setRawUsedSize(968884224); + logicalPoolInfo.setPhysicalPoolName("pool1"); + logicalPoolInfo.setCapacity(579933831168); + logicalPoolInfo.setLogicalPoolName(cmd.logicalPool); + logicalPoolInfo.setUserPolicy("eyJwb2xpY3kiIDogMX0="); + logicalPoolInfo.setAllocatedSize(3221225472); + + List logicalPoolInfos = new ArrayList<>() + logicalPoolInfos.add(logicalPoolInfo) + def rsp = new ZbsStorageController.GetCapacityRsp() - rsp.setCapacity(536870912000) - rsp.setUsedSize(4194304) + rsp.setLogicalPoolInfos(logicalPoolInfos) return rsp } @@ -75,7 +145,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { def rsp = new ZbsStorageController.CreateVolumeRsp() rsp.setSize(actualSize) rsp.setActualSize(actualSize) - rsp.setInstallPath("cbd:pool1/lpool1/volume") + rsp.setInstallPath(String.format("cbd:pool1/%s/%s", cmd.logicalPool, cmd.volume)) return rsp } @@ -95,7 +165,7 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { def rsp = new ZbsStorageController.CreateSnapshotRsp() rsp.setSize(actualSize) - rsp.setInstallPath("cbd:pool1/lpool1/image@image") + rsp.setInstallPath(cmd.path + "@" + cmd.snapshot) return rsp } @@ -107,8 +177,8 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { def rsp = new ZbsStorageController.CloneVolumeRsp() rsp.setSize(actualSize) - rsp.setInstallPath("cbd:pool1/lpool1/clone") - + // replace volume name + rsp.setInstallPath(cmd.path.replaceAll("([^/]+)\$", cmd.dstVolume)) return rsp } @@ -140,11 +210,24 @@ class ExternalPrimaryStorageSpec extends PrimaryStorageSpec { assert zspec != null: "cannot found zbs primary storage[uuid:${cmd.uuid}], check your environment()." def rsp = new ZbsStorageController.CopyRsp() - rsp.setInstallPath("cbd:pool1/lpool1/copy") + rsp.setInstallPath(cmd.path.replaceAll("([^/]+)\$", cmd.dstVolume)) rsp.setSize(actualSize) return rsp } + + + simulator(ZbsStorageController.GET_VOLUME_CLIENTS_PATH) { HttpEntity e, EnvSpec spec -> + return new ZbsStorageController.GetVolumeClientsRsp() + } + + simulator(KvmCbdCommands.SETUP_CBD_SELF_FENCER_PATH) { + return new KvmCbdCommands.AgentRsp() + } + + simulator(KvmCbdCommands.CANCEL_CBD_SELF_FENCER_PATH) { + return new KvmCbdCommands.AgentRsp() + } } } diff --git a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy index 839662037c9..6e77c2dfeda 100755 --- a/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/KVMSimulator.groovy @@ -20,6 +20,7 @@ import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.kvm.KVMConstant import org.zstack.kvm.VolumeTO +import org.zstack.testlib.vfs.Qcow2 import org.zstack.testlib.vfs.VFS import org.zstack.testlib.vfs.extensions.VFSPrimaryStorageTakeSnapshotBackend import org.zstack.testlib.vfs.extensions.VFSSnapshot @@ -438,6 +439,30 @@ class KVMSimulator implements Simulator { return new KVMAgentCommands.AgentResponse() } + spec.simulator(KVMConstant.KVM_INSTALL_OVS_PACKAGE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_UNINSTALL_OVS_PACKAGE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_START_OVS_SERVICE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_STOP_OVS_SERVICE_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_OVS_ADD_PORT_PATH) { + return new KVMAgentCommands.AgentResponse() + } + + spec.simulator(KVMConstant.KVM_OVS_DEL_PORT_PATH) { + return new KVMAgentCommands.AgentResponse() + } + spec.simulator(KVMConstant.KVM_SYNC_VM_DEVICEINFO_PATH) { HttpEntity e -> SyncVmDeviceInfoCmd cmd = JSONObjectUtil.toObject(e.body, SyncVmDeviceInfoCmd.class) def rsp = new SyncVmDeviceInfoResponse() @@ -588,13 +613,51 @@ class KVMSimulator implements Simulator { } spec.simulator(KVMConstant.KVM_BLOCK_COMMIT_VOLUME_PATH) { HttpEntity e -> - KVMAgentCommands.BlockCommitVolumeCmd cmd = JSONObjectUtil.toObject(e.body, KVMAgentCommands.BlockCommitVolumeCmd.class) - def rsp = new KVMAgentCommands.BlockCommitVolumeResponse() - rsp.newVolumeInstallPath = cmd.base + def rsp = new BlockCommitResponse() rsp.size = 1 return rsp } + VFS.vfsHook(KVMConstant.KVM_BLOCK_COMMIT_VOLUME_PATH, spec) { rsp, HttpEntity e, EnvSpec espec -> + BlockCommitCmd cmd = JSONObjectUtil.toObject(e.body, BlockCommitCmd.class) + + VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, cmd.volume.getVolumeUuid()).find() + assert volume : "cannot find volume[uuid: ${cmd.volume.getVolumeUuid()}]" + + String primaryStorageType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid).findValue() + assert primaryStorageType : "cannot find primary storage[uuid: ${volume.primaryStorageUuid}] " + + "from volume[uuid: ${volume.uuid}, name: ${volume.name}]" + + VFSPrimaryStorageTakeSnapshotBackend bkd = getVFSPrimaryStorageTakeSnapshotBackend(primaryStorageType) + bkd.blockCommit(e, espec, cmd, volume.toInventory() as VolumeInventory) + return rsp + } + + spec.simulator(KVMConstant.KVM_BLOCK_PULL_VOLUME_PATH) { HttpEntity e -> + def rsp = new BlockPullResponse() + rsp.size = 1 + return rsp + } + + VFS.vfsHook(KVMConstant.KVM_BLOCK_PULL_VOLUME_PATH, spec) { BlockPullResponse rsp, HttpEntity e, EnvSpec espec -> + BlockPullCmd cmd = JSONObjectUtil.toObject(e.body, BlockPullCmd.class) + + VolumeVO volume = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, cmd.volume.getVolumeUuid()).find() + assert volume : "cannot find volume[uuid: ${cmd.getVolume().getVolumeUuid()}]" + + String primaryStorageType = Q.New(PrimaryStorageVO.class).select(PrimaryStorageVO_.type) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid).findValue() + assert primaryStorageType : "cannot find primary storage[uuid: ${volume.primaryStorageUuid}] " + + "from volume[uuid: ${volume.uuid}, name: ${volume.name}]" + + VFSPrimaryStorageTakeSnapshotBackend bkd = getVFSPrimaryStorageTakeSnapshotBackend(primaryStorageType) + + Qcow2 newInstallPath = bkd.blockPull(e, espec, cmd, volume.toInventory() as VolumeInventory) + rsp.size = newInstallPath.actualSize == 0 ? 1 : newInstallPath.actualSize + return rsp + } + spec.simulator(KVMConstant.TAKE_VM_CONSOLE_SCREENSHOT_PATH) { def rsp = new KVMAgentCommands.TakeVmConsoleScreenshotRsp() rsp.imageData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABECAIAAADFvmZTAAACA0lEQVR4nO3VMYviQBQH8Hkvk5hE2ZUEU+juFlbKauH3/wYWNhYWKiiIRBDcZDckJJmZK6Zb7q44uJW7/f+qCcOQzP89XoSAL0FPT09VVTFzEARhGKZp2rat67qO4xhjlFJ5nidJcr1eHx8fPc+r65qZ27Zt2zbP83t//z9DRlFUVRURGWN83/c8z/O8Xq/HzFEUvb29aa211sxsgxZCKKWIKMuyPM9tSWypHMdRSmmtP72DmTudTlmWRCSl1Forpe5x2XuSSZJcLpeiKPr9flEUdV0LIZqm+fj4GI/H+/1+Npsdj8fX11chRFVV5/N5MBgIIZg5juP5fN7tdpfL5WAwiKJovV4Ph8MgCDabzWQyKcvycDgsFoskSVarlZTy+fl5t9udz2db2jvf/gsRETGz1tp13bZtbT8yszHGdqiNw66Z2W4ZY7TWUkqbl5TSGGOPSymFEHb+2Oa1u47jEFHTNFrrbxWxRQ8PD1LKuq7Lsux2u8zcNE1d10EQFEXR6XRc1yWiPM9937cxua6rlPrplIBfkS8vL2EYZlmWpul0OvV9/3Q6vb+/j0aj4/EYx3EYhkqp7XY7HA6TJDHG3G43IjocDnbsfsP2/OuIyP4P4U8Q0W8eAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgf/QDviYImvcayGAAAAAASUVORK5CYII=" diff --git a/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy index 2adeabafea8..747ca4388b1 100755 --- a/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/LocalStorageSpec.groovy @@ -120,9 +120,10 @@ class LocalStorageSpec extends PrimaryStorageSpec { Qcow2 file = vfs(e, cmd, spec).findFile { it.pathString() == cmd.path } assert file : "cannot find file[${cmd.path}]" - assert file.backingFile != null : "qcow2[${cmd.path}] has no backing file, ${file}" - rsp.backingFilePath = file.backingFile.toAbsolutePath().toString() + if (file.backingFile != null) { + rsp.backingFilePath = file.backingFile.toAbsolutePath().toString() + } rsp.size = 0 return rsp } @@ -294,6 +295,15 @@ class LocalStorageSpec extends PrimaryStorageSpec { return new LocalStorageKvmBackend.CreateVolumeWithBackingRsp() } + VFS.vfsHook(LocalStorageKvmBackend.CREATE_VOLUME_WITH_BACKING_PATH, espec) { rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.CreateVolumeWithBackingCmd.class) + VFS vfs = vfs(e, cmd, spec) + + Volume image = vfs.getFile(cmd.templatePathInCache, true) + vfs.createQcow2(cmd.installPath, image.actualSize, image.virtualSize, cmd.templatePathInCache) + return rsp + } + simulator(LocalStorageKvmBackend.CREATE_EMPTY_VOLUME_PATH) { HttpEntity e, EnvSpec spec -> return new LocalStorageKvmBackend.CreateEmptyVolumeRsp() } @@ -499,11 +509,43 @@ class LocalStorageSpec extends PrimaryStorageSpec { Qcow2 snapshot = vfs.getFile(cmd.snapshotInstallPath) assert snapshot : "cannot find snapshot[${cmd.snapshotInstallPath}]" vfs.createQcow2(cmd.workspaceInstallPath, 0L, 0L, null) + rsp.actualSize = 1 return rsp } simulator(LocalStorageKvmBackend.OFFLINE_MERGE_PATH) { HttpEntity e, EnvSpec spec -> - return new LocalStorageKvmBackend.OfflineMergeSnapshotRsp() + def rsp = new LocalStorageKvmBackend.OfflineMergeSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(LocalStorageKvmBackend.OFFLINE_MERGE_PATH, espec) { LocalStorageKvmBackend.OfflineMergeSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.OfflineMergeSnapshotCmd.class) + VFS vfs = vfs(e, cmd, spec) + Qcow2 dst = vfs.getFile(cmd.destPath, true) + if (cmd.fullRebase) { + dst.rebase((String) null) + } else { + dst.rebase(cmd.srcPath) + } + rsp.actualSize = 1 + return rsp + } + + simulator(LocalStorageKvmBackend.OFFLINE_COMMIT_PATH) { HttpEntity e, EnvSpec spec -> + def rsp = new LocalStorageKvmBackend.OfflineCommitSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(LocalStorageKvmBackend.OFFLINE_COMMIT_PATH, espec) { rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.OfflineCommitSnapshotCmd.class) + VFS vfs = vfs(e, cmd, spec) + Qcow2 src = vfs.getFile(cmd.top) + Qcow2 dst = vfs.getFile(cmd.base) + Qcow2 qcow2 = Qcow2.commit(vfs, src, dst) + rsp.actualSize = qcow2.actualSize == 0 ? 1 : qcow2.actualSize + return rsp } simulator(LocalStorageKvmBackend.CHECK_INITIALIZED_FILE) { @@ -558,23 +600,6 @@ class LocalStorageSpec extends PrimaryStorageSpec { rsp.hashValue = cmd.installPath return rsp } - - VFS.vfsHook(LocalStorageKvmBackend.OFFLINE_MERGE_PATH, espec) { rsp, HttpEntity e, EnvSpec spec -> - def cmd = JSONObjectUtil.toObject(e.body, LocalStorageKvmBackend.OfflineMergeSnapshotCmd.class) - VFS vfs = vfs(e, cmd, spec) - - - Qcow2 dst = vfs.getFile(cmd.destPath) - assert dst : "cannot find destination file[${cmd.destPath}]" - if (cmd.fullRebase) { - dst.rebase((String) null) - } else { - Qcow2 src = vfs.getFile(cmd.srcPath) - assert src : "cannot find source file[${cmd.srcPath}]" - dst.rebase(cmd.srcPath) - } - return rsp - } } } diff --git a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy index e8a3a3ebfbd..0dbe59bfc01 100755 --- a/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/NfsPrimaryStorageSpec.groovy @@ -125,7 +125,6 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { return rsp } - simulator(NfsPrimaryStorageKVMBackend.UNMOUNT_PRIMARY_STORAGE_PATH) { HttpEntity e -> Spec.checkHttpCallType(e, true) return new KVMAgentCommands.AgentResponse() @@ -234,24 +233,28 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { VFS.vfsHook(NfsPrimaryStorageKVMBackend.OFFLINE_SNAPSHOT_MERGE, xspec) { rsp, HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.OfflineMergeSnapshotCmd.class) VFS vfs = vfs(cmd, spec) - - if (!cmd.fullRebase) { - Qcow2 src = vfs.getFile(cmd.srcPath) - src.rebase(cmd.destPath) + Qcow2 dst = vfs.getFile(cmd.destPath, true) + if (cmd.fullRebase) { + dst.rebase((String) null) } else { - // when full rebase requested - // general steps for offline Qcow2 merge operation has following steps: - // 1. create a temp Qcow2 file - // 2. convert Qcow2 on destPath to temp Qcow2 - // 3. replace Qcow2 on destPath with temp file - if (!vfs.exists(cmd.destPath)) { - vfs.createQcow2(cmd.destPath, 0, 0) - } - - Qcow2 dest = vfs.getFile(cmd.destPath) - dest.rebase(null) + dst.rebase(cmd.srcPath) } + return rsp + } + simulator(NfsPrimaryStorageKVMBackend.OFFLINE_SNAPSHOT_COMMIT) { + def rsp = new NfsPrimaryStorageKVMBackendCommands.OfflineCommitSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(NfsPrimaryStorageKVMBackend.OFFLINE_SNAPSHOT_COMMIT, xspec) { NfsPrimaryStorageKVMBackendCommands.OfflineCommitSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.OfflineCommitSnapshotCmd.class) + VFS vfs = vfs(cmd, spec) + Qcow2 src = vfs.getFile(cmd.top) + Qcow2 dst = vfs.getFile(cmd.base) + Qcow2 qcow2 = Qcow2.commit(vfs, src, dst) + rsp.actualSize = qcow2.actualSize == 0 ? 1 : qcow2.actualSize return rsp } @@ -452,6 +455,7 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { simulator(NfsPrimaryStorageKVMBackend.NFS_TO_NFS_MIGRATE_BITS_PATH) { HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.NfsToNfsMigrateBitsCmd.class) + // all fast clone case must be mock by itself assert cmd.independentPath == null return new NfsPrimaryStorageKVMBackendCommands.NfsToNfsMigrateBitsRsp() } @@ -467,7 +471,12 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { srcVfs.walkFileSystem { VFSFile f -> if (f.pathString().contains(cmd.srcFolderPath)) { String newPath = f.pathString().replace(cmd.srcFolderPath, cmd.dstFolderPath) - dstVfs.createFileFrom(Paths.get(newPath), f) + def dstFile = dstVfs.createFileFrom(Paths.get(newPath), f) + if (dstFile instanceof Qcow2 && + dstFile.backingFile != null && + f.pathString() == cmd.independentPath) { + dstFile.rebase(null) + } } } @@ -515,33 +524,23 @@ class NfsPrimaryStorageSpec extends PrimaryStorageSpec { VFS.vfsHook(NfsPrimaryStorageKVMBackend.NFS_REBASE_VOLUME_BACKING_FILE_PATH, xspec) { rsp, HttpEntity e, EnvSpec spec -> def cmd = JSONObjectUtil.toObject(e.body, NfsPrimaryStorageKVMBackendCommands.NfsRebaseVolumeBackingFileCmd.class) -// String dstPrimaryStorageUuid = getPrimaryStorageFromPath(cmd.dstPsMountPath) -// VFS dstVfs = vfs(dstPrimaryStorageUuid, spec) - //TODO: for guoyi -// List fileList = new ArrayList<>() -// if (cmd.dstImageCacheTemplateFolderPath == null) { -// dstVfs.walkFileSystem { f -> -// if (f.pathString().contains(cmd.dstVolumeFolderPath)) { -// fileList.add(f) -// } -// } -// } else { -// dstVfs.walkFileSystem { f -> -// if (f.pathString().contains(cmd.dstVolumeFolderPath) -// || f.pathString().contains(cmd.dstImageCacheTemplateFolderPath)) { -// fileList.add(f) -// } -// } -// } -// -// fileList.each { file -> -// if (file.backingFile == null) { -// return -// } -// -// file.backingFile = Paths.get(file.backingFile.toAbsolutePath().toString().replace(cmd.srcPsMountPath, cmd.dstPsMountPath)) -// dstVfs.write(file.path, file.asJSONString()) -// } + + VFS dstVfs = vfs(cmd, spec) + List fileList = new ArrayList<>() + dstVfs.walkFileSystem { f -> + if (f.pathString().contains(cmd.dstVolumeFolderPath) + || (cmd.dstImageCacheTemplateFolderPath != null && + f.pathString().contains(cmd.dstImageCacheTemplateFolderPath))) { + fileList.add(f) + } + } + + fileList.each { file -> + if (file instanceof Qcow2 && file.backingFile != null) { + String newBackingFile = file.backingFile.toAbsolutePath().toString().replace(cmd.srcPsMountPath, cmd.dstPsMountPath) + file.rebase(newBackingFile) + } + } return rsp } diff --git a/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy index a8e3d148c64..25b24d7f412 100644 --- a/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SdnControllerSpec.groovy @@ -14,6 +14,8 @@ import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.VniRangeStruct import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.GetH3cTenantsRsp import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.H3cTenantStruct import org.zstack.sdnController.h3cVcfc.H3cVcfcCommands.GetH3cTeamLederIpReply +import org.zstack.sdnController.h3cVcfc.H3cVcfcV2Commands +import org.springframework.http.HttpEntity import org.zstack.sugonSdnController.controller.SugonSdnControllerConstant import org.zstack.sugonSdnController.controller.api.ApiSerializer import org.zstack.sugonSdnController.controller.api.TfCommands @@ -113,21 +115,36 @@ class SdnControllerSpec extends Spec implements HasSession { } simulator(H3cVcfcCommands.H3C_VCFC_TENANTS) { - GetH3cTenantsRsp rsp = new GetH3cTenantsRsp() + H3cVcfcV2Commands.GetH3cTenantsRsp rsp = new H3cVcfcV2Commands.GetH3cTenantsRsp() rsp.tenants = new ArrayList<>() - H3cTenantStruct t1 = new H3cTenantStruct() - t1.type = "default" - t1.name = "default" - t1.id = "id1" + H3cVcfcV2Commands.H3cTenantStruct t1 = new H3cVcfcV2Commands.H3cTenantStruct() + t1.id = "03e01b37-8440-471a-aa8f-8d1fb8cc1381" + t1.name = "Test" + t1.type = "local-create" + t1.vds_list = ["eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc"] + t1.cloud_region_name = null + t1.cloud_domain_name = null rsp.tenants.add(t1) - H3cTenantStruct t2 = new H3cTenantStruct() - t2.type = "zstack" - t2.name = "zstack" - t2.id = "id2" + H3cVcfcV2Commands.H3cTenantStruct t2 = new H3cVcfcV2Commands.H3cTenantStruct() + t2.id = "ffffffff-0000-0000-0000-000000000001" + t2.name = "default" + t2.type = "default" + t2.vds_list = ["ffffffff-0000-0000-0000-000000000001"] + t2.cloud_region_name = null + t2.cloud_domain_name = null rsp.tenants.add(t2) + H3cVcfcV2Commands.H3cTenantStruct t3 = new H3cVcfcV2Commands.H3cTenantStruct() + t3.id = "c9d49b6f-d2cd-4636-b9d4-be0f9c9c7783" + t3.name = "sr" + t3.type = "local-create" + t3.vds_list = ["ffffffff-0000-0000-0000-000000000001"] + t3.cloud_region_name = null + t3.cloud_domain_name = null + rsp.tenants.add(t3) + return rsp } @@ -137,6 +154,37 @@ class SdnControllerSpec extends Spec implements HasSession { return rsp } + simulator(H3cVcfcV2Commands.H3C_VCFC_VDS) { + H3cVcfcV2Commands.GetH3cVdsRsp rsp = new H3cVcfcV2Commands.GetH3cVdsRsp() + rsp.vds = new ArrayList<>() + + H3cVcfcV2Commands.H3cVdsStruct vds1 = new H3cVcfcV2Commands.H3cVdsStruct() + vds1.uuid = "eb32cf5e-04e9-42ad-b64c-2c3f9bacd3cc" + vds1.name = "Test_VDS" + vds1.bridge = "Test_VDS-br" + vds1.status = "UP" + vds1.openflow_hard_age = "300" + vds1.vxlan_tunnel_name = "vxlan_Test_VDS-br" + vds1.vxlan_range = "1-16777215" + vds1.virtual_mac = "00:00:00:00:00:01" + vds1.forwarding_mode = "mac-forwarding" + rsp.vds.add(vds1) + + H3cVcfcV2Commands.H3cVdsStruct vds2 = new H3cVcfcV2Commands.H3cVdsStruct() + vds2.uuid = "ffffffff-0000-0000-0000-000000000001" + vds2.name = "Default_VDS" + vds2.bridge = "Default_VDS-br" + vds2.status = "UP" + vds2.openflow_hard_age = "300" + vds2.vxlan_tunnel_name = "vxlan_Default_VDS-br" + vds2.vxlan_range = "1-16777215" + vds2.virtual_mac = "00:00:00:00:00:02" + vds2.forwarding_mode = "mac-forwarding" + rsp.vds.add(vds2) + + return rsp + } + simulator(TfCommands.TF_GET_DAEMON) { TfCommands.GetDomainRsp rsp = new TfCommands.GetDomainRsp() rsp.uuid = TfCommands.TEST_DOMAIN_UUID diff --git a/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy index 59d1f2e0d9d..2735e198f25 100755 --- a/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SharedMountPointPrimaryStorageSpec.groovy @@ -236,7 +236,38 @@ class SharedMountPointPrimaryStorageSpec extends PrimaryStorageSpec { } simulator(KvmBackend.OFFLINE_MERGE_SNAPSHOT_PATH) { - return new KvmBackend.AgentRsp() + def rsp = new KvmBackend.OfflineMergeSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(KvmBackend.OFFLINE_MERGE_SNAPSHOT_PATH, xspec) { KvmBackend.OfflineMergeSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, KvmBackend.OfflineMergeSnapshotCmd.class) + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(cmd, spec) + Qcow2 dst = vfs.getFile(cmd.destPath, true) + if (cmd.fullRebase) { + dst.rebase((String) null) + } else { + dst.rebase(cmd.srcPath) + } + rsp.actualSize = 1 + return rsp + } + + simulator(KvmBackend.OFFLINE_COMMIT_SNAPSHOT_PATH) { + def rsp = new KvmBackend.OfflineCommitSnapshotRsp() + rsp.actualSize = 1 + return rsp + } + + VFS.vfsHook(KvmBackend.OFFLINE_COMMIT_SNAPSHOT_PATH, xspec) { KvmBackend.OfflineCommitSnapshotRsp rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, KvmBackend.OfflineCommitSnapshotCmd.class) + VFS vfs = vfs(cmd, spec) + Qcow2 src = vfs.getFile(cmd.top) + Qcow2 dst = vfs.getFile(cmd.base) + Qcow2 qcow2 = Qcow2.commit(vfs, src, dst) + rsp.actualSize = qcow2.actualSize == 0 ? 1 : qcow2.actualSize + return rsp } simulator(KvmBackend.CREATE_EMPTY_VOLUME_PATH) { @@ -309,6 +340,29 @@ class SharedMountPointPrimaryStorageSpec extends PrimaryStorageSpec { rsp.hashValue = cmd.installPath return rsp } + + simulator(KvmBackend.GET_BACKING_CHAIN_PATH) { HttpEntity e, EnvSpec spec -> + return new KvmBackend.GetBackingChainRsp() + } + + VFS.vfsHook(KvmBackend.GET_BACKING_CHAIN_PATH, xspec) { rsp, HttpEntity e, EnvSpec spec -> + def cmd = JSONObjectUtil.toObject(e.body, KvmBackend.GetBackingChainCmd.class) + + List chain = [] + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(cmd, spec) + Qcow2 file = vfs.getFile(cmd.installPath) + if (file == null) { + logger.debug("Dump of whole VFS:\\n${vfs.dumpAsString()}") + } + assert file != null : "cannot find file[${cmd.installPath}]" + while (file.backingQcow2() != null) { + chain.add(file.backingQcow2().pathString()) + file = file.backingQcow2() + } + + rsp.backingChain = chain + return rsp + } } } diff --git a/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy b/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy index 59d343f23a2..6346b1cc68d 100755 --- a/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/SpringSpec.groovy @@ -66,6 +66,8 @@ class SpringSpec { void flatNetwork() { include("flatNetworkProvider.xml") + include("sdnController.xml") + include("vxlan.xml") } void sftpBackupStorage() { diff --git a/testlib/src/main/java/org/zstack/testlib/Test.groovy b/testlib/src/main/java/org/zstack/testlib/Test.groovy index 9003da73d3f..553d3084959 100755 --- a/testlib/src/main/java/org/zstack/testlib/Test.groovy +++ b/testlib/src/main/java/org/zstack/testlib/Test.groovy @@ -1,5 +1,7 @@ package org.zstack.testlib +import com.google.gson.JsonParser +import com.google.gson.JsonSyntaxException import okhttp3.OkHttpClient import org.apache.commons.lang.StringUtils import org.zstack.core.Platform @@ -15,6 +17,8 @@ import org.zstack.header.message.AbstractBeforeDeliveryMessageInterceptor import org.zstack.header.message.AbstractBeforeSendMessageInterceptor import org.zstack.header.message.Event import org.zstack.header.message.Message +import org.zstack.sdk.ErrorCode +import org.zstack.sdk.ErrorCodeList import org.zstack.sdk.SessionInventory import org.zstack.sdk.ZQLQueryReturn import org.zstack.sdk.ZSClient @@ -514,6 +518,10 @@ abstract class Test extends ApiHelper implements Retry { assert counter.get() > 0 } + void assertNotCalled() { + assert counter.get() == 0 + } + void assertCalledOnce() { assert counter.get() == 1 } @@ -1006,6 +1014,56 @@ mysqldump -u root zstack > ${failureLogDir.absolutePath}/dbdump.sql } } + static void expectApiFailure(Closure c, @DelegatesTo(strategy = Closure.OWNER_FIRST, value = ErrorCodeList.class) Closure errorCodeChecker) { + AssertionError error = null + + try { + c() + } catch (AssertionError t) { + error = t + } catch (Throwable t) { + throw new Exception("expected to get a Throwable of AssertionError but got ${t.class.name}", t) + } + + if (error == null) { + throw new ExpectedException("expect AssertionError raised, but nothing happens") + } + + def message = error.message + if (!message.startsWith("API failure: ")) { + throw new Exception("unexpected API failure", error) + } + + ErrorCodeList code + try { + int startIndex = "API failure: ".length() + int endIndex = message.indexOf(". Expression: ") + code = JSONObjectUtil.toObject(message.substring(startIndex, endIndex), ErrorCodeList) + } catch (JsonSyntaxException | IndexOutOfBoundsException ignored) { + throw new Exception("unexpected API failure", error) + } + + if (code.code == "sdk.1000") { + code = extractOriginalErrorFromSDKError(code) + } + + errorCodeChecker.resolveStrategy = Closure.OWNER_FIRST + errorCodeChecker.delegate = code + errorCodeChecker.call() + } + + /** + * MN always return HTTP code 503 when MN raise Identity ErrorCode. + * ZStack SDK will warp true error code with sdk.1000. + * + * The function would extract original error code from SDKErrorCode. + */ + static ErrorCodeList extractOriginalErrorFromSDKError(ErrorCode sdkError) { + assert sdkError.code == "sdk.1000" + def errorCodeJson = JsonParser.parseString(sdkError.details).getAsJsonObject().get("error") + return JSONObjectUtil.rehashObject(errorCodeJson, ErrorCodeList.class) + } + protected void configProperty() { return } diff --git a/testlib/src/main/java/org/zstack/testlib/TestLibController.java b/testlib/src/main/java/org/zstack/testlib/TestLibController.java index 8ea200aa56a..3b8ac96d5f2 100755 --- a/testlib/src/main/java/org/zstack/testlib/TestLibController.java +++ b/testlib/src/main/java/org/zstack/testlib/TestLibController.java @@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.Objects; /** * Created by xing5 on 2017/2/12. @@ -22,6 +23,11 @@ public class TestLibController { } ) public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + if (request.getMethod().equalsIgnoreCase(RequestMethod.HEAD.toString())) { + response.setStatus(200); + return; + } + Test.handleHttp(request, response); } } diff --git a/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy b/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy index 9fdc572b6d1..1279c3a47df 100755 --- a/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/VirtualRouterOfferingSpec.groovy @@ -176,6 +176,14 @@ class VirtualRouterOfferingSpec extends InstanceOfferingSpec { simulator(VirtualRouterConstant.VR_CHANGE_DEFAULT_ROUTE_NETWORK) { return new VirtualRouterCommands.ChangeDefaultNicRsp() } + + simulator(VirtualRouterConstant.VR_HA_MASTER_DEMOTE) { + return new VirtualRouterCommands.AgentResponse() + } + + simulator(VirtualRouterConstant.VR_CONFIG_PROMTAIL) { + return new VirtualRouterCommands.AgentResponse() + } } } diff --git a/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy b/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy index 0dfd82348d0..b40d90c6e74 100755 --- a/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/VmSpec.groovy @@ -169,6 +169,7 @@ class VmSpec extends Spec implements HasSession { delegate.l3NetworkUuids = l3Networks() delegate.defaultL3NetworkUuid = defaultL3Network() delegate.systemTags = systemTags + delegate.timeout = 60000 } postCreate { diff --git a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy index 91fdc39f4e0..02833fe6480 100644 --- a/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy +++ b/testlib/src/main/java/org/zstack/testlib/tool/CodeGenerator.groovy @@ -1,5 +1,11 @@ package org.zstack.testlib.tool +import org.reflections.Reflections +import org.reflections.scanners.Scanners +import org.reflections.util.ClasspathHelper +import org.reflections.util.ConfigurationBuilder +import org.reflections.util.FilterBuilder +import org.zstack.utils.BeanUtils import org.zstack.utils.StringTemplateUtils import javax.persistence.* @@ -17,6 +23,7 @@ class CodeGenerator { private static String LOWER_CASE_RESOURCE_NAME = "LOWER_CASE_RESOURCE_NAME" private static String PRIVATE_FIELDS = "PRIVATE_FIELDS" private static String GETTER_SETTER = "GETTER_SETTER" + private static String INVENTORY_CONSTRUCTOR = "INVENTORY_CONSTRUCTOR" private static String IMPORT_PACKAGE = "IMPORT_PACKAGE" private static String INVENTORY_NAME = "INVENTORY_NAME" private static String ENTITY_CLASS = "ENTITY_CLASS" @@ -25,7 +32,16 @@ class CodeGenerator { * * @param entityClass the jpa vo entity class */ - static void generateCodeFromJpaEntity(Class entityClass) { + static void generateCodeFromJpaEntity(String entity) { + ConfigurationBuilder builder = ConfigurationBuilder.build() + .setUrls(ClasspathHelper.forPackage("org.zstack")) + .setScanners(Scanners.SubTypes, Scanners.MethodsAnnotated, + Scanners.FieldsAnnotated, Scanners.TypesAnnotated, + Scanners.MethodsParameter) + .setExpandSuperTypes(false) + .filterInputsBy(new FilterBuilder().includePackage("org.zstack")); + BeanUtils.reflections = new Reflections(builder) + Class entityClass = BeanUtils.reflections.forClass(entity) if (!entityClass.isAnnotationPresent(Entity.class) && !entityClass.isAnnotationPresent(MappedSuperclass.class)) { System.out.printf("%s is not a JPA entity class", entityClass.getName()) return @@ -47,7 +63,7 @@ class CodeGenerator { PojoField pojoField = new PojoField() pojoField.fieldName = field.getName() pojoField.fieldType = getJavaTypeFromFieldType(field.getType()) - pojoField.columnName = convert(field.getType()) + pojoField.columnName = convert(pojoField.fieldName, field.getType()) pojoField.field = field pojoFields.add(pojoField) } @@ -62,6 +78,12 @@ class CodeGenerator { return String.format("import %s;", packageName) } + private static String generateInventoryConstructor(PojoField field) { + String methodName = field.fieldName.substring(0, 1).toUpperCase() + field.fieldName.substring(1) + String getterName = String.format("get%s", methodName) + return String.format(" this.%s = vo.%s();", field.fieldName, getterName) + } + private static String generateGetterAndSetter(PojoField field) { String methodName = field.fieldName.substring(0, 1).toUpperCase() + field.fieldName.substring(1) String getterName = String.format("get%s", methodName) @@ -104,6 +126,9 @@ class CodeGenerator { // fields for rest api and inventory List gettersAndSetters = new ArrayList<>() + + // constructor from vo for inventory + List constructorOfFieldsFromVO = new ArrayList<>() } private static PojoClass createInventory(List fields, Class entityClass) { @@ -120,6 +145,7 @@ class CodeGenerator { " public void setUuid(String uuid) {\n" + " this.uuid = uuid;\n" + " }") + pojoClass.constructorOfFieldsFromVO.add(" this.uuid = vo.getUuid();") } pojoClass.importPackages.add("import java.io.Serializable;") @@ -133,6 +159,7 @@ class CodeGenerator { pojoClass.importPackages.add(generateImportPackage(field.field.getClass().getCanonicalName())) } pojoClass.gettersAndSetters.add(generateGetterAndSetter(field)) + pojoClass.constructorOfFieldsFromVO.add(generateInventoryConstructor(field)) pojoClass.privateFields.add(String.format(" private %s %s;", field.fieldType, field.fieldName)) } @@ -151,6 +178,7 @@ class CodeGenerator { bindings.put(IMPORT_PACKAGE, pojoClass.importPackages.join("\n")) bindings.put(INVENTORY_NAME, pojoClass.inventoryClassName) bindings.put(ENTITY_CLASS, entityClass.getSimpleName()) + bindings.put(INVENTORY_CONSTRUCTOR, pojoClass.constructorOfFieldsFromVO.join("\n")) writeToFile(String.format("%s.java", pojoClass.inventoryClassName), StringTemplateUtils.createStringFromTemplate(INVENTORY_TEMPLATE, bindings)) @@ -173,11 +201,17 @@ class CodeGenerator { } } - private static String convert(Class fieldType) { + private static String convert(String fieldName, Class fieldType) { String javaType = getJavaTypeFromFieldType(fieldType) if (javaType == "String") { - return "varchar(255)" + if (fieldName.toLowerCase().contains("uuid")) { + return "varchar(32)" + } else if (fieldName.toLowerCase().contains("description")) { + return "varchar(2048)" + } else { + return "varchar(255)" + } } else if (javaType == "Integer" || javaType == "int") { return "int" } else if (javaType == "Long" || javaType == "long") { @@ -234,7 +268,7 @@ class CodeGenerator { ColumnDefinition columnDefinition = new ColumnDefinition() columnDefinition.columnName = columnName - columnDefinition.columnType = convert(field.getType()) + columnDefinition.columnType = convert(columnName, field.getType()) columnDefinition.isPrimaryKey = isPrimaryKey columnDefinition.needIndex = needIndex columnDefinitions.add(columnDefinition) @@ -438,7 +472,6 @@ import java.util.List; @RestResponse(allTo = "inventories") public class APIQuery${RESOURCE_NAME}Reply extends APIQueryReply { - private List<${RESOURCE_NAME}Inventory> inventories; public List<${RESOURCE_NAME}Inventory> getInventories() { @@ -543,7 +576,7 @@ import org.zstack.header.rest.RestRequest; path = "/${LOWER_CASE_RESOURCE_NAME}s/{uuid}", method = HttpMethod.PUT, responseClass = APIUpdate${RESOURCE_NAME}Event.class, - parameterName = "params" + isAction = true ) public class APIUpdate${RESOURCE_NAME}Msg extends APIMessage { @APIParam(resourceType = ${RESOURCE_NAME}VO.class, checkAccount = true, operationTarget = true) @@ -584,6 +617,10 @@ public class APIUpdate${RESOURCE_NAME}Event extends APIEvent { return inventory; } + public void setInventory(${RESOURCE_NAME}Inventory inventory) { + this.inventory = inventory; + } + public static APIUpdate${RESOURCE_NAME}Event __example__() { APIUpdate${RESOURCE_NAME}Event event = new APIUpdate${RESOURCE_NAME}Event(); return event; @@ -607,6 +644,14 @@ public class APIDelete${RESOURCE_NAME}Msg extends APIMessage { @APIParam(resourceType = ${RESOURCE_NAME}VO.class, checkAccount = true, operationTarget = true) private String uuid; + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + public static APIDelete${RESOURCE_NAME}Msg __example__() { APIDelete${RESOURCE_NAME}Msg msg = new APIDelete${RESOURCE_NAME}Msg(); msg.setUuid(uuid()); @@ -648,10 +693,29 @@ public class ${INVENTORY_NAME} implements Serializable, Cloneable { ${PRIVATE_FIELDS} ${GETTER_SETTER} + + public ${INVENTORY_NAME}() {} + + public ${INVENTORY_NAME}(${ENTITY_CLASS} vo) { +${INVENTORY_CONSTRUCTOR} + } + + public static ${INVENTORY_NAME} valueOf(${ENTITY_CLASS} vo) { + return new ${INVENTORY_NAME}(vo); + } + + public static List<${INVENTORY_NAME}> valueOf(Collection<${ENTITY_CLASS}> vos) { + List<${INVENTORY_NAME}> invs = new ArrayList<>(); + for (${ENTITY_CLASS} vo : vos) { + invs.add(valueOf(vo)); + } + + return invs; + } } ''' static final String API_PARAM_TEMPLATE = ''' @APIParam(maxLength = %s) private %s %s;''' -} \ No newline at end of file +} diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy index 056a42ad335..74ccf075f4d 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/Qcow2.groovy @@ -168,5 +168,36 @@ class Qcow2 extends Volume { return baseImage } -} + List getChildren() { + List children = [] + vfs.walkFileSystem { vfile -> + if (vfile instanceof Qcow2 && vfile.backingFile != null && vfile.backingFile.toAbsolutePath().toString() == pathString()) { + children.add(vfile) + } + } + return children + } + + static Qcow2 commit(VFS vfs, Qcow2 top, Qcow2 base) { + assert top != null && base != null: "commit requires non-null top and base" + assert top.pathString() != base.pathString(): "top and base must differ" + + top.backingFile = null + top.update() + List childrenOfTop = top.getChildren() + childrenOfTop.forEach { children -> + children.backingFile = vfs.getPath(base.pathString()) + children.update() + } + return base + } + + static void pull(VFS vfs, String base, Qcow2 volumePath) { + if (base == null) { + volumePath.rebase((String) null) + } else { + volumePath.rebase(base) + } + } +} diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy index c3692b14ffd..b8751b8d5bb 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/VFS.groovy @@ -319,9 +319,12 @@ class VFS { } createDirectories(p.getParent()) + def originPath = f.path f.path = p write(p, f.asJSONString()) - return getFile(f.pathString(), true) + VFSFile ret = getFile(f.pathString(), true) + f.path = originPath // restore original path + return ret } VFSFile createFileFrom(VFSFile f) { diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy index 9570207a116..bdc327fc41f 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/extensions/VFSPrimaryStorageTakeSnapshotBackend.groovy @@ -3,10 +3,10 @@ package org.zstack.testlib.vfs.extensions import org.springframework.http.HttpEntity import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmJobStruct import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmResultStruct -import org.zstack.header.storage.snapshot.VolumeSnapshotInventory import org.zstack.header.volume.VolumeInventory import org.zstack.kvm.KVMAgentCommands import org.zstack.testlib.EnvSpec +import org.zstack.testlib.vfs.Qcow2 interface VFSPrimaryStorageTakeSnapshotBackend { String getPrimaryStorageType() @@ -24,4 +24,8 @@ interface VFSPrimaryStorageTakeSnapshotBackend { List takeSnapshotsOnVolumes(String primaryStorageUuid, HttpEntity e, EnvSpec spec, List snapshotJobs) void blockStream(HttpEntity e, EnvSpec spec, VolumeInventory volume) + + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) + + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy index 108ad4d6563..9d59b128586 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/storage/LocalStorageVFSPrimaryStorageTakeSnapshotBackend.groovy @@ -1,7 +1,6 @@ package org.zstack.testlib.vfs.storage import org.springframework.http.HttpEntity -import org.zstack.core.Platform import org.zstack.core.db.Q import org.zstack.core.db.SQL import org.zstack.header.storage.primary.PrimaryStorageVO @@ -117,6 +116,34 @@ class LocalStorageVFSPrimaryStorageTakeSnapshotBackend implements AbstractFileSy .find() VFS vfs = LocalStorageSpec.vfs(LocalStorageSpec.hostUuidFromHTTPHeaders(e), storagePath, spec) + if (vfs.exists(volume.getInstallPath())) { + vfs.delete(volume.getInstallPath()) + } blockStream(vfs, volume) } + + @Override + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) { + String storagePath = Q.New(PrimaryStorageVO.class) + .select(PrimaryStorageVO_.mountPath) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid) + .findValue() + VFS vfs = LocalStorageSpec.vfs(LocalStorageSpec.hostUuidFromHTTPHeaders(e), storagePath, spec) + Qcow2 top = vfs.getFile(cmd.top, true) + Qcow2 base = vfs.getFile(cmd.base, true) + Qcow2.commit(vfs, top, base) + return vfs.getFile(cmd.base, true) + } + + @Override + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) { + String storagePath = Q.New(PrimaryStorageVO.class) + .select(PrimaryStorageVO_.mountPath) + .eq(PrimaryStorageVO_.uuid, volume.primaryStorageUuid) + .findValue() + VFS vfs = LocalStorageSpec.vfs(LocalStorageSpec.hostUuidFromHTTPHeaders(e), storagePath, spec) + Qcow2 volumePath = vfs.getFile(volume.getInstallPath(), true) + Qcow2.pull(vfs, cmd.base, volumePath) + return vfs.getFile(volume.getInstallPath(), true) + } } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy index 2358c8da6ab..a5826b0d973 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/storage/NFSVFSPrimaryStorageTakeSnapshotBackend.groovy @@ -10,8 +10,8 @@ import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.storage.primary.nfs.NfsPrimaryStorageConstant import org.zstack.testlib.EnvSpec -import org.zstack.testlib.LocalStorageSpec import org.zstack.testlib.NfsPrimaryStorageSpec +import org.zstack.testlib.vfs.Qcow2 import org.zstack.testlib.vfs.VFS import org.zstack.testlib.vfs.extensions.VFSPrimaryStorageTakeSnapshotBackend import org.zstack.testlib.vfs.extensions.VFSSnapshot @@ -48,6 +48,27 @@ class NFSVFSPrimaryStorageTakeSnapshotBackend implements AbstractFileSystemBased @Override void blockStream(HttpEntity e, EnvSpec spec, VolumeInventory volume) { - blockStream(NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec), volume) + VFS vfs = NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + if (vfs.exists(volume.getInstallPath())) { + vfs.delete(volume.getInstallPath()) + } + blockStream(vfs, volume) + } + + @Override + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) { + VFS vfs = NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 top = vfs.getFile(cmd.top, true) + Qcow2 base = vfs.getFile(cmd.base, true) + Qcow2.commit(vfs, top, base) + return vfs.getFile(cmd.base, true) + } + + @Override + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) { + VFS vfs = NfsPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 volumePath = vfs.getFile(volume.getInstallPath(), true) + Qcow2.pull(vfs, cmd.base, volumePath) + return vfs.getFile(volume.getInstallPath(), true) } } diff --git a/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy b/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy index f0a5a5fcbf6..9cea533a330 100755 --- a/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy +++ b/testlib/src/main/java/org/zstack/testlib/vfs/storage/SMPVFSPrimaryStorageTakeSnapshotBackend.groovy @@ -1,14 +1,15 @@ package org.zstack.testlib.vfs.storage import org.springframework.http.HttpEntity -import org.zstack.core.Platform +import org.zstack.core.db.Q import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmJobStruct import org.zstack.header.storage.snapshot.TakeSnapshotsOnKvmResultStruct import org.zstack.header.volume.VolumeInventory +import org.zstack.header.volume.VolumeVO +import org.zstack.header.volume.VolumeVO_ import org.zstack.kvm.KVMAgentCommands import org.zstack.storage.primary.smp.SMPConstants import org.zstack.testlib.EnvSpec -import org.zstack.testlib.NfsPrimaryStorageSpec import org.zstack.testlib.SharedMountPointPrimaryStorageSpec import org.zstack.testlib.vfs.Qcow2 import org.zstack.testlib.vfs.VFS @@ -43,6 +44,27 @@ class SMPVFSPrimaryStorageTakeSnapshotBackend implements AbstractFileSystemBased @Override void blockStream(HttpEntity e, EnvSpec spec, VolumeInventory volume) { - blockStream(SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec), volume) + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + if (vfs.exists(volume.getInstallPath())) { + vfs.delete(volume.getInstallPath()) + } + blockStream(vfs, volume) + } + + @Override + Qcow2 blockCommit(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockCommitCmd cmd, VolumeInventory volume) { + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 top = vfs.getFile(cmd.top, true) + Qcow2 base = vfs.getFile(cmd.base, true) + Qcow2.commit(vfs, top, base) + return vfs.getFile(cmd.base, true) + } + + @Override + Qcow2 blockPull(HttpEntity e, EnvSpec spec, KVMAgentCommands.BlockPullCmd cmd, VolumeInventory volume) { + VFS vfs = SharedMountPointPrimaryStorageSpec.vfs(volume.getPrimaryStorageUuid(), spec) + Qcow2 volumePath = vfs.getFile(volume.getInstallPath(), true) + Qcow2.pull(vfs, cmd.base, volumePath) + return vfs.getFile(volume.getInstallPath(), true) } } diff --git a/utils/pom.xml b/utils/pom.xml index edc3ae00556..55be08113bb 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -4,7 +4,7 @@ zstack org.zstack - 5.2.0 + 5.4.0 .. utils diff --git a/utils/src/main/java/org/zstack/utils/CollectionUtils.java b/utils/src/main/java/org/zstack/utils/CollectionUtils.java index b74d83c9c83..b04a0635668 100755 --- a/utils/src/main/java/org/zstack/utils/CollectionUtils.java +++ b/utils/src/main/java/org/zstack/utils/CollectionUtils.java @@ -56,6 +56,10 @@ public static List transform(Collection from, java.util.fun return from.stream().map(mapper).collect(Collectors.toList()); } + public static List transformAndRemoveNull(Collection from, java.util.function.Function mapper) { + return from.stream().map(mapper).filter(Objects::nonNull).collect(Collectors.toList()); + } + public static List filter(Collection from, Predicate tester) { return from.stream().filter(tester).collect(Collectors.toList()); } diff --git a/utils/src/main/java/org/zstack/utils/DomainUtils.java b/utils/src/main/java/org/zstack/utils/DomainUtils.java index 85919fdd401..c68b933dfd0 100644 --- a/utils/src/main/java/org/zstack/utils/DomainUtils.java +++ b/utils/src/main/java/org/zstack/utils/DomainUtils.java @@ -16,7 +16,8 @@ public static String getDomain(String url) { } public static Boolean curl(String url) { - ShellResult rst = ShellUtils.runAndReturn(String.format("curl %s", url), true); + String command = String.format("curl -sk --head --connect-timeout 5 %s", url); + ShellResult rst = ShellUtils.runAndReturn(command, true); return rst.getRetCode() == 0; } diff --git a/utils/src/main/java/org/zstack/utils/HTTP.java b/utils/src/main/java/org/zstack/utils/HTTP.java index cff6ddc142f..327ac3030d9 100755 --- a/utils/src/main/java/org/zstack/utils/HTTP.java +++ b/utils/src/main/java/org/zstack/utils/HTTP.java @@ -5,6 +5,7 @@ import org.zstack.utils.gson.JSONObjectUtil; import org.zstack.utils.logging.CLogger; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -130,6 +131,8 @@ public static class Builder { private boolean build; + private MultipartBody.Builder multipartBody; + public Param getParam() { return param; } @@ -196,6 +199,32 @@ public Builder logging() { return this; } + public Builder formData(Map formFields) { + if (formFields == null) { + throw new IllegalArgumentException("formFields cannot be null"); + } + + if (param.body != null) { + throw new IllegalStateException("Cannot set both body and form data"); + } + + multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM); + formFields.forEach((k, v) -> { + if (k == null || v == null) { + return; // skip null entries + } + + if (v instanceof File) { + File file = (File) v; + RequestBody fileBody = RequestBody.create(file, MediaType.parse("application/octet-stream")); + multipartBody.addFormDataPart(k, file.getName(), fileBody); + } else { + multipartBody.addFormDataPart(k, v.toString()); + } + }); + return this; + } + public Response callWithException() throws IOException { build(); @@ -254,15 +283,23 @@ private void build() { } if ("POST".equals(param.method)) { - DebugUtils.Assert(param.body != null, "POST requires body"); - rb.post(RequestBody.create(MediaType.parse(contentType), param.body)); + if (multipartBody != null) { + rb.post(multipartBody.build()); + } else { + DebugUtils.Assert(param.body != null, "POST requires body"); + rb.post(RequestBody.create(param.body, MediaType.parse(contentType))); + } } else if ("GET".equals(param.method)) { rb.get(); } else if ("DELETE".equals(param.method)) { rb.delete(); } else if ("PUT".equals(param.method)) { - DebugUtils.Assert(param.body != null, "PUT requires body"); - rb.put(RequestBody.create(MediaType.parse(contentType), param.body)); + if (multipartBody != null) { + rb.put(multipartBody.build()); + } else { + DebugUtils.Assert(param.body != null, "PUT requires body"); + rb.put(RequestBody.create(param.body, MediaType.parse(contentType))); + } } else if ("HEAD".equals(param.method)) { rb.head(); } else { diff --git a/utils/src/main/java/org/zstack/utils/RangeSet.java b/utils/src/main/java/org/zstack/utils/RangeSet.java index a5807cdedd9..9f2c8378cf6 100755 --- a/utils/src/main/java/org/zstack/utils/RangeSet.java +++ b/utils/src/main/java/org/zstack/utils/RangeSet.java @@ -1,5 +1,7 @@ package org.zstack.utils; +import org.apache.logging.log4j.util.Strings; + import java.util.*; import java.util.stream.Collectors; @@ -69,6 +71,23 @@ public boolean is(long s, long e) { public String toString() { return String.format("[%s, %s]", start, end); } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + Range range = (Range) obj; + return start == range.start && end == range.end; + } + + @Override + public int hashCode() { + return Objects.hash(start, end); + } } private List ranges = new ArrayList(); @@ -120,13 +139,14 @@ public List merge() { } } ret.add(r); + ranges = ret; return ret; } public List mergeAndSort() { - List ret = merge(); + merge(); sort(); - return ret; + return ranges; } public void sort(){ @@ -178,6 +198,32 @@ public static RangeSet valueOf(Collection numbers) { return results; } + public static RangeSet valueOf(String str) { + RangeSet results = new RangeSet(); + if (str == null || str.isEmpty()) { + return results; + } + + for (String s : str.split(",")) { + if (Strings.isBlank(s)) { + continue; + } + String[] range = s.split("-"); + try { + if (range.length == 1) { + long value = Long.parseLong(range[0].trim()); + results.closed(value, value); + } else if (range.length == 2) { + String start = range[0].trim(); + String end = range[1].trim(); + results.closed(Long.parseLong(start), Long.parseLong(end)); + } + } catch (NumberFormatException ignore) {} + } + + return results; + } + public Set values(){ Set result = new HashSet<>(); for (Range range : ranges) { diff --git a/utils/src/main/java/org/zstack/utils/SizeUtils.java b/utils/src/main/java/org/zstack/utils/SizeUtils.java index d2c06577fb2..c160102cd37 100755 --- a/utils/src/main/java/org/zstack/utils/SizeUtils.java +++ b/utils/src/main/java/org/zstack/utils/SizeUtils.java @@ -53,7 +53,7 @@ public static boolean isPositive(Number i){ */ public static boolean isSizeString2(String str) { final UnitNumber numeric = NumberUtils.ofUnitNumber(str); - return numeric == null ? false : isSize2(numeric); + return numeric != null && isSize2(numeric); } /** @@ -79,7 +79,7 @@ public static boolean isSizeString2(String str) { */ public static boolean isSizeString(String str) { final UnitNumber numeric = NumberUtils.ofUnitNumber(str); - return numeric == null ? false : isSize(numeric); + return numeric != null && isSize(numeric); } public static boolean isSize2(UnitNumber numeric) { @@ -98,11 +98,35 @@ public static boolean isSize(UnitNumber numeric, Collection matchedUnits return matchedUnits.contains(numeric.units); } + public static double sizeStringToBytes2(String str) { + final UnitNumber numeric = NumberUtils.ofUnitNumberOrThrow2(str); + String suffix = numeric.units; + double size = numeric.doubleFormatNumber; + if (suffix.isEmpty()) { + return size; + } + + switch (suffix) { + case T_SUFFIX: case t_SUFFIX: case TB_SUFFIX: case TIB_SUFFIX: + return SizeUnit.TERABYTE.toByte(size); + case G_SUFFIX: case g_SUFFIX: case GB_SUFFIX: case GIB_SUFFIX: + return SizeUnit.GIGABYTE.toByte(size); + case M_SUFFIX: case m_SUFFIX: case MB_SUFFIX: case MIB_SUFFIX: + return SizeUnit.MEGABYTE.toByte(size); + case K_SUFFIX: case k_SUFFIX: case KB_SUFFIX: case KIB_SUFFIX: + return SizeUnit.KILOBYTE.toByte(size); + case B_SUFFIX: case b_SUFFIX: + return SizeUnit.BYTE.toByte(size); + } + + throw new RuntimeException(String.format("should not be here, input size string: %s, parsed size: %s, parsed unit: %s", str, size, suffix)); + } + public static long sizeStringToBytes(String str) { final UnitNumber numeric = NumberUtils.ofUnitNumberOrThrow(str); String suffix = numeric.units; long size = numeric.number; - if (suffix.length() == 0) { + if (suffix.isEmpty()) { return size; } diff --git a/utils/src/main/java/org/zstack/utils/TimeUtils.java b/utils/src/main/java/org/zstack/utils/TimeUtils.java index 0440c54c6e0..0f2ee1e7b15 100755 --- a/utils/src/main/java/org/zstack/utils/TimeUtils.java +++ b/utils/src/main/java/org/zstack/utils/TimeUtils.java @@ -13,6 +13,7 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Calendar; +import java.util.Date; import java.util.TimeZone; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; @@ -111,6 +112,11 @@ public static long parseTimeToMillis(String time){ } private static final String DEFAULT_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static final String SHORT_TIME_FORMAT = "yyMMdd"; + + public static String getShortDateFormat() { + return new SimpleDateFormat(SHORT_TIME_FORMAT).format(Date.from(Instant.now())); + } public static boolean isValidTimestampFormat(String timestamp) { try { diff --git a/utils/src/main/java/org/zstack/utils/YamlUtils.java b/utils/src/main/java/org/zstack/utils/YamlUtils.java index 3c9b1c0667f..c955402be39 100644 --- a/utils/src/main/java/org/zstack/utils/YamlUtils.java +++ b/utils/src/main/java/org/zstack/utils/YamlUtils.java @@ -2,6 +2,8 @@ import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.nodes.Tag; + /** * @Author: qiuyu.zhang * @Date: 2024/4/8 14:17 @@ -16,8 +18,22 @@ public static String dump(Object obj) { return yaml.dump(obj); } + public static String dumpAs(Object obj, Tag tag) { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN); + Yaml yaml = new Yaml(options); + return yaml.dumpAs(obj, tag, null); + } + public static Object load(String str) { Yaml yaml = new Yaml(); return yaml.load(str); } + + public static T load(String str, Class clazz) { + Yaml yaml = new Yaml(); + return yaml.loadAs(str, clazz); + } + } diff --git a/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java b/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java new file mode 100644 index 00000000000..7851873e666 --- /dev/null +++ b/utils/src/main/java/org/zstack/utils/ak/AccessKeyUtils.java @@ -0,0 +1,64 @@ +package org.zstack.utils.ak; + +import javax.crypto.Cipher; +import javax.crypto.Mac; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.Locale; + +public class AccessKeyUtils { + + public static String generateDate() { + ZonedDateTime now = ZonedDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH); + return now.format(formatter); + } + + public static String generateAuthorization(String accessKeyId, String accessKeySecret, String method, String date, String uriString) throws Exception { + int questionMarkIndex = uriString.indexOf('?'); + String path = (questionMarkIndex != -1) ? uriString.substring(0, questionMarkIndex) : uriString; + + String stringToSign = method + "\n" + date + "\n" + path; + + SecretKeySpec signingKey = new SecretKeySpec(accessKeySecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(signingKey); + + byte[] rawHmac = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); + String signature = Base64.getEncoder().encodeToString(rawHmac); + + return "ZStack " + accessKeyId + ":" + signature; + } + + public static String encryptPassword(String password, String sk) throws Exception { + String md5KeyIv = md5Hash(sk); + byte[] key = md5KeyIv.getBytes(StandardCharsets.UTF_8); + byte[] iv = md5KeyIv.substring(0, 16).getBytes(StandardCharsets.UTF_8); + + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); + + byte[] encryptedBytes = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(encryptedBytes); + } + + private static String md5Hash(String text) throws Exception { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] hashBytes = md.digest(text.getBytes(StandardCharsets.UTF_8)); + + StringBuilder sb = new StringBuilder(); + for (byte b : hashBytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } +} + diff --git a/utils/src/main/java/org/zstack/utils/data/NumberUtils.java b/utils/src/main/java/org/zstack/utils/data/NumberUtils.java index 380fd623153..a730517182e 100644 --- a/utils/src/main/java/org/zstack/utils/data/NumberUtils.java +++ b/utils/src/main/java/org/zstack/utils/data/NumberUtils.java @@ -21,4 +21,14 @@ public static boolean isPositive(Number i){ public static UnitNumber ofUnitNumberOrThrow(String text) throws NumberFormatException { return UnitNumber.valueOf(text); } + + /** + * support float type size string like: 12.39 GiB + * @param text size string + * @return UnitNumber instance + * @throws NumberFormatException + */ + public static UnitNumber ofUnitNumberOrThrow2(String text) throws NumberFormatException { + return UnitNumber.valueOfWithFloatResultOrNull(text); + } } diff --git a/utils/src/main/java/org/zstack/utils/data/UnitNumber.java b/utils/src/main/java/org/zstack/utils/data/UnitNumber.java index 124345fb598..ed528313c5a 100644 --- a/utils/src/main/java/org/zstack/utils/data/UnitNumber.java +++ b/utils/src/main/java/org/zstack/utils/data/UnitNumber.java @@ -9,10 +9,18 @@ */ public class UnitNumber { public final long number; + public final Double doubleFormatNumber; public final String units; public UnitNumber(long number, String units) { this.number = number; + this.doubleFormatNumber = null; + this.units = units; + } + + public UnitNumber(double doubleFormatNumber, String units) { + this.number = 0L; + this.doubleFormatNumber = doubleFormatNumber; this.units = units; } @@ -27,11 +35,19 @@ public static UnitNumber valueOf(String text) throws NumberFormatException { return numeric; } + public static UnitNumber valueOfWithFloatResultOrNull(String text) { + return valueOfOrNull(text, true); + } + /** * @param text example: 50G / -60TB ... */ public static UnitNumber valueOfOrNull(String text) { - if (text.length() == 0) { + return valueOfOrNull(text, false); + } + + public static UnitNumber valueOfOrNull(String text, boolean withFloat) { + if (text.isEmpty()) { return null; } @@ -43,7 +59,7 @@ public static UnitNumber valueOfOrNull(String text) { for (; i < chars.length; i++) { char ch = chars[i]; - if (!Character.isDigit(ch)) { + if (!Character.isDigit(ch) && ch != '.') { break; } } @@ -51,7 +67,12 @@ public static UnitNumber valueOfOrNull(String text) { if (i == 0 || chars[0] == '-' && i == 1) { return null; } - return new UnitNumber(Long.parseLong(text.substring(0, i)), text.substring(i).trim()); + + if (withFloat) { + return new UnitNumber(Double.parseDouble(text.substring(0, i)), text.substring(i).trim()); + } else { + return new UnitNumber(Long.parseLong(text.substring(0, i)), text.substring(i).trim()); + } } public UnitNumber setNumber(long number) { diff --git a/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java b/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java index fffd3fdc29f..a6451ce35e4 100755 --- a/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java +++ b/utils/src/main/java/org/zstack/utils/gson/JSONObjectUtil.java @@ -57,6 +57,10 @@ public static T toObject(String content, Class clazz){ return gson.fromJson(content, clazz); } + public static T toObject(JsonElement content, Class clazz) { + return gson.fromJson(content, clazz); + } + // Only supports converting content to List, for example: new TypeToken>() {}.getType() public static List toList(String content, Type type){ return gson.fromJson(content, type); diff --git a/utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java b/utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java new file mode 100644 index 00000000000..a1b57849ae8 --- /dev/null +++ b/utils/src/main/java/org/zstack/utils/linux/ServiceUtils.java @@ -0,0 +1,103 @@ +package org.zstack.utils.linux; + +import org.zstack.utils.Bash; +import org.zstack.utils.logging.CLogger; +import org.zstack.utils.logging.CLoggerImpl; + +import java.util.List; + +public class ServiceUtils { + private static final CLogger logger = CLoggerImpl.getLogger(ServiceUtils.class); + + /** + * 创建并安装Linux系统服务 + * + * @param serviceName 服务名称 + * @param description 服务描述 + * @param documentation 文档URL + * @param dependencies 依赖的其他服务 + * @param execStart 执行命令 + */ + public static void installService(String serviceName, String description, + String documentation, List dependencies, + String execStart) { + try { + StringBuilder serviceContent = new StringBuilder("[Unit]\n"); + serviceContent.append("Description=").append(description).append("\n"); + + if (documentation != null && !documentation.isEmpty()) { + serviceContent.append("Documentation=").append(documentation).append("\n"); + } + + if (dependencies != null && !dependencies.isEmpty()) { + serviceContent.append("After=").append(String.join(" ", dependencies)).append("\n"); + } + + serviceContent.append("\n[Service]\n"); + serviceContent.append("Type=forking\n"); + serviceContent.append("ExecStart=").append(execStart).append("\n"); + + serviceContent.append("\n[Install]\n"); + serviceContent.append("WantedBy=multi-user.target"); + + String tmpServicePath = "/tmp/" + serviceName + ".service"; + String servicePath = "/etc/systemd/system/" + serviceName + ".service"; + + new Bash() { + @Override + protected void scripts() { + run("echo '%s' > %s; sudo cp %s %s", serviceContent, tmpServicePath, tmpServicePath, servicePath); + run("sudo systemctl enable %s; sudo systemctl daemon-reload", serviceName); + } + }.execute(); + + } catch (Exception e) { + logger.debug("Failed to install service: " + e.getMessage(), e); + } + } + + /** + * 启动服务 + */ + public static void startService(String serviceName) { + new Bash() { + @Override + protected void scripts() { + setE(); + + run("sudo systemctl start %s", serviceName); + } + }.execute(); + } + + /** + * 停止服务 + */ + public static void stopService(String serviceName) { + new Bash() { + @Override + protected void scripts() { + setE(); + + run("sudo systemctl stop %s", serviceName); + } + }.execute(); + } + + /** + * 卸载服务 + */ + public static void uninstallService(String serviceName, String scriptPath) { + new Bash() { + @Override + protected void scripts() { + setE(); + + run("sudo systemctl disable %s" , serviceName); + run("sudo rm /etc/systemd/system/%s.service", serviceName); + run("sudo rm %s" + scriptPath, scriptPath); + run("sudo systemctl daemon-reload"); + } + }.execute(); + } +} diff --git a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java index b8b7998ea17..50bbe6f195b 100644 --- a/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/IPv6NetworkUtils.java @@ -9,6 +9,7 @@ import java.math.BigInteger; import java.util.Arrays; +import java.util.List; public class IPv6NetworkUtils { private final static CLogger logger = Utils.getLogger(IPv6NetworkUtils.class); @@ -18,6 +19,9 @@ public class IPv6NetworkUtils { // MAC 地址正则表达式 private static String macRegex = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"; + private static String IP_VERSION_4 = "ipv4"; + private static String IP_VERSION_6 = "ipv6"; + private static boolean isConsecutiveRange(BigInteger[] allocatedIps) { BigInteger first = allocatedIps[0]; BigInteger last = allocatedIps[allocatedIps.length - 1]; @@ -278,7 +282,7 @@ public static String getFormalCidrOfNetworkCidr(String cidr) { private static final String[] IP6MASK = new String[] { "8000", "c000", "e000", "f000", - "f800", "fc00", "fe00", "ff800", + "f800", "fc00", "fe00", "ff00", "ff80", "ffc0", "ffe0", "fff0", "fff8", "fffc", "fffe", "ffff" }; @@ -471,4 +475,29 @@ public static int getPrefixLengthFromNetmask(String mask) { return 0; } + + public static String getIpVersion(String ip) { + if (isValidIpv4(ip)) { + return IP_VERSION_4; + } else if (isValidIpv6(ip)) { + return IP_VERSION_6; + } + throw new IllegalArgumentException("Invalid IP address: " + ip); + } + + public static String getIpByIpVersion(String ipVersion, List ipList) { + if (ipList == null || ipList.isEmpty()) { + throw new IllegalArgumentException("The provided IP list cannot be null or empty."); + } + for (String ip : ipList) { + if (getIpVersion(ip).equals(ipVersion)) { + return ip; + } + } + throw new IllegalArgumentException("No IP address in the list matches the provided IP version: " + ipVersion); + } + + public static boolean isFullCidr(String cidr) { + return cidr.equals("::/0"); + } } diff --git a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java index 50986c603e8..8ebb2f754d8 100755 --- a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java @@ -387,30 +387,6 @@ public static String getIpAddressByName(String hostName) throws UnknownHostExcep return ia.getHostAddress(); } - public static String generateMacWithDeviceId(short deviceId) { - int seed = random.nextInt(); - String seedStr = Integer.toHexString(seed); - if (seedStr.length() < 8) { - String compensate = StringUtils.repeat("0", 8 - seedStr.length()); - seedStr = compensate + seedStr; - } - String octet2 = seedStr.substring(0, 2); - String octet3 = seedStr.substring(2, 4); - String octet4 = seedStr.substring(4, 6); - String octet5 = seedStr.substring(6, 8); - StringBuilder sb = new StringBuilder("fa").append(":"); - sb.append(octet2).append(":"); - sb.append(octet3).append(":"); - sb.append(octet4).append(":"); - sb.append(octet5).append(":"); - String deviceIdStr = Integer.toHexString(deviceId); - if (deviceIdStr.length() < 2) { - deviceIdStr = "0" + deviceIdStr; - } - sb.append(deviceIdStr); - return sb.toString(); - } - public static List> findConsecutiveIpRange(Collection ips) { List> ret = new ArrayList>(); if (ips.isEmpty()) { diff --git a/utils/src/main/java/org/zstack/utils/path/PathUtil.java b/utils/src/main/java/org/zstack/utils/path/PathUtil.java index 29028402218..fcabfffd20b 100755 --- a/utils/src/main/java/org/zstack/utils/path/PathUtil.java +++ b/utils/src/main/java/org/zstack/utils/path/PathUtil.java @@ -3,10 +3,12 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.io.*; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; @@ -447,4 +449,20 @@ public static FileTime getFileLastModifiedTime(String filePath) { throw new RuntimeException(e); } } + + public static String normalizePathWithoutQuery(String path) { + try { + String normalizedPath = path.replaceFirst( + "^([a-zA-Z]+:)(?!/{2})", + "$1//"); + final String query = new URI(normalizedPath).getQuery(); + if (query != null) { + return StringUtils.removeEnd(path, '?' + query); + } + } catch (URISyntaxException ignored) { + logger.warn(String.format("unexpected path: %s", path)); + } + + return path; + } } \ No newline at end of file diff --git a/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java b/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java index 1e45ed081bd..f48df1e370c 100644 --- a/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java +++ b/utils/src/main/java/org/zstack/utils/string/ErrorCodeElaboration.java @@ -1,5 +1,7 @@ package org.zstack.utils.string; +import java.util.Locale; + /** * Created by mingjian.deng on 2018/11/28. */ @@ -17,19 +19,31 @@ public class ErrorCodeElaboration { public ErrorCodeElaboration() { } - public ErrorCodeElaboration(ErrorCodeElaboration other, Object...args) { + public ErrorCodeElaboration(ErrorCodeElaboration other, Locale locale, Object...args) { if (args != null) { this.message_en = String.format(other.message_en, args); - this.message_cn = String.format(other.message_cn, args); + this.message_cn = Locale.SIMPLIFIED_CHINESE.equals(locale) ? String.format(other.message_cn, args) : null; } else { this.message_en = other.message_en; - this.message_cn = other.message_cn; + this.message_cn = Locale.SIMPLIFIED_CHINESE.equals(locale) ? other.message_cn : null; } this.distance = other.distance; this.method = other.method; this.code = other.code; } + public ErrorCodeElaboration(ErrorCodeElaboration other, Locale locale) { + category = other.category; + code = other.code; + regex = other.regex; + message_en = other.message_en; + message_cn = Locale.SIMPLIFIED_CHINESE.equals(locale) ? other.message_cn : null; + source = other.source; + distance = other.distance; + formatSrcError = other.formatSrcError; + method = other.method; + } + public ErrorCodeElaboration(ErrorCodeElaboration other) { category = other.category; code = other.code;