warnings) {
+ this.warnings = warnings;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/RepairMetadataMsg.java b/header/src/main/java/org/zstack/header/vm/RepairMetadataMsg.java
new file mode 100644
index 00000000000..212aa76c088
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/RepairMetadataMsg.java
@@ -0,0 +1,52 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.NeedReplyMessage;
+
+/**
+ * 修复 sblk 元数据 Header 的内部消息。
+ *
+ * 由管理平面发送给主存储 handler,用于完成未完成的 Phase 3、
+ * 清除 PendingOp、重建 Header 或触发全量刷写。
+ *
+ * 路由:{@code makeLocalServiceId} → 主存储 handler → Agent HTTP 调用
+ *
+ * @see BatchCheckMetadataStatusMsg
+ */
+public class RepairMetadataMsg extends NeedReplyMessage {
+
+ private String vmUuid;
+
+ private String primaryStorageUuid;
+
+ /**
+ * 修复动作。
+ *
+ * 可选值:{@code complete_phase3} / {@code clear_pending_op} /
+ * {@code rebuild_header} / {@code full_refresh}
+ */
+ private String repairAction;
+
+ public String getVmUuid() {
+ return vmUuid;
+ }
+
+ public void setVmUuid(String vmUuid) {
+ this.vmUuid = vmUuid;
+ }
+
+ public String getPrimaryStorageUuid() {
+ return primaryStorageUuid;
+ }
+
+ public void setPrimaryStorageUuid(String primaryStorageUuid) {
+ this.primaryStorageUuid = primaryStorageUuid;
+ }
+
+ public String getRepairAction() {
+ return repairAction;
+ }
+
+ public void setRepairAction(String repairAction) {
+ this.repairAction = repairAction;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/RepairMetadataReply.java b/header/src/main/java/org/zstack/header/vm/RepairMetadataReply.java
new file mode 100644
index 00000000000..16445a19fe6
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/RepairMetadataReply.java
@@ -0,0 +1,11 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.MessageReply;
+
+/**
+ * {@link RepairMetadataMsg} 的回复。
+ *
+ * 成功/失败通过 {@link MessageReply} 基类的 ErrorCode 传递。
+ */
+public class RepairMetadataReply extends MessageReply {
+}
diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataMsg.java b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataMsg.java
new file mode 100644
index 00000000000..e918ad6b075
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataMsg.java
@@ -0,0 +1,43 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.NeedReplyMessage;
+
+/**
+ * 更新虚拟机元数据消息(MN 内部)。
+ *
+ * 调用链第 1 步:由 API 完成后的拦截器发出,路由到 VM 所在的 MN 节点。
+ * 接收方从 DB 构建 {@link VmInstanceMetadataDTO},编码后发送
+ * {@link UpdateVmInstanceMetadataOnPrimaryStorageMsg}。
+ *
+ * @see UpdateVmInstanceMetadataOnPrimaryStorageMsg
+ * @see UpdateVmInstanceMetadataOnHypervisorMsg
+ */
+public class UpdateVmInstanceMetadataMsg extends NeedReplyMessage implements VmInstanceMessage {
+
+ private String vmInstanceUuid;
+
+ /**
+ * 是否涉及存储结构变更。
+ *
+ * 对应 {@link MetadataImpact.Impact#STORAGE} 类型的操作。
+ * sblk 场景下会设置 pending_op=2。
+ */
+ private boolean storageStructureChange;
+
+ @Override
+ public String getVmInstanceUuid() {
+ return vmInstanceUuid;
+ }
+
+ public void setVmInstanceUuid(String vmInstanceUuid) {
+ this.vmInstanceUuid = vmInstanceUuid;
+ }
+
+ public boolean isStorageStructureChange() {
+ return storageStructureChange;
+ }
+
+ public void setStorageStructureChange(boolean storageStructureChange) {
+ this.storageStructureChange = storageStructureChange;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnHypervisorMsg.java
new file mode 100644
index 00000000000..61e0ebde900
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnHypervisorMsg.java
@@ -0,0 +1,86 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.host.HostMessage;
+import org.zstack.header.message.NeedReplyMessage;
+
+/**
+ * 在 Hypervisor 上更新虚拟机元数据消息。
+ *
+ * 调用链第 3 步(可选):发送到 Host Agent 执行实际的存储写入。
+ *
+ * 使用场景
+ *
+ * - sblk:需要通过 Host Agent 操作 LV(activate → write → deactivate)
+ * - local:数据在本地磁盘,需要通过 Host Agent 写入
+ * - NFS:通常通过 PS Agent 直接操作,不使用此消息
+ *
+ *
+ * @see UpdateVmInstanceMetadataMsg
+ * @see UpdateVmInstanceMetadataOnPrimaryStorageMsg
+ */
+public class UpdateVmInstanceMetadataOnHypervisorMsg extends NeedReplyMessage implements HostMessage {
+
+ private String hostUuid;
+ private String vmInstanceUuid;
+
+ /**
+ * 元数据文件在存储上的路径。
+ *
+ *
+ * - sblk:LV 设备路径,如 /dev/{vg_uuid}/{vm_uuid}_vmmeta
+ * - local:本地文件路径,如 /path/to/vm/vm_metadata.json
+ *
+ */
+ private String metadataPath;
+
+ /**
+ * 元数据 JSON 字符串。
+ */
+ private String metadata;
+
+ /**
+ * 是否涉及存储结构变更(sblk 场景设置 pending_op=2)。
+ */
+ private boolean storageStructureChange;
+
+ @Override
+ public String getHostUuid() {
+ return hostUuid;
+ }
+
+ public void setHostUuid(String hostUuid) {
+ this.hostUuid = hostUuid;
+ }
+
+ public String getVmInstanceUuid() {
+ return vmInstanceUuid;
+ }
+
+ public void setVmInstanceUuid(String vmInstanceUuid) {
+ this.vmInstanceUuid = vmInstanceUuid;
+ }
+
+ public String getMetadataPath() {
+ return metadataPath;
+ }
+
+ public void setMetadataPath(String metadataPath) {
+ this.metadataPath = metadataPath;
+ }
+
+ public String getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(String metadata) {
+ this.metadata = metadata;
+ }
+
+ public boolean isStorageStructureChange() {
+ return storageStructureChange;
+ }
+
+ public void setStorageStructureChange(boolean storageStructureChange) {
+ this.storageStructureChange = storageStructureChange;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnHypervisorReply.java b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnHypervisorReply.java
new file mode 100644
index 00000000000..036403b01b2
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnHypervisorReply.java
@@ -0,0 +1,9 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.MessageReply;
+
+/**
+ * {@link UpdateVmInstanceMetadataOnHypervisorMsg} 的回复。
+ */
+public class UpdateVmInstanceMetadataOnHypervisorReply extends MessageReply {
+}
diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnPrimaryStorageMsg.java
new file mode 100644
index 00000000000..41ba6d9b254
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnPrimaryStorageMsg.java
@@ -0,0 +1,84 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.NeedReplyMessage;
+import org.zstack.header.storage.primary.PrimaryStorageMessage;
+
+/**
+ * 在主存储上更新虚拟机元数据消息。
+ *
+ * 调用链第 2 步:发送到主存储服务,由主存储根据自身类型决定写入方式:
+ *
+ * - sblk/local:进一步发送 {@link UpdateVmInstanceMetadataOnHypervisorMsg} 到 Host Agent
+ * - NFS:直接通过 PS Agent 写入
+ *
+ *
+ * @see UpdateVmInstanceMetadataMsg
+ * @see UpdateVmInstanceMetadataOnHypervisorMsg
+ */
+public class UpdateVmInstanceMetadataOnPrimaryStorageMsg extends NeedReplyMessage implements PrimaryStorageMessage {
+
+ private String primaryStorageUuid;
+ private String vmInstanceUuid;
+
+ /**
+ * 根盘 UUID,用于 PS handler 定位元数据写入路径。
+ *
+ * LocalStorage 通过根盘 installPath 推导元数据文件路径;
+ * NFS 通过根盘关联的 Host 确定转发目标。
+ */
+ private String rootVolumeUuid;
+
+ /**
+ * 元数据 JSON 字符串。
+ *
+ * 由 {@code VmInstanceBase.buildVmInstanceMetadata()} 从 DB 全量构建,
+ * 为 {@link VmInstanceMetadataDTO} 的 JSON 序列化结果。
+ */
+ private String metadata;
+
+ /**
+ * 是否涉及存储结构变更(sblk 场景设置 pending_op=2)。
+ */
+ private boolean storageStructureChange;
+
+ @Override
+ public String getPrimaryStorageUuid() {
+ return primaryStorageUuid;
+ }
+
+ public void setPrimaryStorageUuid(String primaryStorageUuid) {
+ this.primaryStorageUuid = primaryStorageUuid;
+ }
+
+ public String getVmInstanceUuid() {
+ return vmInstanceUuid;
+ }
+
+ public void setVmInstanceUuid(String vmInstanceUuid) {
+ this.vmInstanceUuid = vmInstanceUuid;
+ }
+
+ public String getRootVolumeUuid() {
+ return rootVolumeUuid;
+ }
+
+ public void setRootVolumeUuid(String rootVolumeUuid) {
+ this.rootVolumeUuid = rootVolumeUuid;
+ }
+
+ public String getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(String metadata) {
+ this.metadata = metadata;
+ }
+
+ public boolean isStorageStructureChange() {
+ return storageStructureChange;
+ }
+
+ public void setStorageStructureChange(boolean storageStructureChange) {
+ this.storageStructureChange = storageStructureChange;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnPrimaryStorageReply.java b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnPrimaryStorageReply.java
new file mode 100644
index 00000000000..475855f2b67
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataOnPrimaryStorageReply.java
@@ -0,0 +1,9 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.MessageReply;
+
+/**
+ * {@link UpdateVmInstanceMetadataOnPrimaryStorageMsg} 的回复。
+ */
+public class UpdateVmInstanceMetadataOnPrimaryStorageReply extends MessageReply {
+}
diff --git a/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataReply.java b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataReply.java
new file mode 100644
index 00000000000..61a2d4dbd1b
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/UpdateVmInstanceMetadataReply.java
@@ -0,0 +1,9 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.MessageReply;
+
+/**
+ * {@link UpdateVmInstanceMetadataMsg} 的回复。
+ */
+public class UpdateVmInstanceMetadataReply extends MessageReply {
+}
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 9d0efdd77f1..a2716386957 100755
--- a/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java
@@ -96,4 +96,6 @@ enum Capability {
String VM_CDROM_OCCUPANT_ISO = "ISO";
String VM_CDROM_OCCUPANT_GUEST_TOOLS = "GuestTools";
+
+ String VM_META_SUFFIX = "_meta";
}
diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataCodec.java b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataCodec.java
new file mode 100644
index 00000000000..2153f9247cb
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataCodec.java
@@ -0,0 +1,96 @@
+package org.zstack.header.vm;
+
+import org.zstack.utils.gson.JSONObjectUtil;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ * 虚拟机元数据编解码器。
+ *
+ * 负责 {@link VmInstanceMetadataDTO} 与存储介质之间的编解码:
+ *
+ * 序列化流程:DTO → JSON String → Base64 String → byte[](写入存储)
+ * 反序列化流程:byte[](读取存储) → Base64 String → JSON String → DTO
+ *
+ *
+ * 单层 Base64 编码策略:DTO 内部所有字段为明文 JSON,
+ * 仅在写入存储时做一次 Base64 编码。
+ */
+public class VmInstanceMetadataCodec {
+
+ private VmInstanceMetadataCodec() {
+ }
+
+ /**
+ * 将 DTO 编码为可写入存储的字节数组。
+ *
+ * @param dto 元数据 DTO
+ * @return Base64 编码后的字节数组
+ */
+ public static byte[] encode(VmInstanceMetadataDTO dto) {
+ String json = JSONObjectUtil.toJsonString(dto);
+ return Base64.getEncoder().encode(json.getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * 将 DTO 编码为 Base64 字符串。
+ *
+ * @param dto 元数据 DTO
+ * @return Base64 编码后的字符串
+ */
+ public static String encodeToString(VmInstanceMetadataDTO dto) {
+ String json = JSONObjectUtil.toJsonString(dto);
+ return Base64.getEncoder().encodeToString(json.getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * 从存储读取的字节数组解码为 DTO。
+ *
+ * @param data Base64 编码的字节数组
+ * @return 元数据 DTO
+ * @throws IllegalArgumentException 如果 Base64 解码失败或 JSON 格式错误
+ */
+ public static VmInstanceMetadataDTO decode(byte[] data) {
+ byte[] jsonBytes = Base64.getDecoder().decode(data);
+ String json = new String(jsonBytes, StandardCharsets.UTF_8);
+ return JSONObjectUtil.toObject(json, VmInstanceMetadataDTO.class);
+ }
+
+ /**
+ * 从 Base64 字符串解码为 DTO。
+ *
+ * @param base64 Base64 编码的字符串
+ * @return 元数据 DTO
+ * @throws IllegalArgumentException 如果 Base64 解码失败或 JSON 格式错误
+ */
+ public static VmInstanceMetadataDTO decodeFromString(String base64) {
+ byte[] jsonBytes = Base64.getDecoder().decode(base64);
+ String json = new String(jsonBytes, StandardCharsets.UTF_8);
+ return JSONObjectUtil.toObject(json, VmInstanceMetadataDTO.class);
+ }
+
+ /**
+ * 将 DTO 序列化为 JSON 字符串(不做 Base64 编码)。
+ *
+ * 用于调试、日志、一致性检查等场景。
+ *
+ * @param dto 元数据 DTO
+ * @return JSON 字符串
+ */
+ public static String toJson(VmInstanceMetadataDTO dto) {
+ return JSONObjectUtil.toJsonString(dto);
+ }
+
+ /**
+ * 从 JSON 字符串反序列化为 DTO(不做 Base64 解码)。
+ *
+ * 用于调试、测试等场景。
+ *
+ * @param json JSON 字符串
+ * @return 元数据 DTO
+ */
+ public static VmInstanceMetadataDTO fromJson(String json) {
+ return JSONObjectUtil.toObject(json, VmInstanceMetadataDTO.class);
+ }
+}
\ No newline at end of file
diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataConstants.java b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataConstants.java
new file mode 100644
index 00000000000..ec9b5a231ee
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataConstants.java
@@ -0,0 +1,82 @@
+package org.zstack.header.vm;
+
+/**
+ * 虚拟机元数据相关常量。
+ */
+public class VmInstanceMetadataConstants {
+
+ private VmInstanceMetadataConstants() {
+ }
+
+ /**
+ * 元数据 LV 后缀(sblk 场景)。
+ *
+ * LV 命名规则:{vm_uuid}_vmmeta
+ */
+ public static final String SBLK_LV_SUFFIX = "_vmmeta";
+
+ /**
+ * 元数据文件名(local/NFS 场景)。
+ *
+ * 文件位于与根盘同目录下。
+ */
+ public static final String METADATA_FILE_NAME = "vm_metadata.json";
+
+ /**
+ * sblk 元数据 LV 默认初始大小(字节):4MB。
+ */
+ public static final long SBLK_LV_INITIAL_SIZE = 4L * 1024 * 1024;
+
+ /**
+ * sblk 元数据 LV 最大大小(字节):64MB。
+ */
+ public static final long SBLK_LV_MAX_SIZE = 64L * 1024 * 1024;
+
+ /**
+ * sblk 写入序列号最大值。溢出后回绕到 1。
+ */
+ public static final long MAX_WRITE_SEQUENCE = 0xFFFFFFFFFFFFFFFFL;
+
+ /**
+ * 全局配置:是否启用虚拟机元数据记录。
+ *
+ * 默认关闭。开启后,API 操作成功时自动触发元数据更新。
+ */
+ public static final String GLOBAL_CONFIG_METADATA_ENABLED = "vm.metadata.enabled";
+
+ /**
+ * GC 初始延迟秒数。
+ *
+ * API 成功后延迟该秒数再触发元数据更新,
+ * 避免短时间内多次 API 操作产生过多无用更新。
+ */
+ public static final int INITIAL_GC_DELAY_SECONDS = 5;
+
+ /**
+ * 注册虚拟机 MN 标识 System Tag 前缀。
+ *
+ * 注册过程中在 VM 上打标记,记录执行注册的 MN UUID,
+ * 用于 MN 崩溃后的事务回滚判断。
+ */
+ public static final String REGISTERING_MN_TAG_PREFIX = "vmMetadata::registeringMnUuid::";
+
+ /**
+ * VM 状态:注册中。
+ *
+ * 注册开始时 VM 进入此中间状态,注册完成后转为 Stopped。
+ */
+ public static final String VM_STATE_REGISTERING = "Registering";
+
+ /**
+ * ChainTask 最大排队任务数。
+ *
+ * 同一 VM 的元数据更新 ChainTask 最多排队 1 个,
+ * 超出的通过 exceedMaxPendingCallback 立即 Done。
+ */
+ public static final int MAX_PENDING_METADATA_TASKS = 1;
+
+ /**
+ * ChainTask syncSignature 前缀。
+ */
+ public static final String CHAIN_TASK_SIGNATURE_PREFIX = "vm-metadata-update-";
+}
\ No newline at end of file
diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataDTO.java b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataDTO.java
new file mode 100644
index 00000000000..d0a3ee2db8f
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataDTO.java
@@ -0,0 +1,141 @@
+package org.zstack.header.vm;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+/**
+ * 虚拟机元数据 DTO。
+ *
+ * 存储在主存储上的元数据文件内容就是该 DTO 的 JSON 字符串经 Base64 编码后的结果。
+ *
+ * 编码策略
+ * DTO 内部所有字段均为明文 JSON。由存储写入层对整个 DTO 的 JSON 字符串做一次统一
+ * Base64 编码后写入存储介质(sblk Slot Payload / local NFS 文件内容)。
+ *
+ * Checksum
+ * Checksum 不作为 DTO 字段,由存储层保证:
+ *
+ * - sblk: Slot 结构自带 Checksum 字段
+ * - local/NFS: tmp + rename 原子写入保证完整性
+ *
+ */
+public class VmInstanceMetadataDTO {
+
+ /**
+ * 资源元数据子结构。
+ *
+ * 对于每种资源(VM、Volume、Nic),记录其 VO 全量 JSON 及关联的 SystemTag/ResourceConfig。
+ */
+ public static class ResourceMetadata {
+ /**
+ * 资源 UUID。
+ *
+ * 冗余字段,反序列化时必须校验与 {@link #vo} 内部的 uuid 字段一致。
+ */
+ @SerializedName("resourceUuid")
+ public String resourceUuid;
+
+ /**
+ * VO 全量 JSON 明文。
+ *
+ *
+ * - {@link VmInstanceMetadataDTO#vm} → VmInstanceVO JSON
+ * - {@link VmInstanceMetadataDTO#volumes} 元素 → VolumeVO JSON
+ * - {@link VmInstanceMetadataDTO#nics} 元素 → VmNicVO JSON
+ *
+ *
+ * 序列化时由 Gson 自动处理嵌套 JSON 的转义;反序列化时需要二次反序列化为具体 VO 类。
+ */
+ @SerializedName("vo")
+ public String vo;
+
+ /**
+ * SystemTag 列表的 Base64 编码。
+ *
+ * 构建过程:SystemTagVO 列表 → 逐个 JSON 序列化 → 组成 JSON Array 字符串 → Base64 编码。
+ * Base64 编码是为了保护可能包含的密码、密钥等敏感信息。
+ */
+ @SerializedName("systemTags")
+ public String systemTags;
+
+ /**
+ * ResourceConfig 列表的 Base64 编码。
+ *
+ * 构建过程与 systemTags 一致。
+ */
+ @SerializedName("resourceConfigs")
+ public String resourceConfigs;
+ }
+
+ /**
+ * 元数据 schema 版本,与 ZStack 数据库版本(zsv)一致,如 "5.0.0"。
+ *
+ * 序列化时自动填充当前平台版本。注册时若版本不匹配则拒绝注册。
+ * 升级后通过全量更新 GC 将所有 VM 的元数据刷新到新版本。
+ */
+ @SerializedName("schemaVersion")
+ public String schemaVersion;
+
+ /**
+ * 虚拟机分类。
+ *
+ * 标识本元数据所属 VM 的分类(普通 / 模板 / 模板缓存),
+ * 注册恢复时按不同分类执行不同的恢复逻辑。
+ */
+ @SerializedName("vmCategory")
+ public VmMetadataCategory vmCategory;
+
+ /**
+ * 虚拟机自身的元数据。
+ *
+ * {@link ResourceMetadata#vo} 为 VmInstanceVO 的 JSON。
+ */
+ @SerializedName("vm")
+ public ResourceMetadata vm;
+
+ /**
+ * 云盘元数据列表。
+ *
+ * 包含根盘与数据盘(挂载的 + 已卸载但 lastVmInstanceUuid 指向本 VM 的)。
+ * 不包含共享盘(isShareable=true 的 Volume 被排除)。
+ * {@link VolumeResourceMetadata#vo} 为 VolumeVO 的 JSON,
+ * 每个 Volume 的快照引用数据内嵌在 {@link VolumeResourceMetadata} 中。
+ */
+ @SerializedName("volumes")
+ public List volumes;
+
+ /**
+ * 网卡元数据列表。
+ *
+ * 仅记录,注册时不恢复。{@link ResourceMetadata#vo} 为 VmNicVO 的 JSON。
+ */
+ @SerializedName("nics")
+ public List nics;
+
+ /**
+ * 快照数据(扁平列表)。
+ *
+ * 所有 Volume 下的 VolumeSnapshotVO JSON 明文的扁平列表,
+ * 按 BFS 拓扑序排列(父快照在子快照之前)。
+ */
+ @SerializedName("snapshots")
+ public List snapshots;
+
+ /**
+ * 快照组列表。
+ *
+ * 每个元素是 VolumeSnapshotGroupVO 的 JSON 明文。
+ */
+ @SerializedName("snapshotGroups")
+ public List snapshotGroups;
+
+ /**
+ * 快照组关联引用列表。
+ *
+ * 每个元素是 VolumeSnapshotGroupRefVO 的 JSON 明文。
+ * 通过 {@code volumeSnapshotGroupUuid} 字段与 {@link #snapshotGroups} 关联。
+ */
+ @SerializedName("snapshotGroupRefs")
+ public List snapshotGroupRefs;
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataRegistrationSpec.java b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataRegistrationSpec.java
new file mode 100644
index 00000000000..a3ea3981759
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataRegistrationSpec.java
@@ -0,0 +1,92 @@
+package org.zstack.header.vm;
+
+/**
+ * 虚拟机元数据注册参数。
+ *
+ * 封装从元数据注册虚拟机时需要的新环境上下文信息。
+ *
+ * 字段处理矩阵中标记为"API 参数"或"替换"的字段,其新值来源于此对象。
+ */
+public class VmInstanceMetadataRegistrationSpec {
+
+ /**
+ * 注册目标 Zone UUID(必填)。
+ *
+ * 替换 VmInstanceVO.zoneUuid。
+ */
+ private String zoneUuid;
+
+ /**
+ * 注册目标主存储 UUID(必填)。
+ *
+ * 替换 VolumeVO.primaryStorageUuid、VolumeSnapshotVO.primaryStorageUuid。
+ */
+ private String primaryStorageUuid;
+
+ /**
+ * 注册操作的账户 UUID。
+ *
+ * 替换所有 VO 的 accountUuid 字段。通常为 admin。
+ */
+ private String accountUuid;
+
+ /**
+ * 旧存储路径标识符。
+ *
+ *
+ * - sblk 场景:旧 VG UUID
+ * - local/NFS 场景:旧路径前缀(如 /vms_ds)
+ *
+ */
+ private String oldPathIdentifier;
+
+ /**
+ * 新存储路径标识符。
+ *
+ *
+ * - sblk 场景:新 VG UUID
+ * - local/NFS 场景:新路径前缀(如 /vms_ds2)
+ *
+ */
+ private String newPathIdentifier;
+
+ public String getZoneUuid() {
+ return zoneUuid;
+ }
+
+ public void setZoneUuid(String zoneUuid) {
+ this.zoneUuid = zoneUuid;
+ }
+
+ public String getPrimaryStorageUuid() {
+ return primaryStorageUuid;
+ }
+
+ public void setPrimaryStorageUuid(String primaryStorageUuid) {
+ this.primaryStorageUuid = primaryStorageUuid;
+ }
+
+ public String getAccountUuid() {
+ return accountUuid;
+ }
+
+ public void setAccountUuid(String accountUuid) {
+ this.accountUuid = accountUuid;
+ }
+
+ public String getOldPathIdentifier() {
+ return oldPathIdentifier;
+ }
+
+ public void setOldPathIdentifier(String oldPathIdentifier) {
+ this.oldPathIdentifier = oldPathIdentifier;
+ }
+
+ public String getNewPathIdentifier() {
+ return newPathIdentifier;
+ }
+
+ public void setNewPathIdentifier(String newPathIdentifier) {
+ this.newPathIdentifier = newPathIdentifier;
+ }
+}
\ No newline at end of file
diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataValidator.java b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataValidator.java
new file mode 100644
index 00000000000..2a9722511ad
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceMetadataValidator.java
@@ -0,0 +1,143 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.exception.CloudRuntimeException;
+import org.zstack.utils.gson.JSONObjectUtil;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 虚拟机元数据校验器。
+ *
+ * 在反序列化后、注册前执行校验,确保元数据完整性和一致性。
+ *
+ * 校验项:
+ *
+ * - schemaVersion 与当前平台版本匹配
+ * - ResourceMetadata.resourceUuid 与 vo 内部 uuid 一致
+ * - snapshotGroupRefs 引用的 groupUuid 必须存在于 snapshotGroups 中
+ *
+ */
+public class VmInstanceMetadataValidator {
+
+ private VmInstanceMetadataValidator() {
+ }
+
+ /**
+ * 执行全量校验。
+ *
+ * @param dto 待校验的元数据 DTO
+ * @param currentVersion 当前平台 schema 版本
+ * @throws CloudRuntimeException 校验失败时抛出
+ */
+ public static void validate(VmInstanceMetadataDTO dto, String currentVersion) {
+ validateSchemaVersion(dto, currentVersion);
+ validateResourceUuidConsistency(dto);
+ validateSnapshotGroupIntegrity(dto);
+ }
+
+ /**
+ * 校验 schema 版本是否匹配当前平台版本。
+ *
+ * @param dto 待校验的元数据 DTO
+ * @param currentVersion 当前平台 schema 版本
+ * @throws CloudRuntimeException 版本缺失或不匹配时抛出
+ */
+ public static void validateSchemaVersion(VmInstanceMetadataDTO dto, String currentVersion) {
+ if (dto.schemaVersion == null || dto.schemaVersion.isEmpty()) {
+ throw new CloudRuntimeException("metadata schemaVersion is missing");
+ }
+ if (!dto.schemaVersion.equals(currentVersion)) {
+ throw new CloudRuntimeException(String.format(
+ "metadata schemaVersion[%s] does not match current platform version[%s]," +
+ " please upgrade metadata first",
+ dto.schemaVersion, currentVersion));
+ }
+ }
+
+ /**
+ * 校验所有 ResourceMetadata 的 resourceUuid 与 vo 内部 uuid 一致。
+ *
+ * @param dto 待校验的元数据 DTO
+ * @throws CloudRuntimeException resourceUuid 缺失或与 vo.uuid 不一致时抛出
+ */
+ public static void validateResourceUuidConsistency(VmInstanceMetadataDTO dto) {
+ if (dto.vm != null) {
+ validateSingleResourceUuid(dto.vm, "vm");
+ }
+ if (dto.volumes != null) {
+ for (int i = 0; i < dto.volumes.size(); i++) {
+ validateSingleResourceUuid(dto.volumes.get(i), "volumes[" + i + "]");
+ }
+ }
+ if (dto.nics != null) {
+ for (int i = 0; i < dto.nics.size(); i++) {
+ validateSingleResourceUuid(dto.nics.get(i), "nics[" + i + "]");
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static void validateSingleResourceUuid(VmInstanceMetadataDTO.ResourceMetadata rm, String path) {
+ if (rm.resourceUuid == null) {
+ throw new CloudRuntimeException(String.format(
+ "metadata %s.resourceUuid is null", path));
+ }
+ if (rm.vo == null) {
+ throw new CloudRuntimeException(String.format(
+ "metadata %s.vo is null", path));
+ }
+
+ Map voMap = JSONObjectUtil.toObject(rm.vo, Map.class);
+ Object voUuid = voMap.get("uuid");
+ if (voUuid == null) {
+ throw new CloudRuntimeException(String.format(
+ "metadata %s.vo does not contain uuid field", path));
+ }
+ if (!rm.resourceUuid.equals(voUuid.toString())) {
+ throw new CloudRuntimeException(String.format(
+ "metadata %s.resourceUuid[%s] does not match vo.uuid[%s]",
+ path, rm.resourceUuid, voUuid));
+ }
+ }
+
+ /**
+ * 校验快照组引用的完整性。
+ *
+ * snapshotGroupRefs 中引用的 volumeSnapshotGroupUuid
+ * 必须存在于 snapshotGroups 中。
+ *
+ * @param dto 待校验的元数据 DTO
+ * @throws CloudRuntimeException 引用了不存在的 group 时抛出
+ */
+ @SuppressWarnings("unchecked")
+ public static void validateSnapshotGroupIntegrity(VmInstanceMetadataDTO dto) {
+ if (dto.snapshotGroupRefs == null || dto.snapshotGroupRefs.isEmpty()) {
+ return;
+ }
+ if (dto.snapshotGroups == null || dto.snapshotGroups.isEmpty()) {
+ throw new CloudRuntimeException(
+ "metadata has snapshotGroupRefs but no snapshotGroups");
+ }
+
+ Set groupUuids = new HashSet<>();
+ for (String groupJson : dto.snapshotGroups) {
+ Map groupMap = JSONObjectUtil.toObject(groupJson, Map.class);
+ Object uuid = groupMap.get("uuid");
+ if (uuid != null) {
+ groupUuids.add(uuid.toString());
+ }
+ }
+
+ for (String refJson : dto.snapshotGroupRefs) {
+ Map refMap = JSONObjectUtil.toObject(refJson, Map.class);
+ Object groupUuid = refMap.get("volumeSnapshotGroupUuid");
+ if (groupUuid != null && !groupUuids.contains(groupUuid.toString())) {
+ throw new CloudRuntimeException(String.format(
+ "metadata snapshotGroupRef references non-existent group[uuid:%s]",
+ groupUuid));
+ }
+ }
+ }
+}
\ No newline at end of file
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 b71d8f3be45..1e5a9947ec9 100755
--- a/header/src/main/java/org/zstack/header/vm/VmInstanceState.java
+++ b/header/src/main/java/org/zstack/header/vm/VmInstanceState.java
@@ -30,7 +30,8 @@ public enum VmInstanceState {
Error(null),
NoState(VmInstanceStateEvent.noState),
Unknown(VmInstanceStateEvent.unknown),
- Crashed(VmInstanceStateEvent.crashed);
+ Crashed(VmInstanceStateEvent.crashed),
+ Registering(null);
public static List intermediateStates = new ArrayList<>();
@@ -52,6 +53,7 @@ public enum VmInstanceState {
offlineStates.add(Destroyed);
offlineStates.add(VolumeMigrating);
offlineStates.add(Crashed);
+ offlineStates.add(Registering);
Created.transactions(
new Transaction(VmInstanceStateEvent.starting, VmInstanceState.Starting),
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadata.java b/header/src/main/java/org/zstack/header/vm/VmMetadata.java
new file mode 100644
index 00000000000..92452753804
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadata.java
@@ -0,0 +1,44 @@
+package org.zstack.header.vm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VmMetadata {
+ public String vmInstanceVO;
+ public List vmSystemTags = new ArrayList<>();
+ public List vmResourceConfigs = new ArrayList<>();
+
+ public List volumeVOs = new ArrayList<>();
+ // key = volumeUuid
+ // value = SystemTag
+ public Map> volumeSystemTags = new HashMap<>();
+ // key = volumeUuid
+ // value = ResourceConfig
+ public Map> volumeResourceConfigs = new HashMap<>();
+
+ public List vmNicVOs = new ArrayList<>();
+ // key = nicUuid
+ // value = SystemTag
+ public Map> vmNicSystemTags = new HashMap<>();
+ // key = nicUuid
+ // value = ResourceConfig
+ public Map> vmNicResourceConfigs = new HashMap<>();
+
+ // key = volumeUuid
+ // value = List
+ public Map> volumeSnapshots = new HashMap<>();
+
+ // VolumeSnapshotGroupVO.toString
+ public List volumeSnapshotGroupVO = new ArrayList<>();
+ // VolumeSnapshotGroupRefVO.toString
+ public List volumeSnapshotGroupRefVO = new ArrayList<>();
+
+ // key = volumeUuid
+ // value = VolumeSnapshotReferenceVO.toString
+ public Map volumeSnapshotReferenceVO = new HashMap<>();
+ // key = volumeUuid
+ // value = VolumeSnapshotReferenceTreeVO.toString
+ public Map volumeSnapshotReferenceTreeVO = new HashMap<>();
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataCanonicalEvents.java b/header/src/main/java/org/zstack/header/vm/VmMetadataCanonicalEvents.java
new file mode 100644
index 00000000000..dd5323fea7e
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataCanonicalEvents.java
@@ -0,0 +1,31 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.NeedJsonSchema;
+
+/**
+ * 虚拟机元数据相关 CanonicalEvent 定义。
+ *
+ * 通过 {@code EventFacade.fire()} 发布,供监控系统和巡检机制消费。
+ */
+public class VmMetadataCanonicalEvents {
+
+ /**
+ * GC 放弃后的 stale 事件路径。
+ *
+ * 当 {@code UpdateVmInstanceMetadataGC} 超过最大重试次数后发布此事件,
+ * {@code MetadataHealthCheckJob} 监听此事件将 VM 加入优先刷新队列。
+ */
+ public static final String VM_METADATA_STALE_PATH = "/vm/metadata/stale";
+
+ @NeedJsonSchema
+ public static class MetadataStaleData {
+ public String vmInstanceUuid;
+
+ public MetadataStaleData() {
+ }
+
+ public MetadataStaleData(String vmInstanceUuid) {
+ this.vmInstanceUuid = vmInstanceUuid;
+ }
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataCategory.java b/header/src/main/java/org/zstack/header/vm/VmMetadataCategory.java
new file mode 100644
index 00000000000..8945760d3e5
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataCategory.java
@@ -0,0 +1,18 @@
+package org.zstack.header.vm;
+
+/**
+ * 虚拟机元数据分类。
+ *
+ * 用于区分元数据所属的 VM 类型,注册恢复时按不同分类执行不同的恢复逻辑。
+ *
+ *
+ * - {@link #REGULAR} — 普通云主机
+ * - {@link #TEMPLATE} — 模板虚拟机
+ * - {@link #TEMPLATE_CACHE} — 模板虚拟机缓存
+ *
+ */
+public enum VmMetadataCategory {
+ REGULAR,
+ TEMPLATE,
+ TEMPLATE_CACHE
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataConstants.java b/header/src/main/java/org/zstack/header/vm/VmMetadataConstants.java
new file mode 100644
index 00000000000..d5f26e11427
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataConstants.java
@@ -0,0 +1,54 @@
+package org.zstack.header.vm;
+
+/**
+ * SharedBlock 元数据存储的容量常量与 Payload 大小保护阈值。
+ *
+ * SharedBlock(sblk)使用固定大小的 LV 存储 VM 元数据,采用双 Slot 布局:
+ *
+ * [ LV Header (4096B) ][ Slot-A ][ Slot-B ]
+ * Slot 大小 = (lvSize - headerSize) / 2,向下对齐到 4096
+ * Slot Header = 36B(Magic 4B + SeqNum 8B + SlotOffset 8B + SlotCapacity 8B + PayloadLen 8B)
+ * 可用 Payload = SlotCapacity - SlotHeaderSize
+ *
+ *
+ * @see Part 02b §10.0 容量公式与常量
+ */
+public final class VmMetadataConstants {
+
+ private VmMetadataConstants() {
+ // utility class
+ }
+
+ /** LV 头部大小(字节) */
+ public static final long SBLK_HEADER_SIZE = 4096L;
+
+ /** Slot 头部大小(字节):Magic(4) + SeqNum(8) + SlotOffset(8) + SlotCapacity(8) + PayloadLen(8) */
+ public static final long SBLK_SLOT_HEADER_SIZE = 36L;
+
+ /** SharedBlock 元数据 LV 最大大小(64MB) */
+ public static final long SBLK_MAX_LV_SIZE = 64L * 1024 * 1024;
+
+ /**
+ * 计算给定 LV 大小下单个 Slot 的容量(字节)。
+ *
+ * 公式:((lvSize - headerSize) / 2 / 4096) * 4096(向下对齐到 4096)
+ *
+ * @param lvSize LV 总大小(字节)
+ * @return 单个 Slot 的容量(字节)
+ */
+ public static long slotCapacity(long lvSize) {
+ return ((lvSize - SBLK_HEADER_SIZE) / 2 / 4096) * 4096;
+ }
+
+ /** 64MB LV 下单个 Slot 的最大容量(约 33,550,336 字节) */
+ public static final long SBLK_MAX_SLOT_CAPACITY = slotCapacity(SBLK_MAX_LV_SIZE);
+
+ /** 64MB LV 下单个 Slot 的最大可用 Payload(约 33,550,300 字节) */
+ public static final long SBLK_MAX_PAYLOAD_SIZE = SBLK_MAX_SLOT_CAPACITY - SBLK_SLOT_HEADER_SIZE;
+
+ /** Payload 大小预警阈值(8MB):超过时输出 WARN 日志 */
+ public static final long PAYLOAD_WARN_THRESHOLD = 8L * 1024 * 1024;
+
+ /** Payload 大小拒绝阈值(30MB):超过时 ERROR + 拒绝写入 */
+ public static final long PAYLOAD_REJECT_THRESHOLD = 30L * 1024 * 1024;
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataDirtyVO.java b/header/src/main/java/org/zstack/header/vm/VmMetadataDirtyVO.java
new file mode 100644
index 00000000000..60bf5231263
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataDirtyVO.java
@@ -0,0 +1,143 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.managementnode.ManagementNodeVO;
+import org.zstack.header.vo.ForeignKey;
+import org.zstack.header.vo.ForeignKey.ReferenceOption;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * 记录 VM 元数据的"脏标记",表示该 VM 的元数据需要写入主存储。
+ *
+ * 设计要点
+ *
+ * - vmInstanceUuid 做主键:一个 VM 最多一行,天然去重。
+ * 100 个 API 只产生 1 行,不是 100 行。
+ * - managementNodeUuid FK SET_NULL:MN 宕机后 DB 约束自动释放认领,
+ * 无需额外孤儿扫描。
+ * - vmInstanceUuid FK CASCADE:VM 销毁时自动删除脏标记,无残留。
+ * - dirtyVersion:每次 markDirty +1,刷写前快照 version,
+ * 成功后比较——检测刷写期间是否有新变更。语义比时间戳比较更明确,无精度问题。
+ * - nextRetryTime:退避控制,失败后不立刻重试,等到下次重试时间。
+ *
+ *
+ * 行语义
+ *
+ * - 行存在 = VM 元数据是脏的(需要刷写)
+ * - 行不存在 = VM 元数据已是最新(或 VM 不存在)
+ * - managementNodeUuid != null = 该行已被某个 MN 认领,正在处理
+ * - managementNodeUuid == null = 该行未被认领,可被 Poller 或 triggerFlush 认领
+ *
+ */
+@Entity
+@Table(name = "VmMetadataDirtyVO")
+public class VmMetadataDirtyVO {
+
+ @Id
+ @Column
+ @ForeignKey(parentEntityClass = VmInstanceEO.class, onDeleteAction = ReferenceOption.CASCADE)
+ private String vmInstanceUuid;
+
+ @Column
+ @ForeignKey(parentEntityClass = ManagementNodeVO.class, onDeleteAction = ReferenceOption.SET_NULL)
+ private String managementNodeUuid;
+
+ @Column
+ private long dirtyVersion;
+
+ @Column
+ private Timestamp lastClaimTime;
+
+ @Column
+ private boolean storageStructureChange;
+
+ @Column
+ private int retryCount;
+
+ @Column
+ private Timestamp nextRetryTime;
+
+ @Column
+ private Timestamp createDate;
+
+ @Column
+ private Timestamp lastOpDate;
+
+ @PreUpdate
+ private void preUpdate() {
+ lastOpDate = null;
+ }
+
+ public String getVmInstanceUuid() {
+ return vmInstanceUuid;
+ }
+
+ public void setVmInstanceUuid(String vmInstanceUuid) {
+ this.vmInstanceUuid = vmInstanceUuid;
+ }
+
+ public String getManagementNodeUuid() {
+ return managementNodeUuid;
+ }
+
+ public void setManagementNodeUuid(String managementNodeUuid) {
+ this.managementNodeUuid = managementNodeUuid;
+ }
+
+ public long getDirtyVersion() {
+ return dirtyVersion;
+ }
+
+ public void setDirtyVersion(long dirtyVersion) {
+ this.dirtyVersion = dirtyVersion;
+ }
+
+ public Timestamp getLastClaimTime() {
+ return lastClaimTime;
+ }
+
+ public void setLastClaimTime(Timestamp lastClaimTime) {
+ this.lastClaimTime = lastClaimTime;
+ }
+
+ public boolean isStorageStructureChange() {
+ return storageStructureChange;
+ }
+
+ public void setStorageStructureChange(boolean storageStructureChange) {
+ this.storageStructureChange = storageStructureChange;
+ }
+
+ public int getRetryCount() {
+ return retryCount;
+ }
+
+ public void setRetryCount(int retryCount) {
+ this.retryCount = retryCount;
+ }
+
+ public Timestamp getNextRetryTime() {
+ return nextRetryTime;
+ }
+
+ public void setNextRetryTime(Timestamp nextRetryTime) {
+ this.nextRetryTime = nextRetryTime;
+ }
+
+ 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/vm/VmMetadataDirtyVO_.java b/header/src/main/java/org/zstack/header/vm/VmMetadataDirtyVO_.java
new file mode 100644
index 00000000000..8ed099d9d8e
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataDirtyVO_.java
@@ -0,0 +1,17 @@
+package org.zstack.header.vm;
+
+import javax.persistence.metamodel.SingularAttribute;
+import javax.persistence.metamodel.StaticMetamodel;
+import java.sql.Timestamp;
+
+@StaticMetamodel(VmMetadataDirtyVO.class)
+public class VmMetadataDirtyVO_ {
+ public static volatile SingularAttribute vmInstanceUuid;
+ public static volatile SingularAttribute managementNodeUuid;
+ public static volatile SingularAttribute dirtyVersion;
+ public static volatile SingularAttribute storageStructureChange;
+ public static volatile SingularAttribute retryCount;
+ public static volatile SingularAttribute nextRetryTime;
+ public static volatile SingularAttribute createDate;
+ public static volatile SingularAttribute lastOpDate;
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataErrors.java b/header/src/main/java/org/zstack/header/vm/VmMetadataErrors.java
new file mode 100644
index 00000000000..8e37a63dc67
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataErrors.java
@@ -0,0 +1,28 @@
+package org.zstack.header.vm;
+
+public enum VmMetadataErrors {
+ METADATA_INVALID_FORMAT(1300),
+ METADATA_SCHEMA_VERSION_MISMATCH(1301),
+ METADATA_UUID_CONFLICT(1302),
+ METADATA_STORAGE_NOT_SUPPORTED(1303),
+ METADATA_CROSS_STORAGE_FORBIDDEN(1304),
+ METADATA_INSTALL_PATH_NOT_FOUND(1305),
+ METADATA_CACHE_VM_NOT_REGISTERABLE(1306),
+ METADATA_VM_REGISTERING(1307),
+ METADATA_READ_CORRUPTED(1308),
+ METADATA_PAYLOAD_TOO_LARGE(1309),
+ METADATA_PS_UNREACHABLE(1310),
+ METADATA_FEATURE_DISABLED(1311),
+ ;
+
+ private String code;
+
+ private VmMetadataErrors(int id) {
+ code = String.format("VM_METADATA.%s", id);
+ }
+
+ @Override
+ public String toString() {
+ return code;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataPathFingerprintVO.java b/header/src/main/java/org/zstack/header/vm/VmMetadataPathFingerprintVO.java
new file mode 100644
index 00000000000..62268413d79
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataPathFingerprintVO.java
@@ -0,0 +1,86 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.vo.ForeignKey;
+import org.zstack.header.vo.ForeignKey.ReferenceOption;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * 路径指纹:记录每个 VM 上次成功刷写元数据时的存储拓扑路径快照。
+ *
+ * 设计要点(Part 02b §8.2.3)
+ *
+ * - pathSnapshot:JSON 格式的 volumes/snapshots installPath 列表,
+ * 按 uuid ASC 排序保证确定性,用于纯 DB 侧路径漂移检测(零存储 I/O)。
+ * - lastFlushFailed:Poller 重试耗尽时置 true(C-SR-05),
+ * 仅由 {@code MetadataStaleRecoveryTask} 重置为 false(C-02B-8)。
+ * - staleRecoveryCount:熔断计数器,{@code MetadataStaleRecoveryTask} 每次
+ * 重入队递增,达到上限(默认 10 ≈ 5 小时)后停止自动恢复。
+ * 管理员可通过 {@code APIUpdateVmMetadataMsg} 手动重置为 0。
+ * - vmInstanceUuid 做 PK:一个 VM 最多一行。
+ * FK CASCADE 保证 VM 物理删除时自动清理。
+ *
+ */
+@Entity
+@Table(name = "VmMetadataPathFingerprintVO")
+public class VmMetadataPathFingerprintVO {
+
+ @Id
+ @Column
+ @ForeignKey(parentEntityClass = VmInstanceEO.class, onDeleteAction = ReferenceOption.CASCADE)
+ private String vmInstanceUuid;
+
+ @Column
+ @Lob
+ private String pathSnapshot;
+
+ @Column
+ private Timestamp lastFlushTime;
+
+ @Column
+ private boolean lastFlushFailed;
+
+ @Column
+ private int staleRecoveryCount;
+
+ public String getVmInstanceUuid() {
+ return vmInstanceUuid;
+ }
+
+ public void setVmInstanceUuid(String vmInstanceUuid) {
+ this.vmInstanceUuid = vmInstanceUuid;
+ }
+
+ public String getPathSnapshot() {
+ return pathSnapshot;
+ }
+
+ public void setPathSnapshot(String pathSnapshot) {
+ this.pathSnapshot = pathSnapshot;
+ }
+
+ public Timestamp getLastFlushTime() {
+ return lastFlushTime;
+ }
+
+ public void setLastFlushTime(Timestamp lastFlushTime) {
+ this.lastFlushTime = lastFlushTime;
+ }
+
+ public boolean isLastFlushFailed() {
+ return lastFlushFailed;
+ }
+
+ public void setLastFlushFailed(boolean lastFlushFailed) {
+ this.lastFlushFailed = lastFlushFailed;
+ }
+
+ public int getStaleRecoveryCount() {
+ return staleRecoveryCount;
+ }
+
+ public void setStaleRecoveryCount(int staleRecoveryCount) {
+ this.staleRecoveryCount = staleRecoveryCount;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmMetadataScanResult.java b/header/src/main/java/org/zstack/header/vm/VmMetadataScanResult.java
new file mode 100644
index 00000000000..8a007b3df34
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmMetadataScanResult.java
@@ -0,0 +1,87 @@
+package org.zstack.header.vm;
+
+import java.io.Serializable;
+
+public class VmMetadataScanResult implements Serializable {
+ private String vmUuid;
+ private String vmName;
+ private String vmCategory;
+ private String primaryStorageUuid;
+ private String primaryStorageType;
+ private String schemaVersion;
+ private Long lastUpdateTime;
+ private String metadataPath;
+ private Long sizeBytes;
+
+ public String getVmUuid() {
+ return vmUuid;
+ }
+
+ public void setVmUuid(String vmUuid) {
+ this.vmUuid = vmUuid;
+ }
+
+ public String getVmName() {
+ return vmName;
+ }
+
+ public void setVmName(String vmName) {
+ this.vmName = vmName;
+ }
+
+ public String getVmCategory() {
+ return vmCategory;
+ }
+
+ public void setVmCategory(String vmCategory) {
+ this.vmCategory = vmCategory;
+ }
+
+ public String getPrimaryStorageUuid() {
+ return primaryStorageUuid;
+ }
+
+ public void setPrimaryStorageUuid(String primaryStorageUuid) {
+ this.primaryStorageUuid = primaryStorageUuid;
+ }
+
+ public String getPrimaryStorageType() {
+ return primaryStorageType;
+ }
+
+ public void setPrimaryStorageType(String primaryStorageType) {
+ this.primaryStorageType = primaryStorageType;
+ }
+
+ public String getSchemaVersion() {
+ return schemaVersion;
+ }
+
+ public void setSchemaVersion(String schemaVersion) {
+ this.schemaVersion = schemaVersion;
+ }
+
+ public Long getLastUpdateTime() {
+ return lastUpdateTime;
+ }
+
+ public void setLastUpdateTime(Long lastUpdateTime) {
+ this.lastUpdateTime = lastUpdateTime;
+ }
+
+ public String getMetadataPath() {
+ return metadataPath;
+ }
+
+ public void setMetadataPath(String metadataPath) {
+ this.metadataPath = metadataPath;
+ }
+
+ public Long getSizeBytes() {
+ return sizeBytes;
+ }
+
+ public void setSizeBytes(Long sizeBytes) {
+ this.sizeBytes = sizeBytes;
+ }
+}
diff --git a/header/src/main/java/org/zstack/header/vm/VmUuidFromApiResolver.java b/header/src/main/java/org/zstack/header/vm/VmUuidFromApiResolver.java
new file mode 100644
index 00000000000..1852f716827
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VmUuidFromApiResolver.java
@@ -0,0 +1,49 @@
+package org.zstack.header.vm;
+
+import org.zstack.header.message.APIMessage;
+
+import java.util.List;
+
+/**
+ * 从 API 消息中解析关联的 vmInstanceUuid。
+ *
+ * 用于非 VM 直接 API(如 Volume/Nic/快照 API)中提取关联的 VM UUID,
+ * 以便在 API 成功后触发对应 VM 的元数据更新。
+ *
+ * 实现类示例
+ *
+ * - VolumeToVmResolver:volumeUuid → vmInstanceUuid
+ * - NicToVmResolver:vmNicUuid → vmInstanceUuid
+ * - SnapshotToVmResolver:snapshotUuid → volumeUuid → vmInstanceUuid
+ *
+ *
+ * 解析时机
+ * Resolver 应在 API 执行前 预解析 vmUuid 并缓存在上下文中,
+ * 因为 API 执行后相关资源可能已被删除(如 APIDeleteVolumeMsg 执行后 VolumeVO 不存在)。
+ *
+ * @see MetadataImpact
+ * @see UpdateVmInstanceMetadataMsg
+ */
+public interface VmUuidFromApiResolver {
+
+ /**
+ * 判断此 Resolver 是否能处理指定的 API 消息类型。
+ *
+ * @param msg API 消息
+ * @return true 表示此 Resolver 可以从该消息中解析 vmUuid
+ */
+ boolean supports(APIMessage msg);
+
+ /**
+ * 从 API 消息中解析出关联的 vmInstanceUuid 列表。
+ *
+ * 可能返回空列表(如 volume 未挂载到任何 VM)。
+ * 可能返回多个 UUID(如批量操作涉及多台 VM)。
+ *
+ * 此方法应在 API 执行前调用。
+ *
+ * @param msg API 消息
+ * @return 关联的 vmInstanceUuid 列表,不为 null
+ */
+ List resolveVmUuids(APIMessage msg);
+}
\ No newline at end of file
diff --git a/header/src/main/java/org/zstack/header/vm/VolumeResourceMetadata.java b/header/src/main/java/org/zstack/header/vm/VolumeResourceMetadata.java
new file mode 100644
index 00000000000..cff9943392a
--- /dev/null
+++ b/header/src/main/java/org/zstack/header/vm/VolumeResourceMetadata.java
@@ -0,0 +1,31 @@
+package org.zstack.header.vm;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+/**
+ * 云盘资源元数据,扩展 {@link VmInstanceMetadataDTO.ResourceMetadata} 以包含
+ * 快照引用(VolumeSnapshotReferenceVO)和快照引用树(VolumeSnapshotReferenceTreeVO)数据。
+ *
+ * 每个 Volume 的快照引用数据直接关联到对应的 VolumeResourceMetadata 中,
+ * 而非放在 DTO 顶层的 Map 结构里,便于按卷维度整体操作。
+ */
+public class VolumeResourceMetadata extends VmInstanceMetadataDTO.ResourceMetadata {
+ /**
+ * 该 Volume 关联的快照引用列表。
+ *
+ * 每个元素是 VolumeSnapshotReferenceVO 的 JSON 明文。
+ * 通过 {@code referenceVolumeUuid} 查询关联到本 Volume。
+ */
+ @SerializedName("snapshotReferences")
+ public List snapshotReferences;
+
+ /**
+ * 该 Volume 关联的快照引用树列表。
+ *
+ * 每个元素是 VolumeSnapshotReferenceTreeVO 的 JSON 明文。
+ */
+ @SerializedName("snapshotReferenceTrees")
+ public List snapshotReferenceTrees;
+}
diff --git a/header/src/main/java/org/zstack/header/vm/cdrom/APICreateVmCdRomMsg.java b/header/src/main/java/org/zstack/header/vm/cdrom/APICreateVmCdRomMsg.java
index 72f0c8e9d5a..a04f3585bc1 100644
--- a/header/src/main/java/org/zstack/header/vm/cdrom/APICreateVmCdRomMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/cdrom/APICreateVmCdRomMsg.java
@@ -11,6 +11,7 @@
import org.zstack.header.tag.TagResourceType;
import org.zstack.header.vm.VmInstanceMessage;
import org.zstack.header.vm.VmInstanceVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Create by lining at 2018/12/29
@@ -22,6 +23,7 @@
responseClass = APICreateVmCdRomEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVmCdRomMsg extends APICreateMessage implements APIAuditor, VmInstanceMessage {
@APIParam(maxLength = 255)
private String name;
diff --git a/header/src/main/java/org/zstack/header/vm/cdrom/APIDeleteVmCdRomMsg.java b/header/src/main/java/org/zstack/header/vm/cdrom/APIDeleteVmCdRomMsg.java
index a708c8fb2b3..3274219ca1d 100644
--- a/header/src/main/java/org/zstack/header/vm/cdrom/APIDeleteVmCdRomMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/cdrom/APIDeleteVmCdRomMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
import org.zstack.header.vm.VmInstanceMessage;
import org.zstack.header.vm.VmInstanceVO;
@@ -19,6 +20,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteVmCdRomEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteVmCdRomMsg extends APIDeleteMessage implements VmInstanceMessage, APIAuditor {
@APIParam(resourceType = VmCdRomVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/vm/cdrom/APIQueryVmCdRomMsg.java b/header/src/main/java/org/zstack/header/vm/cdrom/APIQueryVmCdRomMsg.java
index 3c41e0fc112..57a46681b3c 100644
--- a/header/src/main/java/org/zstack/header/vm/cdrom/APIQueryVmCdRomMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/cdrom/APIQueryVmCdRomMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.rest.RestRequest;
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Create by lining at 2018/12/26
@@ -17,6 +18,7 @@
responseClass = APIQueryVmCdRomReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVmCdRomMsg extends APIQueryMessage {
public static List __example__() {
return asList("name=cd-1");
diff --git a/header/src/main/java/org/zstack/header/vm/cdrom/APISetVmInstanceDefaultCdRomMsg.java b/header/src/main/java/org/zstack/header/vm/cdrom/APISetVmInstanceDefaultCdRomMsg.java
index f5f9b0afa76..0727c2f9c6b 100644
--- a/header/src/main/java/org/zstack/header/vm/cdrom/APISetVmInstanceDefaultCdRomMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/cdrom/APISetVmInstanceDefaultCdRomMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceMessage;
import org.zstack.header.vm.VmInstanceVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Create by lining at 2018/12/29
@@ -18,6 +19,7 @@
isAction = true,
responseClass = APISetVmInstanceDefaultCdRomEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APISetVmInstanceDefaultCdRomMsg extends APIMessage implements VmInstanceMessage, APIAuditor {
@APIParam(resourceType = VmCdRomVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/vm/cdrom/APIUpdateVmCdRomMsg.java b/header/src/main/java/org/zstack/header/vm/cdrom/APIUpdateVmCdRomMsg.java
index 927426e5e9a..2fe88f73d03 100644
--- a/header/src/main/java/org/zstack/header/vm/cdrom/APIUpdateVmCdRomMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/cdrom/APIUpdateVmCdRomMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceMessage;
+import org.zstack.header.vm.MetadataImpact;
/**
* Create by lining at 2018/12/30
@@ -16,6 +17,7 @@
isAction = true,
responseClass = APIUpdateVmCdRomEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateVmCdRomMsg extends APIMessage implements VmInstanceMessage {
@APIParam(resourceType = VmCdRomVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataArchiveMsg.java b/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataArchiveMsg.java
index c63db9dd793..330c9a60244 100644
--- a/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataArchiveMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataArchiveMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by LiangHanYu on 2022/6/17 17:31
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryVmInstanceResourceMetadataArchiveReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVmInstanceResourceMetadataArchiveMsg extends APIQueryMessage {
public static List __example__() {
return asList("uuid=" + uuid());
diff --git a/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataGroupMsg.java b/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataGroupMsg.java
index f6d53f463cd..9c56d49fee7 100644
--- a/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataGroupMsg.java
+++ b/header/src/main/java/org/zstack/header/vm/devices/APIQueryVmInstanceResourceMetadataGroupMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by LiangHanYu on 2022/6/20 18:03
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryVmInstanceResourceMetadataGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVmInstanceResourceMetadataGroupMsg extends APIQueryMessage {
public static List __example__() {
return asList("uuid=" + uuid());
diff --git a/header/src/main/java/org/zstack/header/vo/APIGetResourceNamesMsg.java b/header/src/main/java/org/zstack/header/vo/APIGetResourceNamesMsg.java
index ff9ec727649..430851bf307 100755
--- a/header/src/main/java/org/zstack/header/vo/APIGetResourceNamesMsg.java
+++ b/header/src/main/java/org/zstack/header/vo/APIGetResourceNamesMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2017/5/1.
@@ -17,6 +18,7 @@
method = HttpMethod.GET,
responseClass = APIGetResourceNamesReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetResourceNamesMsg extends APISyncCallMessage {
@APIParam(nonempty = true)
private List uuids;
diff --git a/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToHostMsg.java b/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToHostMsg.java
index 6e332fda5c8..ebdb4c28bf4 100644
--- a/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToHostMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToHostMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/volumes/{volumeUuid}/hosts/{hostUuid}",
@@ -12,6 +13,7 @@
responseClass = APIAttachDataVolumeToHostEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAttachDataVolumeToHostMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String volumeUuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToVmMsg.java b/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToVmMsg.java
index 6ae817723f4..a2d3e9a4076 100755
--- a/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToVmMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIAttachDataVolumeToVmMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
import org.zstack.header.vm.VmInstanceVO;
/**
@@ -39,6 +40,7 @@
parameterName = "params",
responseClass = APIAttachDataVolumeToVmEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.STORAGE)
public class APIAttachDataVolumeToVmMsg extends APIMessage implements VolumeMessage {
/**
* @desc vm uuid. see :ref:`VmInstanceInventory`
diff --git a/header/src/main/java/org/zstack/header/volume/APIBackupDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIBackupDataVolumeMsg.java
index 7209c39583f..a73d0e93f4e 100755
--- a/header/src/main/java/org/zstack/header/volume/APIBackupDataVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIBackupDataVolumeMsg.java
@@ -3,6 +3,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.storage.backup.BackupStorageVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api backup data volume to a backup storage
@@ -30,6 +31,7 @@
* @since 0.1.0
*/
@Deprecated
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIBackupDataVolumeMsg extends APIMessage implements VolumeMessage {
/**
* @desc data volume uuid
diff --git a/header/src/main/java/org/zstack/header/volume/APIBatchSyncVolumeSizeMsg.java b/header/src/main/java/org/zstack/header/volume/APIBatchSyncVolumeSizeMsg.java
index dfb03d2cf0c..78eb5ac597b 100644
--- a/header/src/main/java/org/zstack/header/volume/APIBatchSyncVolumeSizeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIBatchSyncVolumeSizeMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/volumes/batch-sync-volumes",
method = HttpMethod.POST,
responseClass = APIBatchSyncVolumeSizeReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIBatchSyncVolumeSizeMsg extends APISyncCallMessage {
@APIParam(resourceType = ClusterVO.class)
private String clusterUuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIChangeVolumeStateMsg.java b/header/src/main/java/org/zstack/header/volume/APIChangeVolumeStateMsg.java
index 30478454c67..0cce04161dc 100755
--- a/header/src/main/java/org/zstack/header/volume/APIChangeVolumeStateMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIChangeVolumeStateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api change data volume state
@@ -38,6 +39,7 @@
method = HttpMethod.PUT,
responseClass = APIChangeVolumeStateEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeVolumeStateMsg extends APIMessage implements VolumeMessage {
/**
* @desc data volume uuid
diff --git a/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeSnapshotMsg.java b/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeSnapshotMsg.java
index b03dee62a3b..fe92611f95c 100755
--- a/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeSnapshotMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeSnapshotMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.tag.TagResourceType;
import java.util.concurrent.TimeUnit;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api create data volume from a volume snapshot
@@ -46,6 +47,7 @@
parameterName = "params"
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 3)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateDataVolumeFromVolumeSnapshotMsg extends APICreateMessage implements APIAuditor {
/**
* @desc max length of 255 characters
diff --git a/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeTemplateMsg.java b/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeTemplateMsg.java
index 84d6f3b95a2..9d5e899f8f1 100755
--- a/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeTemplateMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeFromVolumeTemplateMsg.java
@@ -10,6 +10,7 @@
import org.zstack.header.tag.TagResourceType;
import java.util.concurrent.TimeUnit;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -21,6 +22,7 @@
parameterName = "params"
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 72)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateDataVolumeFromVolumeTemplateMsg extends APICreateMessage implements APIAuditor, VolumeCreateMessage {
@APIParam(resourceType = ImageVO.class)
private String imageUuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeMsg.java
index 87c501b580c..3dcaf4a7194 100755
--- a/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APICreateDataVolumeMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.tag.TagResourceType;
import java.util.concurrent.TimeUnit;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api create a new data volume
@@ -46,6 +47,7 @@
responseClass = APICreateDataVolumeEvent.class
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 3)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateDataVolumeMsg extends APICreateMessage implements APIAuditor, VolumeCreateMessage {
/**
* @desc max length of 255 characters
diff --git a/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotGroupMsg.java b/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotGroupMsg.java
index 9b497a73fe4..b211cd862c4 100644
--- a/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotGroupMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotGroupMsg.java
@@ -11,6 +11,7 @@
import org.zstack.header.storage.snapshot.VolumeSnapshotVO;
import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefInventory;
import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupVO;
+import org.zstack.header.vm.MetadataImpact;
import org.zstack.header.vm.VmInstanceInventory;
import org.zstack.header.vm.VmInstanceVO;
@@ -28,6 +29,7 @@
parameterName = "params"
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 3)
+@MetadataImpact(value = MetadataImpact.Impact.STORAGE, updateOnFailure = true)
public class APICreateVolumeSnapshotGroupMsg extends APICreateMessage implements VolumeMessage, CreateVolumeSnapshotGroupMessage, APIMultiAuditor {
/**
* @desc root volume uuid. See :ref:`VolumeInventory`
diff --git a/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotMsg.java b/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotMsg.java
index 35f57d205f6..99136e702aa 100755
--- a/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APICreateVolumeSnapshotMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.storage.snapshot.VolumeSnapshotVO;
import java.util.concurrent.TimeUnit;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api create a volume snapshot from volume
@@ -45,6 +46,7 @@
parameterName = "params"
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 3)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVolumeSnapshotMsg extends APICreateMessage implements VolumeMessage, APIAuditor {
/**
* @desc volume uuid. See :ref:`VolumeInventory`
diff --git a/header/src/main/java/org/zstack/header/volume/APIDeleteDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIDeleteDataVolumeMsg.java
index fdbb1be9847..1b90420fb65 100755
--- a/header/src/main/java/org/zstack/header/volume/APIDeleteDataVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIDeleteDataVolumeMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
import java.util.List;
@@ -42,6 +43,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteDataVolumeEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.STORAGE)
public class APIDeleteDataVolumeMsg extends APIDeleteMessage implements VolumeMessage {
/**
* @desc data volume uuid
diff --git a/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromHostMsg.java b/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromHostMsg.java
index 742addae83a..404e5f7b5fd 100644
--- a/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromHostMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromHostMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/volumes/{volumeUuid}/hosts",
method = HttpMethod.DELETE,
responseClass = APIDetachDataVolumeFromHostEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDetachDataVolumeFromHostMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String volumeUuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromVmMsg.java b/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromVmMsg.java
index 5164ffca076..4b93990dff3 100755
--- a/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromVmMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIDetachDataVolumeFromVmMsg.java
@@ -3,6 +3,7 @@
import org.springframework.http.HttpMethod;
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
+import org.zstack.header.vm.MetadataImpact;
import org.zstack.header.vm.VmInstanceVO;
import org.zstack.header.rest.RestRequest;
@@ -36,6 +37,7 @@
method = HttpMethod.DELETE,
responseClass = APIDetachDataVolumeFromVmEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.STORAGE)
public class APIDetachDataVolumeFromVmMsg extends APIMessage implements VolumeMessage {
/**
* @desc data volume uuid. See :ref:`VolumeInventory`
diff --git a/header/src/main/java/org/zstack/header/volume/APIExpungeDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIExpungeDataVolumeMsg.java
index 272036c9378..14f6c69f885 100755
--- a/header/src/main/java/org/zstack/header/volume/APIExpungeDataVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIExpungeDataVolumeMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 11/16/2015.
@@ -14,6 +15,7 @@
method = HttpMethod.PUT,
responseClass = APIExpungeDataVolumeEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIExpungeDataVolumeMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIFlattenVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIFlattenVolumeMsg.java
index daeb56b44eb..817be91596b 100644
--- a/header/src/main/java/org/zstack/header/volume/APIFlattenVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIFlattenVolumeMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.message.DefaultTimeout;
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
import java.util.concurrent.TimeUnit;
@@ -17,6 +18,7 @@
method = HttpMethod.PUT,
responseClass = APIFlattenVolumeEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.STORAGE)
public class APIFlattenVolumeMsg extends APIMessage implements VolumeMessage, APIAuditor {
@APIParam(resourceType = VolumeVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIGetDataVolumeAttachableVmMsg.java b/header/src/main/java/org/zstack/header/volume/APIGetDataVolumeAttachableVmMsg.java
index fe2f0caa362..e872d19aef7 100755
--- a/header/src/main/java/org/zstack/header/volume/APIGetDataVolumeAttachableVmMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIGetDataVolumeAttachableVmMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -12,6 +13,7 @@
method = HttpMethod.GET,
responseClass = APIGetDataVolumeAttachableVmReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetDataVolumeAttachableVmMsg extends APISyncCallMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String volumeUuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIGetVolumeCapabilitiesMsg.java b/header/src/main/java/org/zstack/header/volume/APIGetVolumeCapabilitiesMsg.java
index 75e52f1c4b6..c32c4b5f12c 100755
--- a/header/src/main/java/org/zstack/header/volume/APIGetVolumeCapabilitiesMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIGetVolumeCapabilitiesMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2016/5/19.
@@ -13,6 +14,7 @@
method = HttpMethod.GET,
responseClass = APIGetVolumeCapabilitiesReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetVolumeCapabilitiesMsg extends APISyncCallMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIGetVolumeFormatMsg.java b/header/src/main/java/org/zstack/header/volume/APIGetVolumeFormatMsg.java
index b401d60ab6b..0a48cdd22fc 100755
--- a/header/src/main/java/org/zstack/header/volume/APIGetVolumeFormatMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIGetVolumeFormatMsg.java
@@ -3,6 +3,7 @@
import org.springframework.http.HttpMethod;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -11,6 +12,7 @@
method = HttpMethod.GET,
responseClass = APIGetVolumeFormatReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetVolumeFormatMsg extends APISyncCallMessage {
public static APIGetVolumeFormatMsg __example__() {
diff --git a/header/src/main/java/org/zstack/header/volume/APIQueryVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIQueryVolumeMsg.java
index f97f77ae8ab..eed79908267 100755
--- a/header/src/main/java/org/zstack/header/volume/APIQueryVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIQueryVolumeMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryVolumeReply.class, inventoryClass = VolumeInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
responseClass = APIQueryVolumeReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVolumeMsg extends APIQueryMessage {
diff --git a/header/src/main/java/org/zstack/header/volume/APIRecoverDataVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIRecoverDataVolumeMsg.java
index eec77334a37..ea62fcff23e 100755
--- a/header/src/main/java/org/zstack/header/volume/APIRecoverDataVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIRecoverDataVolumeMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 11/12/2015.
@@ -14,6 +15,7 @@
method = HttpMethod.PUT,
responseClass = APIRecoverDataVolumeEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.STORAGE)
public class APIRecoverDataVolumeMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APISyncVolumeSizeMsg.java b/header/src/main/java/org/zstack/header/volume/APISyncVolumeSizeMsg.java
index d4780c73be0..1aebe825867 100755
--- a/header/src/main/java/org/zstack/header/volume/APISyncVolumeSizeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APISyncVolumeSizeMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2016/4/24.
@@ -14,6 +15,7 @@
responseClass = APISyncVolumeSizeEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APISyncVolumeSizeMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/volume/APIUndoSnapshotCreationMsg.java b/header/src/main/java/org/zstack/header/volume/APIUndoSnapshotCreationMsg.java
index 0d27cfaa18a..216d8f2cba5 100644
--- a/header/src/main/java/org/zstack/header/volume/APIUndoSnapshotCreationMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIUndoSnapshotCreationMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.snapshot.VolumeSnapshotVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @ Author : yh.w
@@ -16,6 +17,7 @@
method = HttpMethod.PUT,
responseClass = APIUndoSnapshotCreationEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUndoSnapshotCreationMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
diff --git a/header/src/main/java/org/zstack/header/volume/APIUpdateVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/APIUpdateVolumeMsg.java
index 785cf824abd..434ab40b9f5 100755
--- a/header/src/main/java/org/zstack/header/volume/APIUpdateVolumeMsg.java
+++ b/header/src/main/java/org/zstack/header/volume/APIUpdateVolumeMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/14/2015.
@@ -14,6 +15,7 @@
responseClass = APIUpdateVolumeEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateVolumeMsg extends APIMessage implements VolumeMessage {
@APIParam(resourceType = VolumeVO.class)
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/zone/APIChangeZoneStateMsg.java b/header/src/main/java/org/zstack/header/zone/APIChangeZoneStateMsg.java
index 76a8335fca7..d30ef74cfe9 100755
--- a/header/src/main/java/org/zstack/header/zone/APIChangeZoneStateMsg.java
+++ b/header/src/main/java/org/zstack/header/zone/APIChangeZoneStateMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
@@ -46,6 +47,7 @@
responseClass = APIChangeZoneStateEvent.class,
method = HttpMethod.PUT
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeZoneStateMsg extends APIMessage implements ZoneMessage {
/**
* @desc zone uuid
diff --git a/header/src/main/java/org/zstack/header/zone/APICreateZoneMsg.java b/header/src/main/java/org/zstack/header/zone/APICreateZoneMsg.java
index e1fa32409aa..d057f9355f0 100755
--- a/header/src/main/java/org/zstack/header/zone/APICreateZoneMsg.java
+++ b/header/src/main/java/org/zstack/header/zone/APICreateZoneMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api create a new zone
@@ -42,6 +43,7 @@
parameterName = "params",
responseClass = APICreateZoneEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateZoneMsg extends APICreateMessage implements APIAuditor {
/**
* @desc max length of 255 characters
diff --git a/header/src/main/java/org/zstack/header/zone/APIDeleteZoneMsg.java b/header/src/main/java/org/zstack/header/zone/APIDeleteZoneMsg.java
index df1420eaccc..7b34e3d9f00 100755
--- a/header/src/main/java/org/zstack/header/zone/APIDeleteZoneMsg.java
+++ b/header/src/main/java/org/zstack/header/zone/APIDeleteZoneMsg.java
@@ -10,6 +10,7 @@
import java.util.List;
import static org.zstack.utils.CollectionDSL.list;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api delete a zone. All descendant resources, for example cluster/host/vm, are deleted in
@@ -43,6 +44,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteZoneEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteZoneMsg extends APIDeleteMessage implements ZoneMessage {
/**
* @desc zone uuid
diff --git a/header/src/main/java/org/zstack/header/zone/APIGetZoneMsg.java b/header/src/main/java/org/zstack/header/zone/APIGetZoneMsg.java
index 921ba77ed5f..076fa4924cc 100755
--- a/header/src/main/java/org/zstack/header/zone/APIGetZoneMsg.java
+++ b/header/src/main/java/org/zstack/header/zone/APIGetZoneMsg.java
@@ -3,12 +3,14 @@
import org.springframework.http.HttpMethod;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/zones/{uuid}/info",
method = HttpMethod.GET,
responseClass = APIGetZoneReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetZoneMsg extends APISyncCallMessage {
private String uuid;
diff --git a/header/src/main/java/org/zstack/header/zone/APIQueryZoneMsg.java b/header/src/main/java/org/zstack/header/zone/APIQueryZoneMsg.java
index 047835f7a9e..27adc53c871 100755
--- a/header/src/main/java/org/zstack/header/zone/APIQueryZoneMsg.java
+++ b/header/src/main/java/org/zstack/header/zone/APIQueryZoneMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryZoneReply.class, inventoryClass = ZoneInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
responseClass = APIQueryZoneReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryZoneMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/header/src/main/java/org/zstack/header/zone/APIUpdateZoneMsg.java b/header/src/main/java/org/zstack/header/zone/APIUpdateZoneMsg.java
index d2718cc007b..65e0e6c3559 100755
--- a/header/src/main/java/org/zstack/header/zone/APIUpdateZoneMsg.java
+++ b/header/src/main/java/org/zstack/header/zone/APIUpdateZoneMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/14/2015.
@@ -15,6 +16,7 @@
responseClass = APIUpdateZoneEvent.class,
method = HttpMethod.PUT
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateZoneMsg extends APIMessage implements ZoneMessage {
@APIParam(maxLength = 255, required = false)
private String name;
diff --git a/plugin/account-import/src/main/java/org/zstack/identity/imports/api/APIQueryThirdPartyAccountSourceBindingMsg.java b/plugin/account-import/src/main/java/org/zstack/identity/imports/api/APIQueryThirdPartyAccountSourceBindingMsg.java
index 1813701c2fd..41784cbe7a2 100644
--- a/plugin/account-import/src/main/java/org/zstack/identity/imports/api/APIQueryThirdPartyAccountSourceBindingMsg.java
+++ b/plugin/account-import/src/main/java/org/zstack/identity/imports/api/APIQueryThirdPartyAccountSourceBindingMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryThirdPartyAccountSourceBindingReply.class, inventoryClass = AccountThirdPartyAccountSourceRefInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
method = HttpMethod.GET,
responseClass = APIQueryThirdPartyAccountSourceBindingReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryThirdPartyAccountSourceBindingMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryMsg.java
index 65566a737ed..c6e4042b9f0 100644
--- a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryMsg.java
+++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListEntryMsg.java
@@ -1,66 +1,68 @@
-package org.zstack.header.acl;
-
-import org.springframework.http.HttpMethod;
-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;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-09
- **/
-@RestRequest(
- path = "/access-control-lists/{aclUuid}/ipentries",
- method = HttpMethod.POST,
- responseClass = APIAddAccessControlListEntryEvent.class,
- parameterName = "params"
-)
-public class APIAddAccessControlListEntryMsg extends APICreateMessage implements APIAuditor {
- @APIParam(resourceType = AccessControlListVO.class)
- private String aclUuid;
- @APIParam(maxLength = 2048)
- private String entries;
- @APIParam(maxLength = 2048, required = false)
- private String description;
-
- public String getAclUuid() {
- return aclUuid;
- }
-
- public void setAclUuid(String aclUuid) {
- this.aclUuid = aclUuid;
- }
-
- public String getEntries() {
- return entries;
- }
-
- public void setEntries(String entries) {
- this.entries = entries;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public static APIAddAccessControlListEntryMsg __example__() {
- APIAddAccessControlListEntryMsg msg = new APIAddAccessControlListEntryMsg();
-
- msg.setAclUuid(uuid(AccessControlListVO.class));
- msg.setEntries("192.168.12.1,192.168.48.0/24");
-
- return msg;
- }
-
- @Override
- public Result audit(APIMessage msg, APIEvent rsp) {
- return new Result(rsp.isSuccess() ? ((APIAddAccessControlListEntryEvent)rsp).getInventory().getUuid() : "", AccessControlListEntryVO.class);
- }
-}
+package org.zstack.header.acl;
+
+import org.springframework.http.HttpMethod;
+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.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-09
+ **/
+@RestRequest(
+ path = "/access-control-lists/{aclUuid}/ipentries",
+ method = HttpMethod.POST,
+ responseClass = APIAddAccessControlListEntryEvent.class,
+ parameterName = "params"
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIAddAccessControlListEntryMsg extends APICreateMessage implements APIAuditor {
+ @APIParam(resourceType = AccessControlListVO.class)
+ private String aclUuid;
+ @APIParam(maxLength = 2048)
+ private String entries;
+ @APIParam(maxLength = 2048, required = false)
+ private String description;
+
+ public String getAclUuid() {
+ return aclUuid;
+ }
+
+ public void setAclUuid(String aclUuid) {
+ this.aclUuid = aclUuid;
+ }
+
+ public String getEntries() {
+ return entries;
+ }
+
+ public void setEntries(String entries) {
+ this.entries = entries;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public static APIAddAccessControlListEntryMsg __example__() {
+ APIAddAccessControlListEntryMsg msg = new APIAddAccessControlListEntryMsg();
+
+ msg.setAclUuid(uuid(AccessControlListVO.class));
+ msg.setEntries("192.168.12.1,192.168.48.0/24");
+
+ return msg;
+ }
+
+ @Override
+ public Result audit(APIMessage msg, APIEvent rsp) {
+ return new Result(rsp.isSuccess() ? ((APIAddAccessControlListEntryEvent)rsp).getInventory().getUuid() : "", AccessControlListEntryVO.class);
+ }
+}
diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java
index bfd0b6b307e..0980849a46a 100644
--- a/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java
+++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIAddAccessControlListRedirectRuleMsg.java
@@ -11,6 +11,7 @@
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
@TagResourceType(AccessControlListVO.class)
@RestRequest(
@@ -19,6 +20,7 @@
responseClass = APIAddAccessControlListEntryEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddAccessControlListRedirectRuleMsg extends APICreateMessage implements APIAuditor {
@APIParam(maxLength = 255, required = false)
private String name;
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 8b4259286a7..66fca508227 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
@@ -6,6 +6,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/access-control-lists/redirectRules/{uuid}/actions",
@@ -13,6 +14,7 @@
responseClass = APIChangeAccessControlListRedirectRuleEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeAccessControlListRedirectRuleMsg extends APIMessage implements APIAuditor {
@APIParam(resourceType = AccessControlListEntryVO.class)
private String uuid;
diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APICreateAccessControlListMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APICreateAccessControlListMsg.java
index b9bd6779c32..661251ba287 100644
--- a/plugin/acl/src/main/java/org/zstack/header/acl/APICreateAccessControlListMsg.java
+++ b/plugin/acl/src/main/java/org/zstack/header/acl/APICreateAccessControlListMsg.java
@@ -1,69 +1,71 @@
-package org.zstack.header.acl;
-
-import org.springframework.http.HttpMethod;
-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;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-09
- **/
-@TagResourceType(AccessControlListVO.class)
-@RestRequest(
- path = "/access-control-lists",
- method = HttpMethod.POST,
- responseClass = APICreateAccessControlListEvent.class,
- parameterName = "params"
-)
-public class APICreateAccessControlListMsg extends APICreateMessage implements APIAuditor {
- @APIParam(maxLength = 255)
- private String name;
- @APIParam(maxLength = 2048, required = false)
- private String description;
- @APIParam(validValues = {"4", "6"}, required = false)
- private Integer ipVersion;
-
-
- 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 Integer getIpVersion() {
- return ipVersion;
- }
-
- public void setIpVersion(Integer ipVersion) {
- this.ipVersion = ipVersion;
- }
-
- public static APICreateAccessControlListMsg __example__() {
- APICreateAccessControlListMsg msg = new APICreateAccessControlListMsg();
-
- msg.setName("acl-group");
- msg.setIpVersion(4);
-
- return msg;
- }
-
- @Override
- public Result audit(APIMessage msg, APIEvent rsp) {
- return new Result(rsp.isSuccess() ? ((APICreateAccessControlListEvent)rsp).getInventory().getUuid() : "", AccessControlListVO.class);
- }
-}
+package org.zstack.header.acl;
+
+import org.springframework.http.HttpMethod;
+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;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-09
+ **/
+@TagResourceType(AccessControlListVO.class)
+@RestRequest(
+ path = "/access-control-lists",
+ method = HttpMethod.POST,
+ responseClass = APICreateAccessControlListEvent.class,
+ parameterName = "params"
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APICreateAccessControlListMsg extends APICreateMessage implements APIAuditor {
+ @APIParam(maxLength = 255)
+ private String name;
+ @APIParam(maxLength = 2048, required = false)
+ private String description;
+ @APIParam(validValues = {"4", "6"}, required = false)
+ private Integer ipVersion;
+
+
+ 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 Integer getIpVersion() {
+ return ipVersion;
+ }
+
+ public void setIpVersion(Integer ipVersion) {
+ this.ipVersion = ipVersion;
+ }
+
+ public static APICreateAccessControlListMsg __example__() {
+ APICreateAccessControlListMsg msg = new APICreateAccessControlListMsg();
+
+ msg.setName("acl-group");
+ msg.setIpVersion(4);
+
+ return msg;
+ }
+
+ @Override
+ public Result audit(APIMessage msg, APIEvent rsp) {
+ return new Result(rsp.isSuccess() ? ((APICreateAccessControlListEvent)rsp).getInventory().getUuid() : "", AccessControlListVO.class);
+ }
+}
diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIDeleteAccessControlListMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIDeleteAccessControlListMsg.java
index c919063f71e..09cadf92dc2 100644
--- a/plugin/acl/src/main/java/org/zstack/header/acl/APIDeleteAccessControlListMsg.java
+++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIDeleteAccessControlListMsg.java
@@ -1,34 +1,36 @@
-package org.zstack.header.acl;
-
-import org.springframework.http.HttpMethod;
-import org.zstack.header.message.APIDeleteMessage;
-import org.zstack.header.message.APIParam;
-import org.zstack.header.rest.RestRequest;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-09
- **/
-@RestRequest(
- path = "/access-control-lists/{uuid}",
- method = HttpMethod.DELETE,
- responseClass = APIDeleteAccessControlListEvent.class
-)
-public class APIDeleteAccessControlListMsg extends APIDeleteMessage {
- @APIParam(resourceType = AccessControlListVO.class, successIfResourceNotExisting = true)
- private String uuid;
-
- public String getUuid() {
- return uuid;
- }
-
- public void setUuid(String uuid) {
- this.uuid = uuid;
- }
-
- public static APIDeleteAccessControlListMsg __example__() {
- APIDeleteAccessControlListMsg msg = new APIDeleteAccessControlListMsg();
- msg.setUuid(uuid());
- return msg;
- }
-}
+package org.zstack.header.acl;
+
+import org.springframework.http.HttpMethod;
+import org.zstack.header.message.APIDeleteMessage;
+import org.zstack.header.message.APIParam;
+import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-09
+ **/
+@RestRequest(
+ path = "/access-control-lists/{uuid}",
+ method = HttpMethod.DELETE,
+ responseClass = APIDeleteAccessControlListEvent.class
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIDeleteAccessControlListMsg extends APIDeleteMessage {
+ @APIParam(resourceType = AccessControlListVO.class, successIfResourceNotExisting = true)
+ private String uuid;
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public static APIDeleteAccessControlListMsg __example__() {
+ APIDeleteAccessControlListMsg msg = new APIDeleteAccessControlListMsg();
+ msg.setUuid(uuid());
+ return msg;
+ }
+}
diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIQueryAccessControlListMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIQueryAccessControlListMsg.java
index 94abeb2801f..8f5904ba4e2 100644
--- a/plugin/acl/src/main/java/org/zstack/header/acl/APIQueryAccessControlListMsg.java
+++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIQueryAccessControlListMsg.java
@@ -1,29 +1,31 @@
-package org.zstack.header.acl;
-
-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;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-09
- **/
-@AutoQuery(replyClass = APIQueryAccessControlListReply.class, inventoryClass = AccessControlListInventory.class)
-@RestRequest(
- path = "/access-control-lists",
- optionalPaths = {"/access-control-lists/{uuid}"},
- method = HttpMethod.GET,
- responseClass = APIQueryAccessControlListReply.class
-)
-public class APIQueryAccessControlListMsg extends APIQueryMessage {
-
- public static List __example__() {
- return asList();
- }
-
+package org.zstack.header.acl;
+
+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;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-09
+ **/
+@AutoQuery(replyClass = APIQueryAccessControlListReply.class, inventoryClass = AccessControlListInventory.class)
+@RestRequest(
+ path = "/access-control-lists",
+ optionalPaths = {"/access-control-lists/{uuid}"},
+ method = HttpMethod.GET,
+ responseClass = APIQueryAccessControlListReply.class
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIQueryAccessControlListMsg extends APIQueryMessage {
+
+ public static List __example__() {
+ return asList();
+ }
+
}
\ No newline at end of file
diff --git a/plugin/acl/src/main/java/org/zstack/header/acl/APIRemoveAccessControlListEntryMsg.java b/plugin/acl/src/main/java/org/zstack/header/acl/APIRemoveAccessControlListEntryMsg.java
index c9e614720c7..bfae47f5a76 100644
--- a/plugin/acl/src/main/java/org/zstack/header/acl/APIRemoveAccessControlListEntryMsg.java
+++ b/plugin/acl/src/main/java/org/zstack/header/acl/APIRemoveAccessControlListEntryMsg.java
@@ -1,54 +1,56 @@
-package org.zstack.header.acl;
-
-import org.springframework.http.HttpMethod;
-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.other.APIAuditor;
-import org.zstack.header.rest.RestRequest;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-09
- **/
-@RestRequest(
- path = "/access-control-lists/{aclUuid}/ipentries/{uuid}",
- method = HttpMethod.DELETE,
- responseClass = APIRemoveAccessControlListEntryEvent.class
-)
-public class APIRemoveAccessControlListEntryMsg extends APIDeleteMessage implements APIAuditor{
- @APIParam(resourceType = AccessControlListVO.class)
- private String aclUuid;
- @APIParam(resourceType = AccessControlListEntryVO.class, successIfResourceNotExisting = true)
- private String uuid;
-
- public String getAclUuid() {
- return aclUuid;
- }
-
- public void setAclUuid(String aclUuid) {
- this.aclUuid = aclUuid;
- }
-
- public String getUuid() {
- return uuid;
- }
-
- public void setUuid(String uuid) {
- this.uuid = uuid;
- }
-
- public static APIRemoveAccessControlListEntryMsg __example__() {
- APIRemoveAccessControlListEntryMsg msg = new APIRemoveAccessControlListEntryMsg();
- msg.setUuid(uuid());
- msg.setAclUuid(uuid());
-
- return msg;
- }
-
- @Override
- public APIAuditor.Result audit(APIMessage msg, APIEvent rsp) {
- return new APIAuditor.Result(((APIRemoveAccessControlListEntryMsg)msg).getUuid(), AccessControlListEntryVO.class);
- }
-}
+package org.zstack.header.acl;
+
+import org.springframework.http.HttpMethod;
+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.other.APIAuditor;
+import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-09
+ **/
+@RestRequest(
+ path = "/access-control-lists/{aclUuid}/ipentries/{uuid}",
+ method = HttpMethod.DELETE,
+ responseClass = APIRemoveAccessControlListEntryEvent.class
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIRemoveAccessControlListEntryMsg extends APIDeleteMessage implements APIAuditor{
+ @APIParam(resourceType = AccessControlListVO.class)
+ private String aclUuid;
+ @APIParam(resourceType = AccessControlListEntryVO.class, successIfResourceNotExisting = true)
+ private String uuid;
+
+ public String getAclUuid() {
+ return aclUuid;
+ }
+
+ public void setAclUuid(String aclUuid) {
+ this.aclUuid = aclUuid;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public static APIRemoveAccessControlListEntryMsg __example__() {
+ APIRemoveAccessControlListEntryMsg msg = new APIRemoveAccessControlListEntryMsg();
+ msg.setUuid(uuid());
+ msg.setAclUuid(uuid());
+
+ return msg;
+ }
+
+ @Override
+ public APIAuditor.Result audit(APIMessage msg, APIEvent rsp) {
+ return new APIAuditor.Result(((APIRemoveAccessControlListEntryMsg)msg).getUuid(), AccessControlListEntryVO.class);
+ }
+}
diff --git a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/APIQueryApplianceVmMsg.java b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/APIQueryApplianceVmMsg.java
index 9a21bcae536..3fcd502c57d 100755
--- a/plugin/applianceVm/src/main/java/org/zstack/appliancevm/APIQueryApplianceVmMsg.java
+++ b/plugin/applianceVm/src/main/java/org/zstack/appliancevm/APIQueryApplianceVmMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -18,6 +19,7 @@
method = HttpMethod.GET,
responseClass = APIQueryApplianceVmReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryApplianceVmMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddCephBackupStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddCephBackupStorageMsg.java
index e7e2795e657..41f6b8fd2fa 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddCephBackupStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddCephBackupStorageMsg.java
@@ -15,6 +15,7 @@
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 7/27/2015.
@@ -29,6 +30,7 @@
parameterName = "params",
responseClass = APIAddBackupStorageEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddCephBackupStorageMsg extends APIAddBackupStorageMsg implements Serializable {
@APIParam(nonempty = false, emptyString = false)
@NoLogging(type = NoLogging.Type.Uri)
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddMonToCephBackupStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddMonToCephBackupStorageMsg.java
index 556bc277028..03b975196d8 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddMonToCephBackupStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIAddMonToCephBackupStorageMsg.java
@@ -11,6 +11,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/1/2015.
@@ -21,6 +22,7 @@
parameterName = "params",
responseClass = APIAddMonToCephBackupStorageEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddMonToCephBackupStorageMsg extends APIMessage implements BackupStorageMessage {
@APIParam(resourceType = CephBackupStorageVO.class)
private String uuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIQueryCephBackupStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIQueryCephBackupStorageMsg.java
index a4e8c4eedf7..03f6cc0fd99 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIQueryCephBackupStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIQueryCephBackupStorageMsg.java
@@ -8,6 +8,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/6/2015.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryBackupStorageReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryCephBackupStorageMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIRemoveMonFromCephBackupStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIRemoveMonFromCephBackupStorageMsg.java
index fd45ed139a0..94e5c42a022 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIRemoveMonFromCephBackupStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIRemoveMonFromCephBackupStorageMsg.java
@@ -10,6 +10,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/1/2015.
@@ -19,6 +20,7 @@
method = HttpMethod.DELETE,
responseClass = APIRemoveMonFromCephBackupStorageEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveMonFromCephBackupStorageMsg extends APIMessage implements BackupStorageMessage {
@APIParam(resourceType = CephBackupStorageVO.class)
private String uuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIUpdateCephBackupStorageMonMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIUpdateCephBackupStorageMonMsg.java
index d29ad15dcbc..a954cd0d20d 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIUpdateCephBackupStorageMonMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/APIUpdateCephBackupStorageMonMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.storage.backup.BackupStorageMessage;
import java.io.Serializable;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by Mei Lei on 6/3/2016.
@@ -19,6 +20,7 @@
isAction = true,
responseClass = APIUpdateCephBackupStorageMonEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateCephBackupStorageMonMsg extends APIMessage implements BackupStorageMessage, Serializable {
@APINoSee
private String backupStorageUuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStorageMsg.java
index fd7f7590f15..70562098f23 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStorageMsg.java
@@ -12,6 +12,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 7/28/2015.
@@ -26,6 +27,7 @@
responseClass = APIAddPrimaryStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddCephPrimaryStorageMsg extends APIAddPrimaryStorageMsg {
@APIParam(nonempty = false, emptyString = false)
@NoLogging(type = NoLogging.Type.Uri)
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStoragePoolMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStoragePoolMsg.java
index 458a3060d51..396a114c6c3 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStoragePoolMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddCephPrimaryStoragePoolMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageMessage;
import org.zstack.header.storage.primary.PrimaryStorageVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2017/2/28.
@@ -19,6 +20,7 @@
parameterName = "params",
responseClass = APIAddCephPrimaryStoragePoolEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddCephPrimaryStoragePoolMsg extends APICreateMessage implements PrimaryStorageMessage, APIAuditor {
@APIParam(resourceType = PrimaryStorageVO.class)
private String primaryStorageUuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddMonToCephPrimaryStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddMonToCephPrimaryStorageMsg.java
index 3d91a19e274..ffd0750480a 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddMonToCephPrimaryStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIAddMonToCephPrimaryStorageMsg.java
@@ -11,6 +11,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/6/2015.
@@ -21,6 +22,7 @@
responseClass = APIAddMonToCephPrimaryStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddMonToCephPrimaryStorageMsg extends APIMessage implements PrimaryStorageMessage {
@APIParam(resourceType = CephPrimaryStorageVO.class)
private String uuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIDeleteCephPrimaryStoragePoolMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIDeleteCephPrimaryStoragePoolMsg.java
index 7a56364cede..54424c02a2b 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIDeleteCephPrimaryStoragePoolMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIDeleteCephPrimaryStoragePoolMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageMessage;
import org.zstack.header.storage.primary.PrimaryStorageVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2017/2/28.
@@ -18,6 +19,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteCephPrimaryStoragePoolEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteCephPrimaryStoragePoolMsg extends APIMessage implements PrimaryStorageMessage, APIAuditor {
@APIParam(resourceType = CephPrimaryStoragePoolVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephOsdGroupMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephOsdGroupMsg.java
index c4d995c7ebd..f61c58d4c51 100644
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephOsdGroupMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephOsdGroupMsg.java
@@ -7,6 +7,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/primary-storage/ceph/osdgroups",
@@ -15,6 +16,7 @@
responseClass = APIQueryCephOsdGroupReply.class
)
@AutoQuery(replyClass = APIQueryCephOsdGroupReply.class, inventoryClass = CephOsdGroupInventory.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryCephOsdGroupMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStorageMsg.java
index 92095b60416..c1fb83d88bb 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStorageMsg.java
@@ -8,6 +8,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/6/2015.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryPrimaryStorageReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryCephPrimaryStorageMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStoragePoolMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStoragePoolMsg.java
index 3e03560f89d..ee37bac1046 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStoragePoolMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIQueryCephPrimaryStoragePoolMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2017/2/28.
@@ -19,6 +20,7 @@
responseClass = APIQueryCephPrimaryStoragePoolReply.class
)
@AutoQuery(replyClass = APIQueryCephPrimaryStoragePoolReply.class, inventoryClass = CephPrimaryStoragePoolInventory.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryCephPrimaryStoragePoolMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIRemoveMonFromCephPrimaryStorageMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIRemoveMonFromCephPrimaryStorageMsg.java
index ec8cccc3d03..3d0c1215b2d 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIRemoveMonFromCephPrimaryStorageMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIRemoveMonFromCephPrimaryStorageMsg.java
@@ -10,6 +10,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/6/2015.
@@ -19,6 +20,7 @@
method = HttpMethod.DELETE,
responseClass = APIRemoveMonFromCephPrimaryStorageEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveMonFromCephPrimaryStorageMsg extends APIMessage implements PrimaryStorageMessage {
@APIParam(resourceType = PrimaryStorageVO.class)
private String uuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStorageMonMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStorageMonMsg.java
index e77b5fe8fca..0a9041fa341 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStorageMonMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStorageMonMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.storage.primary.PrimaryStorageMessage;
import java.io.Serializable;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by Mei Lei on 6/6/2016.
@@ -19,6 +20,7 @@
method = HttpMethod.PUT,
responseClass = APIUpdateCephPrimaryStorageMonEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateCephPrimaryStorageMonMsg extends APIMessage implements PrimaryStorageMessage, Serializable {
@APINoSee
private String primaryStorageUuid;
diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStoragePoolMsg.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStoragePoolMsg.java
index 133baa5aee5..7ac9f9a6fde 100755
--- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStoragePoolMsg.java
+++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/APIUpdateCephPrimaryStoragePoolMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageMessage;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by AlanJager on 2017/9/4.
@@ -17,6 +18,7 @@
method = HttpMethod.PUT,
responseClass = APIUpdateCephPrimaryStoragePoolEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateCephPrimaryStoragePoolMsg extends APIMessage implements PrimaryStorageMessage {
@APINoSee
private String primaryStorageUuid;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIAddResourcesToDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIAddResourcesToDirectoryMsg.java
index 0c8728555b1..98b873f482a 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIAddResourcesToDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIAddResourcesToDirectoryMsg.java
@@ -10,6 +10,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -21,6 +22,7 @@
responseClass = APIAddResourcesToDirectoryEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddResourcesToDirectoryMsg extends APIMessage implements DirectoryMessage {
@APIParam(resourceType = ResourceVO.class, nonempty = true)
private List resourceUuids;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APICreateDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APICreateDirectoryMsg.java
index fc2dfefddf0..a4aacc96022 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APICreateDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APICreateDirectoryMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.zone.ZoneVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -16,6 +17,7 @@
responseClass = APICreateDirectoryEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateDirectoryMsg extends APICreateMessage implements OperateDirectoryMessage {
@APIParam(maxLength = 255)
private String name;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIDeleteDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIDeleteDirectoryMsg.java
index ba650511b47..80a63bf88ad 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIDeleteDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIDeleteDirectoryMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -14,6 +15,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteDirectoryEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteDirectoryMsg extends APIDeleteMessage implements DirectoryMessage, OperateDirectoryMessage {
@APIParam(resourceType = DirectoryVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIMoveDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIMoveDirectoryMsg.java
index c850db04ec5..d0f45b2f916 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIMoveDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIMoveDirectoryMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -16,6 +17,7 @@
isAction = true,
responseClass = APIMoveDirectoryEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIMoveDirectoryMsg extends APIMessage implements DirectoryMessage, OperateDirectoryMessage {
@APIParam(resourceType = DirectoryVO.class)
private String targetParentUuid;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIMoveResourcesToDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIMoveResourcesToDirectoryMsg.java
index 20ccb1ad421..efc5c214fa9 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIMoveResourcesToDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIMoveResourcesToDirectoryMsg.java
@@ -9,6 +9,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -20,6 +21,7 @@
isAction = true,
responseClass = APIMoveResourcesToDirectoryEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIMoveResourcesToDirectoryMsg extends APIMessage implements DirectoryMessage {
@APIParam(resourceType = ResourceVO.class, nonempty = true)
private List resourceUuids;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIQueryDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIQueryDirectoryMsg.java
index 98eb042d0e2..1c487008417 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIQueryDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIQueryDirectoryMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -20,6 +21,7 @@
method = HttpMethod.GET,
responseClass = APIQueryDirectoryReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryDirectoryMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIRemoveResourcesFromDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIRemoveResourcesFromDirectoryMsg.java
index 4adf9ac55a2..91a6966cdf8 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIRemoveResourcesFromDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIRemoveResourcesFromDirectoryMsg.java
@@ -9,6 +9,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -19,6 +20,7 @@
method = HttpMethod.DELETE,
responseClass = APIRemoveResourcesFromDirectoryEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveResourcesFromDirectoryMsg extends APIMessage implements DirectoryMessage{
@APIParam(resourceType = ResourceVO.class, nonempty = true)
private List resourceUuids;
diff --git a/plugin/directory/src/main/java/org/zstack/directory/APIUpdateDirectoryMsg.java b/plugin/directory/src/main/java/org/zstack/directory/APIUpdateDirectoryMsg.java
index 40ef5220240..4dc970503c9 100644
--- a/plugin/directory/src/main/java/org/zstack/directory/APIUpdateDirectoryMsg.java
+++ b/plugin/directory/src/main/java/org/zstack/directory/APIUpdateDirectoryMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author shenjin
@@ -15,6 +16,7 @@
isAction = true,
responseClass = APIUpdateDirectoryEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateDirectoryMsg extends APIMessage implements DirectoryMessage, OperateDirectoryMessage {
@APIParam(resourceType = DirectoryVO.class)
private String uuid;
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIAttachEipMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIAttachEipMsg.java
index db5e4c66f4c..bcd95b5a1a3 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIAttachEipMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIAttachEipMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.network.l3.UsedIpVO;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmNicVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -52,6 +53,7 @@
parameterName = "params",
responseClass = APIAttachEipEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAttachEipMsg extends APIMessage implements EipMessage {
/**
* @desc eip uuid
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIChangeEipStateMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIChangeEipStateMsg.java
index d69000dfd33..7f3c1c42bcd 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIChangeEipStateMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIChangeEipStateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -13,6 +14,7 @@
responseClass = APIChangeEipStateEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeEipStateMsg extends APIMessage implements EipMessage {
@APIParam(resourceType = EipVO.class)
private String uuid;
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APICreateEipMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APICreateEipMsg.java
index c6f2b1892f7..1c4d0256749 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APICreateEipMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APICreateEipMsg.java
@@ -10,6 +10,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmNicVO;
import org.zstack.network.service.vip.VipVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -61,6 +62,7 @@
responseClass = APICreateEipEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateEipMsg extends APICreateMessage implements APIAuditor {
/**
* @desc max length of 255 characters
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDeleteEipMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDeleteEipMsg.java
index bdbc1716caf..5c84cebdfce 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDeleteEipMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDeleteEipMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -48,6 +49,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteEipEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteEipMsg extends APIDeleteMessage implements EipMessage {
/**
* @desc eip uuid
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDetachEipMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDetachEipMsg.java
index 9e9e395efcd..5a2a00ba01d 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDetachEipMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIDetachEipMsg.java
@@ -12,6 +12,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -54,6 +55,7 @@
method = HttpMethod.DELETE,
responseClass = APIDetachEipEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDetachEipMsg extends APIMessage implements EipMessage, APIMultiAuditor {
/**
* @desc eip uuid
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetEipAttachableVmNicsMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetEipAttachableVmNicsMsg.java
index 0071a56552b..9564126812b 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetEipAttachableVmNicsMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetEipAttachableVmNicsMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIGetMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.network.service.vip.VipVO;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -13,6 +14,7 @@
method = HttpMethod.GET,
responseClass = APIGetEipAttachableVmNicsReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetEipAttachableVmNicsMsg extends APIGetMessage {
@APIParam(required = false, resourceType = EipVO.class)
private String eipUuid;
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetVmNicAttachableEipsMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetVmNicAttachableEipsMsg.java
index 2411397d534..5f353e034e2 100644
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetVmNicAttachableEipsMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIGetVmNicAttachableEipsMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.*;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/vm-instances/nics/{vmNicUuid}/candidate-eips",
method = HttpMethod.GET,
responseClass = APIGetVmNicAttachableEipsReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetVmNicAttachableEipsMsg extends APIGetMessage {
@APIParam(resourceType = VmNicVO.class)
private String vmNicUuid;
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIQueryEipMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIQueryEipMsg.java
index ebd46730ba8..97d1eaebc2b 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIQueryEipMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIQueryEipMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -18,6 +19,7 @@
method = HttpMethod.GET,
responseClass = APIQueryEipReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryEipMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIUpdateEipMsg.java b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIUpdateEipMsg.java
index 8ce5d76a833..bf489df5139 100755
--- a/plugin/eip/src/main/java/org/zstack/network/service/eip/APIUpdateEipMsg.java
+++ b/plugin/eip/src/main/java/org/zstack/network/service/eip/APIUpdateEipMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/15/2015.
@@ -14,6 +15,7 @@
method = HttpMethod.PUT,
responseClass = APIUpdateEipEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateEipMsg extends APIMessage implements EipMessage {
@APIParam(resourceType = EipVO.class)
private String uuid;
diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIChangeL3NetworkDhcpIpAddressMsg.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIChangeL3NetworkDhcpIpAddressMsg.java
index 5161c3c4fbf..6c486bcdec1 100644
--- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIChangeL3NetworkDhcpIpAddressMsg.java
+++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIChangeL3NetworkDhcpIpAddressMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.network.l3.L3NetworkMessage;
import org.zstack.header.network.l3.L3NetworkVO;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@Action(category = L3NetworkConstant.ACTION_CATEGORY)
@RestRequest(
@@ -16,6 +17,7 @@
isAction = true,
responseClass = APIChangeL3NetworkDhcpIpAddressEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeL3NetworkDhcpIpAddressMsg extends APIMessage implements L3NetworkMessage {
@APIParam(resourceType = L3NetworkVO.class, checkAccount = true, operationTarget = true)
private String l3NetworkUuid;
diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkDhcpIpAddressMsg.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkDhcpIpAddressMsg.java
index b379076b91a..f22577a3e63 100755
--- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkDhcpIpAddressMsg.java
+++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkDhcpIpAddressMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.network.l3.L3NetworkMessage;
import org.zstack.header.network.l3.L3NetworkVO;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by miao on 16-7-19.
@@ -15,6 +16,7 @@
method = HttpMethod.GET,
responseClass = APIGetL3NetworkDhcpIpAddressReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetL3NetworkDhcpIpAddressMsg extends APISyncCallMessage implements L3NetworkMessage {
@APIParam(resourceType = L3NetworkVO.class)
private String l3NetworkUuid;
diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkIpStatisticMsg.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkIpStatisticMsg.java
index 246e9912f97..b6ff0831f6f 100644
--- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkIpStatisticMsg.java
+++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/APIGetL3NetworkIpStatisticMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.rest.RestRequest;
import static org.zstack.network.service.flat.IpStatisticConstants.*;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by Qi Le on 2019/9/9
@@ -17,6 +18,7 @@
method = HttpMethod.GET,
responseClass = APIGetL3NetworkIpStatisticReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetL3NetworkIpStatisticMsg extends APISyncCallMessage implements L3NetworkMessage {
@APIParam(resourceType = L3NetworkVO.class)
private String l3NetworkUuid;
diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIChangeHostNetworkInterfaceLldpModeMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIChangeHostNetworkInterfaceLldpModeMsg.java
index 7ae12a108b6..31a37c1d982 100644
--- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIChangeHostNetworkInterfaceLldpModeMsg.java
+++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIChangeHostNetworkInterfaceLldpModeMsg.java
@@ -10,6 +10,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/hostNetworkInterface/lldp/actions",
@@ -17,6 +18,7 @@
responseClass = APIChangeHostNetworkInterfaceLldpModeEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeHostNetworkInterfaceLldpModeMsg extends APIMessage implements APIAuditor {
@APIParam(resourceType = HostNetworkInterfaceVO.class)
private List interfaceUuids;
diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIGetHostNetworkInterfaceLldpMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIGetHostNetworkInterfaceLldpMsg.java
index c6df5bfcf1a..9359653413c 100644
--- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIGetHostNetworkInterfaceLldpMsg.java
+++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIGetHostNetworkInterfaceLldpMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.network.hostNetworkInterface.HostNetworkInterfaceVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/hostNetworkInterface/lldp/{interfaceUuid}/info",
method = HttpMethod.GET,
responseClass = APIGetHostNetworkInterfaceLldpReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetHostNetworkInterfaceLldpMsg extends APISyncCallMessage {
@APIParam(resourceType = HostNetworkInterfaceVO.class)
private String interfaceUuid;
diff --git a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIQueryHostNetworkInterfaceLldpMsg.java b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIQueryHostNetworkInterfaceLldpMsg.java
index 14b999bee6c..667a9365946 100644
--- a/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIQueryHostNetworkInterfaceLldpMsg.java
+++ b/plugin/hostNetworkInterface/src/main/java/org/zstack/network/hostNetworkInterface/lldp/api/APIQueryHostNetworkInterfaceLldpMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryHostNetworkInterfaceLldpReply.class, inventoryClass = HostNetworkInterfaceLldpInventory.class)
@RestRequest(
@@ -17,6 +18,7 @@
method = HttpMethod.GET,
responseClass = APIQueryHostNetworkInterfaceLldpReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryHostNetworkInterfaceLldpMsg extends APIQueryMessage {
public static List __example__() {
return asList();
diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/APIAddKVMHostMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/APIAddKVMHostMsg.java
index c41b987e323..2ce9cd43c26 100755
--- a/plugin/kvm/src/main/java/org/zstack/kvm/APIAddKVMHostMsg.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/APIAddKVMHostMsg.java
@@ -11,6 +11,7 @@
import org.zstack.header.tag.TagResourceType;
import java.util.concurrent.TimeUnit;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -68,6 +69,7 @@
responseClass = APIAddHostEvent.class
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 3)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddKVMHostMsg extends APIAddHostMsg implements AddKVMHostMessage {
/**
* @desc user name used for ssh login.
diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/APIKvmRunShellMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/APIKvmRunShellMsg.java
index 97a48f0fac4..8b99c5a097c 100755
--- a/plugin/kvm/src/main/java/org/zstack/kvm/APIKvmRunShellMsg.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/APIKvmRunShellMsg.java
@@ -8,6 +8,7 @@
import java.util.HashSet;
import java.util.Set;
+import org.zstack.header.vm.MetadataImpact;
@@ -20,6 +21,7 @@
method = HttpMethod.PUT,
responseClass = APIKvmRunShellEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIKvmRunShellMsg extends APIMessage {
@APIParam(resourceType = HostVO.class, nonempty = true)
private Set hostUuids;
diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/APIUpdateKVMHostMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/APIUpdateKVMHostMsg.java
index 27f33df1597..54050f2e2f7 100755
--- a/plugin/kvm/src/main/java/org/zstack/kvm/APIUpdateKVMHostMsg.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/APIUpdateKVMHostMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.log.NoLogging;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/15/2015.
@@ -16,6 +17,7 @@
responseClass = APIUpdateHostEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateKVMHostMsg extends APIUpdateHostMsg {
@APIParam(maxLength = 255, required = false, emptyString = false)
private String username;
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 92e76ede2c5..51e3c4f1dee 100755
--- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java
@@ -4716,4 +4716,20 @@ public void setMemoryUsage(long memoryUsage) {
this.memoryUsage = memoryUsage;
}
}
+
+ public static class WriteVmInstanceMetadataCmd extends AgentCommand {
+ public String metadata;
+ public String metadataPath;
+ }
+
+ public static class WriteVmInstanceMetadataRsp extends AgentResponse {
+ }
+
+ public static class ReadVmInstanceMetadataCmd extends AgentCommand {
+ public String metadataPath;
+ }
+
+ public static class ReadVmInstanceMetadataRsp extends AgentResponse {
+ public String metadata;
+ }
}
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 7cd78c36c93..6c845676ca8 100755
--- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java
@@ -86,6 +86,9 @@ public interface KVMConstant {
String CLEAN_FIRMWARE_FLASH = "/clean/firmware/flash";
String FSTRIM_VM_PATH = "/vm/fstrim";
+ String WRITE_VM_INSTANCE_METADATA_PATH = "/vm/metadata/write";
+ String READ_VM_INSTANCE_METADATA_PATH = "/vm/metadata/read";
+
String ISO_TO = "kvm.isoto";
String ANSIBLE_PLAYBOOK_NAME = "kvm.py";
String ANSIBLE_MODULE_PATH = "ansible/kvm";
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 23d7b1cfe47..86a19c60b2f 100755
--- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java
@@ -230,6 +230,8 @@ public class KVMHost extends HostBase implements Host {
private String fileDownloadPath;
private String fileUploadPath;
private String fileDownloadProgressPath;
+ private String writeVmInstanceMetadataPath;
+ private String readVmInstanceMetadataPath;
public KVMHost(KVMHostVO self, KVMHostContext context) {
super(self);
@@ -480,6 +482,14 @@ public KVMHost(KVMHostVO self, KVMHostContext context) {
ub = UriComponentsBuilder.fromHttpUrl(baseUrl);
ub.path(KVMConstant.KVM_HOST_FILE_DOWNLOAD_PROGRESS_PATH);
fileDownloadProgressPath = ub.build().toString();
+
+ ub = UriComponentsBuilder.fromHttpUrl(baseUrl);
+ ub.path(KVMConstant.WRITE_VM_INSTANCE_METADATA_PATH);
+ writeVmInstanceMetadataPath = ub.build().toString();
+
+ ub = UriComponentsBuilder.fromHttpUrl(baseUrl);
+ ub.path(KVMConstant.READ_VM_INSTANCE_METADATA_PATH);
+ readVmInstanceMetadataPath = ub.build().toString();
}
static {
@@ -738,6 +748,10 @@ protected void handleLocalMessage(Message msg) {
handle((GetFileDownloadProgressMsg) msg);
} else if (msg instanceof RestartKvmAgentMsg) {
handle((RestartKvmAgentMsg) msg);
+ } else if (msg instanceof UpdateVmInstanceMetadataOnHypervisorMsg) {
+ handle((UpdateVmInstanceMetadataOnHypervisorMsg) msg);
+ } else if (msg instanceof ReadVmInstanceMetadataOnHypervisorMsg) {
+ handle((ReadVmInstanceMetadataOnHypervisorMsg) msg);
} else {
super.handleLocalMessage(msg);
}
@@ -7309,4 +7323,77 @@ public void fail(ErrorCode errorCode) {
}
});
}
+
+ private void handle(UpdateVmInstanceMetadataOnHypervisorMsg msg) {
+ inQueue().name(String.format("update-vmInstance-metadata-on-host-%s", self.getUuid()))
+ .asyncBackup(msg)
+ .run(chain -> updateVmInstanceMetadata(msg, new NoErrorCompletion(chain) {
+ @Override
+ public void done() {
+ chain.next();
+ }
+ }));
+ }
+
+ private void updateVmInstanceMetadata(final UpdateVmInstanceMetadataOnHypervisorMsg msg, final NoErrorCompletion completion) {
+ UpdateVmInstanceMetadataOnHypervisorReply reply = new UpdateVmInstanceMetadataOnHypervisorReply();
+
+ checkStatus();
+ WriteVmInstanceMetadataCmd cmd = new WriteVmInstanceMetadataCmd();
+ cmd.metadata = msg.getMetadata();
+ cmd.metadataPath = msg.getMetadataPath();
+ new Http<>(writeVmInstanceMetadataPath, cmd, WriteVmInstanceMetadataRsp.class).call(new ReturnValueCompletion(msg) {
+ @Override
+ public void success(WriteVmInstanceMetadataRsp ret) {
+ if (!ret.isSuccess()) {
+ reply.setError(operr("operation error, because:%s", ret.getError()));
+ }
+ bus.reply(msg, reply);
+ completion.done();
+ }
+
+ @Override
+ public void fail(ErrorCode errorCode) {
+ reply.setError(errorCode);
+ bus.reply(msg, reply);
+ completion.done();
+ }
+ });
+ }
+
+ private void handle(ReadVmInstanceMetadataOnHypervisorMsg msg) {
+ inQueue().name(String.format("readVmInstanceMetadata-on-host-%s", self.getUuid()))
+ .asyncBackup(msg)
+ .run(chain -> readVmInstanceMetadata(msg, new NoErrorCompletion(chain) {
+ @Override
+ public void done() {
+ chain.next();
+ }
+ }));
+ }
+
+ private void readVmInstanceMetadata(final ReadVmInstanceMetadataOnHypervisorMsg msg, final NoErrorCompletion completion) {
+ checkStatus();
+ ReadVmInstanceMetadataOnHypervisorReply reply = new ReadVmInstanceMetadataOnHypervisorReply();
+ ReadVmInstanceMetadataCmd cmd = new ReadVmInstanceMetadataCmd();
+ cmd.metadataPath = msg.getMetadataPath();
+ new Http<>(readVmInstanceMetadataPath, cmd, ReadVmInstanceMetadataRsp.class).call(new ReturnValueCompletion(msg) {
+ @Override
+ public void success(ReadVmInstanceMetadataRsp rsp) {
+ if (!rsp.isSuccess()) {
+ reply.setError(operr("operation error, because:%s", rsp.getError()));
+ }
+ reply.setMetadata(rsp.metadata);
+ bus.reply(msg, reply);
+ completion.done();
+ }
+
+ @Override
+ public void fail(ErrorCode errorCode) {
+ reply.setError(errorCode);
+ bus.reply(msg, reply);
+ completion.done();
+ }
+ });
+ }
}
diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryHostOsCategoryMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryHostOsCategoryMsg.java
index 4a255faae38..7b7b00d593a 100644
--- a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryHostOsCategoryMsg.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryHostOsCategoryMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryHostOsCategoryReply.class, inventoryClass = HostOsCategoryInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
responseClass = APIQueryHostOsCategoryReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryHostOsCategoryMsg extends APIQueryMessage {
public static List __example__() {
return asList("architecture=x86_64", "osReleaseVersion=\"centos core 7.6.1810\"");
diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryKvmHypervisorInfoMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryKvmHypervisorInfoMsg.java
index 341d33691fb..03f519d009d 100644
--- a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryKvmHypervisorInfoMsg.java
+++ b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/message/APIQueryKvmHypervisorInfoMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by Wenhao.Zhang on 23/02/23
@@ -19,6 +20,7 @@
responseClass = APIQueryKvmHypervisorInfoReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryKvmHypervisorInfoMsg extends APIQueryMessage {
public static List __example__() {
return asList("uuid=" + uuid());
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIAddLdapServerMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIAddLdapServerMsg.java
index a9b7c2958a4..a433487eb64 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIAddLdapServerMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIAddLdapServerMsg.java
@@ -13,6 +13,7 @@
import org.zstack.ldap.entity.LdapEncryptionType;
import org.zstack.ldap.entity.LdapServerType;
import org.zstack.ldap.entity.LdapServerVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ldap/servers",
@@ -20,6 +21,7 @@
responseClass = APIAddLdapServerEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddLdapServerMsg extends APIMessage implements APIAuditor {
@APIParam(maxLength = 255)
private String name;
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APICreateLdapBindingMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APICreateLdapBindingMsg.java
index f75cb6fe8b7..0db4ed54254 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APICreateLdapBindingMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APICreateLdapBindingMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.ldap.entity.LdapServerVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ldap/bindings",
@@ -13,6 +14,7 @@
parameterName = "params",
responseClass = APICreateLdapBindingEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateLdapBindingMsg extends APIMessage {
@APIParam(maxLength = 255)
private String ldapUid;
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapBindingMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapBindingMsg.java
index e4584014dd7..461b7821852 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapBindingMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapBindingMsg.java
@@ -6,12 +6,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ldap/bindings/{accountUuid}",
method = HttpMethod.DELETE,
responseClass = APIDeleteLdapBindingEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteLdapBindingMsg extends APIMessage {
@APIParam(resourceType = AccountVO.class)
private String accountUuid;
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapServerMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapServerMsg.java
index 7df708dcd7b..384f2ca70dc 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapServerMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIDeleteLdapServerMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static org.zstack.utils.CollectionDSL.list;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
@@ -16,6 +17,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteLdapServerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteLdapServerMsg extends APIDeleteMessage {
@APIParam(resourceType = LdapServerVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetCandidateLdapEntryForBindingMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetCandidateLdapEntryForBindingMsg.java
index 4ecb8424b5f..1c3ef26fd53 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetCandidateLdapEntryForBindingMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetCandidateLdapEntryForBindingMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.ldap.entity.LdapServerVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by lining on 2017/12/03.
@@ -14,6 +15,7 @@
method = HttpMethod.GET,
responseClass = APIGetLdapEntryReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetCandidateLdapEntryForBindingMsg extends APISyncCallMessage {
@APIParam
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetLdapEntryMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetLdapEntryMsg.java
index b63b0ebd0d1..1dd8b8659ac 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetLdapEntryMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIGetLdapEntryMsg.java
@@ -7,6 +7,7 @@
import org.zstack.ldap.entity.LdapServerVO;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by lining on 2017/11/03.
@@ -16,6 +17,7 @@
method = HttpMethod.GET,
responseClass = APIGetLdapEntryReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetLdapEntryMsg extends APISyncCallMessage {
@APIParam
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIQueryLdapServerMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIQueryLdapServerMsg.java
index 14a2420bd4f..ddad92393a8 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIQueryLdapServerMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIQueryLdapServerMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryLdapServerReply.class, inventoryClass = LdapServerInventory.class)
@RestRequest(
@@ -17,6 +18,7 @@
method = HttpMethod.GET,
responseClass = APIQueryLdapServerReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryLdapServerMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APISyncAccountsFromLdapServerMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APISyncAccountsFromLdapServerMsg.java
index cacfa93e8f0..f115714037b 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APISyncAccountsFromLdapServerMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APISyncAccountsFromLdapServerMsg.java
@@ -7,6 +7,7 @@
import org.zstack.identity.imports.entity.SyncCreatedAccountStrategy;
import org.zstack.identity.imports.entity.SyncDeletedAccountStrategy;
import org.zstack.ldap.entity.LdapServerVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by Wenhao.Zhang on 2024/06/04
@@ -17,6 +18,7 @@
isAction = true,
responseClass = APISyncAccountsFromLdapServerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APISyncAccountsFromLdapServerMsg extends APIMessage {
@APIParam(resourceType = LdapServerVO.class)
private String uuid;
diff --git a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIUpdateLdapServerMsg.java b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIUpdateLdapServerMsg.java
index bd49f0ff93b..cf2aeab291f 100644
--- a/plugin/ldap/src/main/java/org/zstack/ldap/api/APIUpdateLdapServerMsg.java
+++ b/plugin/ldap/src/main/java/org/zstack/ldap/api/APIUpdateLdapServerMsg.java
@@ -10,6 +10,7 @@
import org.zstack.ldap.entity.LdapEncryptionType;
import org.zstack.ldap.entity.LdapServerType;
import org.zstack.ldap.entity.LdapServerVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ldap/servers/{ldapServerUuid}",
@@ -17,6 +18,7 @@
responseClass = APIUpdateLdapServerEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateLdapServerMsg extends APIMessage {
@APIParam(maxLength = 32, resourceType = LdapServerVO.class)
private String ldapServerUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddAccessControlListToLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddAccessControlListToLoadBalancerMsg.java
index f2394de1ac2..dcfa08216da 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddAccessControlListToLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddAccessControlListToLoadBalancerMsg.java
@@ -1,94 +1,96 @@
-package org.zstack.network.service.lb;
-
-import org.springframework.http.HttpMethod;
-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.APINoSee;
-import org.zstack.header.rest.RestRequest;
-import org.zstack.header.acl.AccessControlListVO;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-11
- **/
-@RestRequest(
- path = "/load-balancers/listeners/{listenerUuid}/access-control-lists",
- method = HttpMethod.POST,
- parameterName = "params",
- responseClass = APIAddAccessControlListToLoadBalancerEvent.class
-)
-public class APIAddAccessControlListToLoadBalancerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
- @APIParam(resourceType = AccessControlListVO.class, nonempty = true)
- private List aclUuids;
- @APIParam(validValues = {"white","black","redirect"})
- private String aclType;
- @APIParam(resourceType = LoadBalancerListenerVO.class)
- private String listenerUuid;
- @APIParam(resourceType = LoadBalancerServerGroupVO.class, required = false)
- private List serverGroupUuids;
- @APINoSee
- private String loadBalancerUuid;
-
-
- public List getAclUuids() {
- return aclUuids;
- }
-
- public void setAclUuids(List aclUuids) {
- this.aclUuids = aclUuids;
- }
-
- public String getAclType() {
- return aclType;
- }
-
- public void setAclType(String aclType) {
- this.aclType = aclType;
- }
-
- public String getListenerUuid() {
- return listenerUuid;
- }
-
- public void setListenerUuid(String listenerUuid) {
- this.listenerUuid = listenerUuid;
- }
-
- public List getServerGroupUuids() {
- return serverGroupUuids;
- }
-
- public void setServerGroupUuids(List serverGroupUuids) {
- this.serverGroupUuids = serverGroupUuids;
- }
-
- @Override
- public String getLoadBalancerUuid() {
- return loadBalancerUuid;
- }
-
- public void setLoadBalancerUuid(String loadBalancerUuid) {
- this.loadBalancerUuid = loadBalancerUuid;
- }
-
- public static APIAddAccessControlListToLoadBalancerMsg __example__() {
- APIAddAccessControlListToLoadBalancerMsg msg = new APIAddAccessControlListToLoadBalancerMsg();
-
- msg.setAclUuids(Arrays.asList(uuid()));
- msg.setListenerUuid(uuid());
- msg.setLoadBalancerUuid(uuid());
- msg.setAclType(LoadBalancerAclType.black.toString());
-
- return msg;
- }
-
- @Override
- public APIAuditor.Result audit(APIMessage msg, APIEvent rsp) {
- return new Result(((APIAddAccessControlListToLoadBalancerMsg)msg).getLoadBalancerUuid(), LoadBalancerVO.class);
- }
+package org.zstack.network.service.lb;
+
+import org.springframework.http.HttpMethod;
+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.APINoSee;
+import org.zstack.header.rest.RestRequest;
+import org.zstack.header.acl.AccessControlListVO;
+
+import java.util.Arrays;
+import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-11
+ **/
+@RestRequest(
+ path = "/load-balancers/listeners/{listenerUuid}/access-control-lists",
+ method = HttpMethod.POST,
+ parameterName = "params",
+ responseClass = APIAddAccessControlListToLoadBalancerEvent.class
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIAddAccessControlListToLoadBalancerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
+ @APIParam(resourceType = AccessControlListVO.class, nonempty = true)
+ private List aclUuids;
+ @APIParam(validValues = {"white","black","redirect"})
+ private String aclType;
+ @APIParam(resourceType = LoadBalancerListenerVO.class)
+ private String listenerUuid;
+ @APIParam(resourceType = LoadBalancerServerGroupVO.class, required = false)
+ private List serverGroupUuids;
+ @APINoSee
+ private String loadBalancerUuid;
+
+
+ public List getAclUuids() {
+ return aclUuids;
+ }
+
+ public void setAclUuids(List aclUuids) {
+ this.aclUuids = aclUuids;
+ }
+
+ public String getAclType() {
+ return aclType;
+ }
+
+ public void setAclType(String aclType) {
+ this.aclType = aclType;
+ }
+
+ public String getListenerUuid() {
+ return listenerUuid;
+ }
+
+ public void setListenerUuid(String listenerUuid) {
+ this.listenerUuid = listenerUuid;
+ }
+
+ public List getServerGroupUuids() {
+ return serverGroupUuids;
+ }
+
+ public void setServerGroupUuids(List serverGroupUuids) {
+ this.serverGroupUuids = serverGroupUuids;
+ }
+
+ @Override
+ public String getLoadBalancerUuid() {
+ return loadBalancerUuid;
+ }
+
+ public void setLoadBalancerUuid(String loadBalancerUuid) {
+ this.loadBalancerUuid = loadBalancerUuid;
+ }
+
+ public static APIAddAccessControlListToLoadBalancerMsg __example__() {
+ APIAddAccessControlListToLoadBalancerMsg msg = new APIAddAccessControlListToLoadBalancerMsg();
+
+ msg.setAclUuids(Arrays.asList(uuid()));
+ msg.setListenerUuid(uuid());
+ msg.setLoadBalancerUuid(uuid());
+ msg.setAclType(LoadBalancerAclType.black.toString());
+
+ return msg;
+ }
+
+ @Override
+ public APIAuditor.Result audit(APIMessage msg, APIEvent rsp) {
+ return new Result(((APIAddAccessControlListToLoadBalancerMsg)msg).getLoadBalancerUuid(), LoadBalancerVO.class);
+ }
}
\ No newline at end of file
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddBackendServerToServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddBackendServerToServerGroupMsg.java
index 83242bc3ddd..0de5248d046 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddBackendServerToServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddBackendServerToServerGroupMsg.java
@@ -12,6 +12,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/servergroups/{serverGroupUuid}/backendservers",
@@ -19,6 +20,7 @@
parameterName = "params",
responseClass = APIAddBackendServerToServerGroupEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddBackendServerToServerGroupMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, nonempty = true)
private String serverGroupUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddCertificateToLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddCertificateToLoadBalancerListenerMsg.java
index aac6993595b..6e57c0ff4c3 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddCertificateToLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddCertificateToLoadBalancerListenerMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin on 03/26/2018.
@@ -17,6 +18,7 @@
parameterName = "params",
responseClass = APIAddCertificateToLoadBalancerListenerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddCertificateToLoadBalancerListenerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = CertificateVO.class, nonempty = true)
private String certificateUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddServerGroupToLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddServerGroupToLoadBalancerListenerMsg.java
index 7fddac65a13..47fb397b922 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddServerGroupToLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddServerGroupToLoadBalancerListenerMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/listeners/{listenerUuid}/servergroups",
@@ -14,6 +15,7 @@
parameterName = "params",
responseClass = APIAddServerGroupToLoadBalancerListenerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddServerGroupToLoadBalancerListenerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, nonempty = true)
private String serverGroupUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddVmNicToLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddVmNicToLoadBalancerMsg.java
index 542cd189b96..fd171fbbb19 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddVmNicToLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIAddVmNicToLoadBalancerMsg.java
@@ -11,6 +11,7 @@
import java.util.Arrays;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/8/2015.
@@ -21,6 +22,7 @@
parameterName = "params",
responseClass = APIAddVmNicToLoadBalancerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddVmNicToLoadBalancerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = VmNicVO.class, nonempty = true)
private List vmNicUuids;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeAccessControlListServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeAccessControlListServerGroupMsg.java
index 89a331b1b43..baafa9be997 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeAccessControlListServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeAccessControlListServerGroupMsg.java
@@ -11,6 +11,7 @@
import java.util.Arrays;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/listener/acl/{aclUuid}/servergroup/actions",
@@ -18,6 +19,7 @@
responseClass = APIChangeAccessControlListServerGroupEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeAccessControlListServerGroupMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, nonempty = true)
private List serverGroupUuids;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerBackendServerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerBackendServerMsg.java
index 2a65370f874..6fb5efc1a95 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerBackendServerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIChangeLoadBalancerBackendServerMsg.java
@@ -12,6 +12,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/servergroups/{serverGroupUuid}/backendserver/actions",
@@ -19,6 +20,7 @@
responseClass = APIChangeLoadBalancerBackendServerEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeLoadBalancerBackendServerMsg extends APIMessage implements LoadBalancerMessage , APIAuditor{
@APIParam(resourceType = LoadBalancerServerGroupVO.class, nonempty = true)
private String serverGroupUuid;
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 29510850bc8..246511e90e3 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
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin.ruan on 02/25/2019.
@@ -15,6 +16,7 @@
responseClass = APIChangeLoadBalancerListenerEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeLoadBalancerListenerMsg extends APIMessage implements LoadBalancerListenerMsg , LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerListenerVO.class)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateCertificateMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateCertificateMsg.java
index 24d1b19bb26..c882b81d3c1 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateCertificateMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateCertificateMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin on 03/22/2018.
@@ -19,6 +20,7 @@
responseClass = APICreateCertificateEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateCertificateMsg extends APICreateMessage implements APIAuditor {
@APIParam(maxLength = 255)
private String name;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerListenerMsg.java
index aa1be52f2bf..9cd3c6b1035 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerListenerMsg.java
@@ -11,6 +11,7 @@
import org.zstack.header.acl.AccessControlListVO;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/8/2015.
@@ -22,6 +23,7 @@
responseClass = APICreateLoadBalancerListenerEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateLoadBalancerListenerMsg extends APICreateMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = LoadBalancerVO.class)
private String loadBalancerUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerMsg.java
index bb6d5a40dc9..f6c906e90d8 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.tag.TagResourceType;
import org.zstack.network.service.vip.VipVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/8/2015.
@@ -20,6 +21,7 @@
responseClass = APICreateLoadBalancerEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateLoadBalancerMsg extends APICreateMessage implements APIAuditor {
@APIParam(maxLength = 255)
private String name;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerServerGroupMsg.java
index 7edfa76d81c..eb942b35431 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APICreateLoadBalancerServerGroupMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
@TagResourceType(LoadBalancerVO.class)
@RestRequest(
@@ -17,6 +18,8 @@
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+
public class APICreateLoadBalancerServerGroupMsg extends APICreateMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(maxLength = 255)
private String name;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteCertificateMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteCertificateMsg.java
index 169007b239a..e1faececcf9 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteCertificateMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteCertificateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin on 03/22/2015.
@@ -13,6 +14,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteCertificateEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteCertificateMsg extends APIDeleteMessage {
@APIParam(resourceType = CertificateVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerListenerMsg.java
index b849a1ab437..b71d57c1476 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerListenerMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/8/2015.
@@ -16,6 +17,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteLoadBalancerListenerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteLoadBalancerListenerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APINoSee
private String loadBalancerUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerMsg.java
index 320550f1e73..70c9e52ad5a 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/8/2015.
@@ -13,6 +14,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteLoadBalancerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteLoadBalancerMsg extends APIDeleteMessage implements LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerServerGroupMsg.java
index 96c6e5f3c2c..e0260187938 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIDeleteLoadBalancerServerGroupMsg.java
@@ -7,12 +7,14 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/servergroups/{uuid}",
method = HttpMethod.DELETE,
responseClass = APIDeleteLoadBalancerServerGroupEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteLoadBalancerServerGroupMsg extends APIMessage implements LoadBalancerMessage, APIAuditor{
@APIParam(resourceType = LoadBalancerServerGroupVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForLoadBalancerMsg.java
index 622cf935176..bdf3cfe34a0 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForLoadBalancerMsg.java
@@ -1,49 +1,51 @@
-package org.zstack.network.service.lb;
-
-import org.springframework.http.HttpMethod;
-import org.zstack.header.message.APIGetMessage;
-import org.zstack.header.message.APIParam;
-import org.zstack.header.rest.APINoSee;
-import org.zstack.header.rest.RestRequest;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-04-15
- **/
-@RestRequest(
- path = "/load-balancers/listeners/{listenerUuid}/networks/candidates",
- method = HttpMethod.GET,
- responseClass = APIGetCandidateL3NetworksForLoadBalancerReply.class
-)
-public class APIGetCandidateL3NetworksForLoadBalancerMsg extends APIGetMessage implements LoadBalancerMessage {
- @APIParam(resourceType = LoadBalancerListenerVO.class)
- private String listenerUuid;
- @APINoSee
- private String loadBalancerUuid;
-
- public String getListenerUuid() {
- return listenerUuid;
- }
-
- public void setListenerUuid(String listenerUuid) {
- this.listenerUuid = listenerUuid;
- }
-
- public String getLoadBalancerUuid() {
- return loadBalancerUuid;
- }
-
- public void setLoadBalancerUuid(String loadBalancerUuid) {
- this.loadBalancerUuid = loadBalancerUuid;
- }
-
-
- public static APIGetCandidateL3NetworksForLoadBalancerMsg __example__() {
- APIGetCandidateL3NetworksForLoadBalancerMsg msg = new APIGetCandidateL3NetworksForLoadBalancerMsg();
-
- msg.setListenerUuid(uuid());
- msg.setLoadBalancerUuid(uuid());
-
- return msg;
- }
-}
+package org.zstack.network.service.lb;
+
+import org.springframework.http.HttpMethod;
+import org.zstack.header.message.APIGetMessage;
+import org.zstack.header.message.APIParam;
+import org.zstack.header.rest.APINoSee;
+import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-04-15
+ **/
+@RestRequest(
+ path = "/load-balancers/listeners/{listenerUuid}/networks/candidates",
+ method = HttpMethod.GET,
+ responseClass = APIGetCandidateL3NetworksForLoadBalancerReply.class
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIGetCandidateL3NetworksForLoadBalancerMsg extends APIGetMessage implements LoadBalancerMessage {
+ @APIParam(resourceType = LoadBalancerListenerVO.class)
+ private String listenerUuid;
+ @APINoSee
+ private String loadBalancerUuid;
+
+ public String getListenerUuid() {
+ return listenerUuid;
+ }
+
+ public void setListenerUuid(String listenerUuid) {
+ this.listenerUuid = listenerUuid;
+ }
+
+ public String getLoadBalancerUuid() {
+ return loadBalancerUuid;
+ }
+
+ public void setLoadBalancerUuid(String loadBalancerUuid) {
+ this.loadBalancerUuid = loadBalancerUuid;
+ }
+
+
+ public static APIGetCandidateL3NetworksForLoadBalancerMsg __example__() {
+ APIGetCandidateL3NetworksForLoadBalancerMsg msg = new APIGetCandidateL3NetworksForLoadBalancerMsg();
+
+ msg.setListenerUuid(uuid());
+ msg.setLoadBalancerUuid(uuid());
+
+ return msg;
+ }
+}
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForServerGroupMsg.java
index 0fa9672f454..fbb52384ee8 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateL3NetworksForServerGroupMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIGetMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author: sulin.sheng
@@ -14,6 +15,7 @@
method = HttpMethod.GET,
responseClass = APIGetCandidateL3NetworksForServerGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetCandidateL3NetworksForServerGroupMsg extends APIGetMessage implements LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, required = false)
private String serverGroupUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerMsg.java
index 476934c2c7a..9f821d3e782 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2016/11/29.
@@ -14,6 +15,7 @@
method = HttpMethod.GET,
responseClass = APIGetCandidateVmNicsForLoadBalancerReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetCandidateVmNicsForLoadBalancerMsg extends APISyncCallMessage implements LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerListenerVO.class)
private String listenerUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerServerGroupMsg.java
index f1ae880e7cf..76756a13e6c 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetCandidateVmNicsForLoadBalancerServerGroupMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin.ruan on 2020/11/09.
@@ -13,6 +14,7 @@
method = HttpMethod.GET,
responseClass = APIGetCandidateVmNicsForLoadBalancerServerGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetCandidateVmNicsForLoadBalancerServerGroupMsg extends APISyncCallMessage implements LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, required = false)
private String servergroupUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesMsg.java
index 6d3676ce75e..6a235fe412c 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIGetLoadBalancerListenerACLEntriesMsg.java
@@ -7,12 +7,14 @@
import org.zstack.header.rest.RestRequest;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/listeners/access-control-lists/entries",
method = HttpMethod.GET,
responseClass = APIGetLoadBalancerListenerACLEntriesReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetLoadBalancerListenerACLEntriesMsg extends APISyncCallMessage {
@APIParam(resourceType = LoadBalancerListenerVO.class, required = false)
private List listenerUuids;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryCertificateMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryCertificateMsg.java
index b905adac0a4..a21ad5dc96b 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryCertificateMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryCertificateMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin on 03/22/2018.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryCertificateReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryCertificateMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerListenerMsg.java
index eedd2bb71ed..59d0eebb766 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerListenerMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/18/2015.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryLoadBalancerListenerReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryLoadBalancerListenerMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerMsg.java
index 049ad614fd9..7a0a4880024 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/18/2015.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryLoadBalancerReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryLoadBalancerMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerServerGroupMsg.java
index c3d960e497c..997f9ca1585 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIQueryLoadBalancerServerGroupMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryLoadBalancerServerGroupReply.class, inventoryClass = LoadBalancerServerGroupInventory.class)
@RestRequest(
path = "/load-balancers/servergroups",
@@ -15,6 +16,7 @@
method = HttpMethod.GET,
responseClass = APIQueryLoadBalancerServerGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryLoadBalancerServerGroupMsg extends APIQueryMessage{
public static List __example__() {
return asList();
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRefreshLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRefreshLoadBalancerMsg.java
index 80fa49835cf..4761eae0b8b 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRefreshLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRefreshLoadBalancerMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/18/2015.
@@ -14,6 +15,7 @@
responseClass = APIRefreshLoadBalancerEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRefreshLoadBalancerMsg extends APIMessage implements LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerVO.class)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveAccessControlListFromLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveAccessControlListFromLoadBalancerMsg.java
index b10c52920f8..e41662b9c76 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveAccessControlListFromLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveAccessControlListFromLoadBalancerMsg.java
@@ -1,81 +1,83 @@
-package org.zstack.network.service.lb;
-
-import org.springframework.http.HttpMethod;
-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.APINoSee;
-import org.zstack.header.rest.RestRequest;
-import org.zstack.header.acl.AccessControlListVO;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author: zhanyong.miao
- * @date: 2020-03-11
- **/
-@RestRequest(
- path = "/load-balancers/listeners/{listenerUuid}/access-control-lists",
- method = HttpMethod.DELETE,
- responseClass = APIRemoveAccessControlListFromLoadBalancerEvent.class
-)
-public class APIRemoveAccessControlListFromLoadBalancerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
- @APIParam(resourceType = AccessControlListVO.class, nonempty = true)
- private List aclUuids;
- @APINoSee
- private String loadBalancerUuid;
- @APIParam(resourceType = LoadBalancerListenerVO.class)
- private String listenerUuid;
-
- @APIParam(required = false, resourceType = LoadBalancerServerGroupVO.class)
- private List serverGroupUuids;
-
- public List getAclUuids() {
- return aclUuids;
- }
-
- public void setAclUuids(List aclUuids) {
- this.aclUuids = aclUuids;
- }
-
- public String getListenerUuid() {
- return listenerUuid;
- }
-
- public void setListenerUuid(String listenerUuid) {
- this.listenerUuid = listenerUuid;
- }
-
- public List getServerGroupUuids() {
- return serverGroupUuids;
- }
-
- public void setServerGroupUuids(List serverGroupUuids) {
- this.serverGroupUuids = serverGroupUuids;
- }
-
- @Override
- public String getLoadBalancerUuid() {
- return loadBalancerUuid;
- }
-
- public void setLoadBalancerUuid(String loadBalancerUuid) {
- this.loadBalancerUuid = loadBalancerUuid;
- }
-
- public static APIRemoveAccessControlListFromLoadBalancerMsg __example__() {
- APIRemoveAccessControlListFromLoadBalancerMsg msg = new APIRemoveAccessControlListFromLoadBalancerMsg();
-
- msg.setListenerUuid(uuid());
- msg.setAclUuids(Arrays.asList(uuid()));
-
- return msg;
- }
-
- @Override
- public Result audit(APIMessage msg, APIEvent rsp) {
- return new Result(((APIRemoveAccessControlListFromLoadBalancerMsg)msg).loadBalancerUuid, LoadBalancerVO.class);
- }
-}
+package org.zstack.network.service.lb;
+
+import org.springframework.http.HttpMethod;
+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.APINoSee;
+import org.zstack.header.rest.RestRequest;
+import org.zstack.header.acl.AccessControlListVO;
+
+import java.util.Arrays;
+import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
+
+/**
+ * @author: zhanyong.miao
+ * @date: 2020-03-11
+ **/
+@RestRequest(
+ path = "/load-balancers/listeners/{listenerUuid}/access-control-lists",
+ method = HttpMethod.DELETE,
+ responseClass = APIRemoveAccessControlListFromLoadBalancerEvent.class
+)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+public class APIRemoveAccessControlListFromLoadBalancerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
+ @APIParam(resourceType = AccessControlListVO.class, nonempty = true)
+ private List aclUuids;
+ @APINoSee
+ private String loadBalancerUuid;
+ @APIParam(resourceType = LoadBalancerListenerVO.class)
+ private String listenerUuid;
+
+ @APIParam(required = false, resourceType = LoadBalancerServerGroupVO.class)
+ private List serverGroupUuids;
+
+ public List getAclUuids() {
+ return aclUuids;
+ }
+
+ public void setAclUuids(List aclUuids) {
+ this.aclUuids = aclUuids;
+ }
+
+ public String getListenerUuid() {
+ return listenerUuid;
+ }
+
+ public void setListenerUuid(String listenerUuid) {
+ this.listenerUuid = listenerUuid;
+ }
+
+ public List getServerGroupUuids() {
+ return serverGroupUuids;
+ }
+
+ public void setServerGroupUuids(List serverGroupUuids) {
+ this.serverGroupUuids = serverGroupUuids;
+ }
+
+ @Override
+ public String getLoadBalancerUuid() {
+ return loadBalancerUuid;
+ }
+
+ public void setLoadBalancerUuid(String loadBalancerUuid) {
+ this.loadBalancerUuid = loadBalancerUuid;
+ }
+
+ public static APIRemoveAccessControlListFromLoadBalancerMsg __example__() {
+ APIRemoveAccessControlListFromLoadBalancerMsg msg = new APIRemoveAccessControlListFromLoadBalancerMsg();
+
+ msg.setListenerUuid(uuid());
+ msg.setAclUuids(Arrays.asList(uuid()));
+
+ return msg;
+ }
+
+ @Override
+ public Result audit(APIMessage msg, APIEvent rsp) {
+ return new Result(((APIRemoveAccessControlListFromLoadBalancerMsg)msg).loadBalancerUuid, LoadBalancerVO.class);
+ }
+}
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveBackendServerFromServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveBackendServerFromServerGroupMsg.java
index 0ad3466827f..28bdc5eb8b0 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveBackendServerFromServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveBackendServerFromServerGroupMsg.java
@@ -10,6 +10,7 @@
import org.zstack.header.vm.VmNicVO;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/servergroups/{serverGroupUuid}/backendservers/actions",
@@ -17,6 +18,7 @@
method = HttpMethod.PUT,
responseClass = APIRemoveBackendServerFromServerGroupEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveBackendServerFromServerGroupMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, nonempty = true)
private String serverGroupUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveCertificateFromLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveCertificateFromLoadBalancerListenerMsg.java
index 9d8af9b2f7d..9243eead4d9 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveCertificateFromLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveCertificateFromLoadBalancerListenerMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin on 03/26/2018.
@@ -16,6 +17,7 @@
method = HttpMethod.DELETE,
responseClass = APIRemoveCertificateFromLoadBalancerListenerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveCertificateFromLoadBalancerListenerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = CertificateVO.class, nonempty = true)
private String certificateUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveServerGroupFromLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveServerGroupFromLoadBalancerListenerMsg.java
index 3aeb6db4385..74ea5ca5b3a 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveServerGroupFromLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveServerGroupFromLoadBalancerListenerMsg.java
@@ -7,12 +7,14 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/listeners/{listenerUuid}/servergroups",
method = HttpMethod.DELETE,
responseClass = APIRemoveServerGroupFromLoadBalancerListenerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveServerGroupFromLoadBalancerListenerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = LoadBalancerServerGroupVO.class, nonempty = true)
private String serverGroupUuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveVmNicFromLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveVmNicFromLoadBalancerMsg.java
index 847b408399b..e960f984e9f 100755
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveVmNicFromLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIRemoveVmNicFromLoadBalancerMsg.java
@@ -11,6 +11,7 @@
import java.util.Arrays;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 8/8/2015.
@@ -20,6 +21,7 @@
method = HttpMethod.DELETE,
responseClass = APIRemoveVmNicFromLoadBalancerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveVmNicFromLoadBalancerMsg extends APIMessage implements LoadBalancerMessage, APIAuditor {
@APIParam(resourceType = VmNicVO.class, nonempty = true)
private List vmNicUuids;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateCertificateMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateCertificateMsg.java
index 42712422029..778634620f5 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateCertificateMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateCertificateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APICreateMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin on 04/12/2018.
@@ -14,6 +15,7 @@
responseClass = APIUpdateCertificateEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateCertificateMsg extends APICreateMessage {
@APIParam(resourceType = CertificateVO.class)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerListenerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerListenerMsg.java
index a1917f657e5..edf2b9cfc89 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerListenerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerListenerMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by camile on 5/19/2017.
@@ -15,6 +16,7 @@
responseClass = APIUpdateLoadBalancerListenerEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateLoadBalancerListenerMsg extends APIMessage implements LoadBalancerListenerMsg , LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerListenerVO.class)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerMsg.java
index 94ee6e2e71f..03863d73768 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APICreateMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by camile on 5/18/2017.
@@ -15,6 +16,7 @@
isAction = true
//parameterName = "updateLoadBalancer"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateLoadBalancerMsg extends APICreateMessage implements LoadBalancerMessage {
@APIParam(resourceType = LoadBalancerVO.class)
private String uuid;
diff --git a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerServerGroupMsg.java b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerServerGroupMsg.java
index 5ab0e58229a..e20bd7e386b 100644
--- a/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerServerGroupMsg.java
+++ b/plugin/loadBalancer/src/main/java/org/zstack/network/service/lb/APIUpdateLoadBalancerServerGroupMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/load-balancers/servergroups/{uuid}/actions",
@@ -12,6 +13,7 @@
responseClass = APIUpdateLoadBalancerServerGroupEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateLoadBalancerServerGroupMsg extends APIMessage implements LoadBalancerMessage{
@APIParam(resourceType = LoadBalancerServerGroupVO.class)
private String uuid;
diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIAddLocalPrimaryStorageMsg.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIAddLocalPrimaryStorageMsg.java
index e5b9522fe3f..e4d049fba1b 100755
--- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIAddLocalPrimaryStorageMsg.java
+++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIAddLocalPrimaryStorageMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.storage.primary.APIAddPrimaryStorageMsg;
import org.zstack.header.storage.primary.PrimaryStorageVO;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 7/1/2015.
@@ -17,6 +18,7 @@
responseClass = APIAddPrimaryStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddLocalPrimaryStorageMsg extends APIAddPrimaryStorageMsg {
@Override
public String getType() {
diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIGetLocalStorageHostDiskCapacityMsg.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIGetLocalStorageHostDiskCapacityMsg.java
index 385a0e22647..ac1d7ac8717 100755
--- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIGetLocalStorageHostDiskCapacityMsg.java
+++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIGetLocalStorageHostDiskCapacityMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageMessage;
import org.zstack.header.storage.primary.PrimaryStorageVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 10/15/2015.
@@ -16,6 +17,7 @@
method = HttpMethod.GET,
responseClass = APIGetLocalStorageHostDiskCapacityReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetLocalStorageHostDiskCapacityMsg extends APISyncCallMessage implements PrimaryStorageMessage {
@APIParam(resourceType = HostVO.class, required = false)
private String hostUuid;
diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageGetVolumeMigratableHostsMsg.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageGetVolumeMigratableHostsMsg.java
index 3296e618549..af3fea8d5a5 100755
--- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageGetVolumeMigratableHostsMsg.java
+++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageGetVolumeMigratableHostsMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageMessage;
import org.zstack.header.volume.VolumeVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 11/18/2015.
@@ -16,6 +17,7 @@
method = HttpMethod.GET,
responseClass = APILocalStorageGetVolumeMigratableReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APILocalStorageGetVolumeMigratableHostsMsg extends APISyncCallMessage implements PrimaryStorageMessage {
@APIParam(resourceType = VolumeVO.class)
private String volumeUuid;
diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageMigrateVolumeMsg.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageMigrateVolumeMsg.java
index e1864931171..186519a2484 100755
--- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageMigrateVolumeMsg.java
+++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APILocalStorageMigrateVolumeMsg.java
@@ -11,6 +11,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.PrimaryStorageMessage;
import org.zstack.header.storage.primary.PrimaryStorageVO;
+import org.zstack.header.vm.MetadataImpact;
import org.zstack.header.volume.VolumeVO;
import java.util.concurrent.TimeUnit;
@@ -25,6 +26,7 @@
isAction = true
)
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 24)
+@MetadataImpact(value = MetadataImpact.Impact.STORAGE, updateOnFailure = true)
public class APILocalStorageMigrateVolumeMsg extends APIMessage implements PrimaryStorageMessage, APIAuditor {
@APIParam(resourceType = VolumeVO.class)
private String volumeUuid;
diff --git a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIQueryLocalStorageResourceRefMsg.java b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIQueryLocalStorageResourceRefMsg.java
index bbe30a2d6c5..b88f33dd08e 100755
--- a/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIQueryLocalStorageResourceRefMsg.java
+++ b/plugin/localstorage/src/main/java/org/zstack/storage/primary/local/APIQueryLocalStorageResourceRefMsg.java
@@ -7,6 +7,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 11/14/2015.
@@ -17,6 +18,7 @@
method = HttpMethod.GET,
responseClass = APIQueryLocalStorageResourceRefReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryLocalStorageResourceRefMsg extends APIQueryMessage {
public static List __example__() {
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 d4665a86a06..792cd13017e 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
@@ -3,6 +3,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.zstack.compute.host.VolumeMigrationTargetHostFilter;
+import org.zstack.compute.vm.VmGlobalConfig;
import org.zstack.core.asyncbatch.While;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.core.cloudbus.EventFacade;
@@ -902,6 +903,8 @@ public void handleLocalMessage(Message msg) {
handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg);
} else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) {
handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg);
+ } else if (msg instanceof UpdateVmInstanceMetadataOnPrimaryStorageMsg) {
+ handle((UpdateVmInstanceMetadataOnPrimaryStorageMsg) msg);
} else {
super.handleLocalMessage(msg);
}
@@ -3329,4 +3332,49 @@ public void fail(ErrorCode errorCode) {
public static class LocalStoragePhysicalCapacityUsage extends PrimaryStorageBase.PhysicalCapacityUsage {
public long localStorageUsedSize;
}
+
+ private void handle(final UpdateVmInstanceMetadataOnPrimaryStorageMsg msg) {
+ // Layer 3: PS-level concurrency control (§4)
+ thdf.chainSubmit(new ChainTask(msg) {
+ @Override
+ public String getSyncSignature() {
+ return "update-metadata-on-ps-" + self.getUuid();
+ }
+
+ @Override
+ public int getSyncLevel() {
+ return VmGlobalConfig.VM_METADATA_PS_MAX_CONCURRENT.value(Integer.class);
+ }
+
+ @Override
+ public void run(SyncTaskChain chain) {
+ doHandleUpdateMetadata(msg);
+ chain.next();
+ }
+
+ @Override
+ public String getName() {
+ return "update-metadata-on-ps-" + self.getUuid();
+ }
+ });
+ }
+
+ private void doHandleUpdateMetadata(final UpdateVmInstanceMetadataOnPrimaryStorageMsg msg) {
+ final String hostUuid = getHostUuidByResourceUuid(msg.getRootVolumeUuid());
+ LocalStorageHypervisorFactory f = getHypervisorBackendFactoryByHostUuid(hostUuid);
+ LocalStorageHypervisorBackend bkd = f.getHypervisorBackend(self);
+ bkd.handle(msg, hostUuid, new ReturnValueCompletion(msg) {
+ @Override
+ public void success(UpdateVmInstanceMetadataOnPrimaryStorageReply returnValue) {
+ bus.reply(msg, returnValue);
+ }
+
+ @Override
+ public void fail(ErrorCode errorCode) {
+ UpdateVmInstanceMetadataOnPrimaryStorageReply reply = new UpdateVmInstanceMetadataOnPrimaryStorageReply();
+ reply.setError(errorCode);
+ bus.reply(msg, reply);
+ }
+ });
+ }
}
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 7760e28de93..7e85d562d8c 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
@@ -7,6 +7,8 @@
import org.zstack.header.image.ImageInventory;
import org.zstack.header.storage.primary.*;
import org.zstack.header.storage.snapshot.VolumeSnapshotInventory;
+import org.zstack.header.vm.UpdateVmInstanceMetadataOnPrimaryStorageMsg;
+import org.zstack.header.vm.UpdateVmInstanceMetadataOnPrimaryStorageReply;
import org.zstack.header.volume.*;
import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageMsg;
import org.zstack.storage.primary.EstimateVolumeTemplateSizeOnPrimaryStorageReply;
@@ -121,4 +123,6 @@ public LocalStorageHypervisorBackend(PrimaryStorageVO self) {
abstract void handle(CommitVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion);
abstract void handle(PullVolumeSnapshotOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion);
+
+ abstract void handle(UpdateVmInstanceMetadataOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion);
}
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 e8d268e518a..7da947744b7 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
@@ -43,10 +43,8 @@
import org.zstack.header.storage.backup.*;
import org.zstack.header.storage.primary.*;
import org.zstack.header.storage.snapshot.*;
+import org.zstack.header.vm.*;
import org.zstack.header.vm.VmInstanceSpec.ImageSpec;
-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.identity.AccountManager;
import org.zstack.kvm.*;
@@ -70,6 +68,7 @@
import static org.zstack.core.Platform.inerr;
import static org.zstack.core.Platform.multiErr;
import static org.zstack.core.Platform.operr;
+import static org.zstack.header.vm.VmInstanceConstant.VM_META_SUFFIX;
import static org.zstack.utils.CollectionDSL.list;
import static org.zstack.utils.CollectionUtils.transformAndRemoveNull;
@@ -3797,4 +3796,31 @@ public void fail(ErrorCode errorCode) {
}
});
}
+
+ @Override
+ void handle(UpdateVmInstanceMetadataOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion) {
+ String installPath = Q.New(VolumeVO.class).eq(VolumeVO_.uuid, msg.getRootVolumeUuid()).select(VolumeVO_.installPath).findValue();
+ // /vms_ds/rootVolumes/acct-36c27e8ff05c4780bf6d2fa65700f22e/vol-829a91b68e794a03865eab8a5918600a/snapshots/f2c31aeede604917aa8cee24848d8bfa.qcow2
+ // /vms_ds/rootVolumes/acct-36c27e8ff05c4780bf6d2fa65700f22e/vol-829a91b68e794a03865eab8a5918600a/829a91b68e794a03865eab8a5918600a.qcow2
+
+ String path = installPath.replaceFirst("^(.+/vol-[^/]+/).*$", "$1");
+ String metadataPath = String.format("%s%s", path, VM_META_SUFFIX);
+
+ UpdateVmInstanceMetadataOnHypervisorMsg umsg = new UpdateVmInstanceMetadataOnHypervisorMsg();
+ umsg.setMetadata(msg.getMetadata());
+ umsg.setMetadataPath(metadataPath);
+ umsg.setHostUuid(hostUuid);
+ bus.makeTargetServiceIdByResourceUuid(umsg, HostConstant.SERVICE_ID, hostUuid);
+ bus.send(umsg, new CloudBusCallBack(msg) {
+ @Override
+ public void run(MessageReply r) {
+ UpdateVmInstanceMetadataOnPrimaryStorageReply reply = new UpdateVmInstanceMetadataOnPrimaryStorageReply();
+ if (!r.isSuccess()) {
+ reply.setError(Platform.operr("failed to update vm[uuid=%s] on hypervisor.", self.getUuid())
+ .withCause(r.getError()));
+ }
+ bus.reply(msg, reply);
+ }
+ });
+ }
}
diff --git a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/APIAddNfsPrimaryStorageMsg.java b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/APIAddNfsPrimaryStorageMsg.java
index 2352874c4ab..ef7f549635a 100755
--- a/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/APIAddNfsPrimaryStorageMsg.java
+++ b/plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/APIAddNfsPrimaryStorageMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.storage.primary.APIAddPrimaryStorageMsg;
import org.zstack.header.storage.primary.PrimaryStorageVO;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -59,6 +60,7 @@
responseClass = APIAddPrimaryStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddNfsPrimaryStorageMsg extends APIAddPrimaryStorageMsg {
public APIAddNfsPrimaryStorageMsg() {
this.setType(NfsPrimaryStorageConstant.NFS_PRIMARY_STORAGE_TYPE);
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 abe9ac152b6..f179dacfeb9 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
@@ -40,10 +40,9 @@
import org.zstack.header.storage.snapshot.ShrinkVolumeSnapshotOnPrimaryStorageMsg;
import org.zstack.header.storage.snapshot.VolumeSnapshotConstant;
import org.zstack.header.storage.snapshot.VolumeSnapshotInventory;
+import org.zstack.compute.vm.VmGlobalConfig;
+import org.zstack.header.vm.*;
import org.zstack.header.vm.VmInstanceSpec.ImageSpec;
-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.kvm.*;
import org.zstack.storage.primary.*;
@@ -131,6 +130,8 @@ protected void handleLocalMessage(Message msg) {
handle((CommitVolumeSnapshotOnPrimaryStorageMsg) msg);
} else if (msg instanceof PullVolumeSnapshotOnPrimaryStorageMsg) {
handle((PullVolumeSnapshotOnPrimaryStorageMsg) msg);
+ } else if (msg instanceof UpdateVmInstanceMetadataOnPrimaryStorageMsg) {
+ handle((UpdateVmInstanceMetadataOnPrimaryStorageMsg) msg);
} else {
super.handleLocalMessage(msg);
}
@@ -1924,4 +1925,57 @@ private String getHostUuidFromVolume(String volumeUuid) {
return hostUuid;
}
+
+ protected void handle(UpdateVmInstanceMetadataOnPrimaryStorageMsg msg) {
+ // Layer 3: PS-level concurrency control (§4)
+ // 同一 MN 上同一 PS 最多 N 个并发元数据写入
+ thdf.chainSubmit(new ChainTask(msg) {
+ @Override
+ public String getSyncSignature() {
+ return "update-metadata-on-ps-" + self.getUuid();
+ }
+
+ @Override
+ public int getSyncLevel() {
+ return VmGlobalConfig.VM_METADATA_PS_MAX_CONCURRENT.value(Integer.class);
+ }
+
+ @Override
+ public void run(SyncTaskChain chain) {
+ doHandleUpdateMetadata(msg);
+ chain.next();
+ }
+
+ @Override
+ public String getName() {
+ return "update-metadata-on-ps-" + self.getUuid();
+ }
+ });
+ }
+
+ private void doHandleUpdateMetadata(UpdateVmInstanceMetadataOnPrimaryStorageMsg msg) {
+ UpdateVmInstanceMetadataOnPrimaryStorageReply reply = new UpdateVmInstanceMetadataOnPrimaryStorageReply();
+
+ String hostUuid = getHostUuidFromVolume(msg.getRootVolumeUuid());
+ if (hostUuid == null || hostUuid.isEmpty()) {
+ reply.setError(operr("no host found for volume[uuid:%s]", msg.getRootVolumeUuid()));
+ bus.reply(msg, reply);
+ return;
+ }
+
+ final NfsPrimaryStorageBackend backend = getUsableBackend();
+
+ backend.handle(msg, hostUuid, new ReturnValueCompletion(msg) {
+ @Override
+ public void success(UpdateVmInstanceMetadataOnPrimaryStorageReply r) {
+ bus.reply(msg, r);
+ }
+
+ @Override
+ public void fail(ErrorCode errorCode) {
+ reply.setError(errorCode);
+ bus.reply(msg, reply);
+ }
+ });
+ }
}
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 459023d7c17..a19f2d1d38e 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
@@ -7,6 +7,8 @@
import org.zstack.header.image.ImageInventory;
import org.zstack.header.storage.primary.*;
import org.zstack.header.storage.snapshot.VolumeSnapshotInventory;
+import org.zstack.header.vm.UpdateVmInstanceMetadataOnPrimaryStorageMsg;
+import org.zstack.header.vm.UpdateVmInstanceMetadataOnPrimaryStorageReply;
import org.zstack.header.volume.VolumeStats;
import org.zstack.header.volume.BatchSyncVolumeSizeOnPrimaryStorageMsg;
import org.zstack.header.volume.BatchSyncVolumeSizeOnPrimaryStorageReply;
@@ -91,6 +93,8 @@ public interface NfsPrimaryStorageBackend {
void updateMountPoint(PrimaryStorageInventory pinv, String clusterUuid, String oldMountPoint, String newMountPoint, Completion completion);
+ void handle(UpdateVmInstanceMetadataOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion);
+
class BitsInfo {
private String installPath;
private long size;
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 93d3d7aab99..e3ec8ac8c35 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
@@ -35,10 +35,7 @@
import org.zstack.header.storage.primary.*;
import org.zstack.header.storage.snapshot.VolumeSnapshotInventory;
import org.zstack.header.storage.snapshot.VolumeSnapshotVO;
-import org.zstack.header.vm.VmInstanceSpec;
-import org.zstack.header.vm.VmInstanceState;
-import org.zstack.header.vm.VmInstanceVO;
-import org.zstack.header.vm.VmInstanceVO_;
+import org.zstack.header.vm.*;
import org.zstack.header.volume.*;
import org.zstack.identity.AccountManager;
import org.zstack.kvm.*;
@@ -67,6 +64,7 @@
import static java.lang.Integer.min;
import static org.zstack.core.Platform.operr;
import static org.zstack.core.Platform.touterr;
+import static org.zstack.header.vm.VmInstanceConstant.VM_META_SUFFIX;
import static org.zstack.utils.CollectionUtils.transformAndRemoveNull;
public class NfsPrimaryStorageKVMBackend implements NfsPrimaryStorageBackend,
@@ -2051,4 +2049,32 @@ public void run(MessageReply r) {
}
});
}
+
+ public void handle(UpdateVmInstanceMetadataOnPrimaryStorageMsg msg, String hostUuid, ReturnValueCompletion completion) {
+ UpdateVmInstanceMetadataOnHypervisorMsg umsg = new UpdateVmInstanceMetadataOnHypervisorMsg();
+ umsg.setMetadata(msg.getMetadata());
+ umsg.setHostUuid(hostUuid);
+
+ String installPath = Q.New(VolumeVO.class)
+ .eq(VolumeVO_.uuid, msg.getRootVolumeUuid())
+ .select(VolumeVO_.installPath)
+ .findValue();
+ String path = installPath.replaceFirst("^(.+/vol-[^/]+/).*$", "$1");
+ String metadataPath = String.format("%s%s", path, VM_META_SUFFIX);
+ umsg.setMetadataPath(metadataPath);
+
+ bus.makeTargetServiceIdByResourceUuid(umsg, HostConstant.SERVICE_ID, hostUuid);
+ bus.send(umsg, new CloudBusCallBack(msg) {
+ @Override
+ public void run(MessageReply r) {
+ UpdateVmInstanceMetadataOnPrimaryStorageReply reply = new UpdateVmInstanceMetadataOnPrimaryStorageReply();
+ if (!r.isSuccess()) {
+ reply.setError(Platform.operr("failed to update vm[uuid=%s] metadata on hypervisor via host[uuid:%s]",
+ msg.getVmInstanceUuid(), hostUuid)
+ .withCause(r.getError()));
+ }
+ completion.success(reply);
+ }
+ });
+ }
}
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIAttachPortForwardingRuleMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIAttachPortForwardingRuleMsg.java
index 7e99555195d..6503f9bcb5d 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIAttachPortForwardingRuleMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIAttachPortForwardingRuleMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmNicVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -50,6 +51,7 @@
parameterName = "params",
responseClass = APIAttachPortForwardingRuleEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAttachPortForwardingRuleMsg extends APIMessage {
/**
* @desc rule uuid
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIChangePortForwardingRuleStateMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIChangePortForwardingRuleStateMsg.java
index 25b577527f8..f8be5b107a5 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIChangePortForwardingRuleStateMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIChangePortForwardingRuleStateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -13,6 +14,7 @@
isAction = true,
responseClass = APIChangePortForwardingRuleStateEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangePortForwardingRuleStateMsg extends APIMessage {
@APIParam(resourceType = PortForwardingRuleVO.class)
private String uuid;
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APICreatePortForwardingRuleMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APICreatePortForwardingRuleMsg.java
index 856e7295185..6a2e853e5fc 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APICreatePortForwardingRuleMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APICreatePortForwardingRuleMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmNicVO;
import org.zstack.network.service.vip.VipVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -68,6 +69,7 @@
responseClass = APICreatePortForwardingRuleEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreatePortForwardingRuleMsg extends APICreateMessage implements APIAuditor {
/**
* @desc uuid of vip the rule is being created on
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDeletePortForwardingRuleMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDeletePortForwardingRuleMsg.java
index 891b7313811..404f37d50d6 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDeletePortForwardingRuleMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDeletePortForwardingRuleMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -50,6 +51,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeletePortForwardingRuleEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeletePortForwardingRuleMsg extends APIDeleteMessage {
/**
* @desc
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDetachPortForwardingRuleMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDetachPortForwardingRuleMsg.java
index 1fd298ff62b..0b904417134 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDetachPortForwardingRuleMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIDetachPortForwardingRuleMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmNicVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -49,6 +50,7 @@
method = HttpMethod.DELETE,
responseClass = APIDetachPortForwardingRuleEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDetachPortForwardingRuleMsg extends APIMessage implements APIAuditor {
/**
* @desc rule uuid
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIGetPortForwardingAttachableVmNicsMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIGetPortForwardingAttachableVmNicsMsg.java
index f3bc6dfd9f5..931c3ef960e 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIGetPortForwardingAttachableVmNicsMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIGetPortForwardingAttachableVmNicsMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -12,6 +13,7 @@
method = HttpMethod.GET,
responseClass = APIGetPortForwardingAttachableVmNicsReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetPortForwardingAttachableVmNicsMsg extends APISyncCallMessage {
@APIParam(resourceType = PortForwardingRuleVO.class)
private String ruleUuid;
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIQueryPortForwardingRuleMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIQueryPortForwardingRuleMsg.java
index eac0dd79af2..1705dc89166 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIQueryPortForwardingRuleMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIQueryPortForwardingRuleMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryPortForwardingRuleReply.class, inventoryClass = PortForwardingRuleInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
optionalPaths = {"/port-forwarding/{uuid}"},
responseClass = APIQueryPortForwardingRuleReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryPortForwardingRuleMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIUpdatePortForwardingRuleMsg.java b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIUpdatePortForwardingRuleMsg.java
index 8d874a1fd70..4e83e288845 100755
--- a/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIUpdatePortForwardingRuleMsg.java
+++ b/plugin/portForwarding/src/main/java/org/zstack/network/service/portforwarding/APIUpdatePortForwardingRuleMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/15/2015.
@@ -14,6 +15,7 @@
responseClass = APIUpdatePortForwardingRuleEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdatePortForwardingRuleMsg extends APIMessage {
@APIParam(resourceType = PortForwardingRuleVO.class)
private String uuid;
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 59bd437b013..465ef691cb7 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
@@ -6,6 +6,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
@TagResourceType(SdnControllerVO.class)
@RestRequest(
@@ -14,6 +15,7 @@
responseClass = APIAddSdnControllerEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSdnControllerMsg extends APICreateMessage implements APIAuditor {
@APIParam(maxLength = 255)
private String vendorType;
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 054738a6712..45e67fbf931 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
@@ -7,6 +7,7 @@
import org.zstack.header.network.l2.APICreateL2NetworkMsg;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.zone.ZoneVO;
+import org.zstack.header.vm.MetadataImpact;
@OverriddenApiParams({
@OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)),
@@ -18,6 +19,7 @@
responseClass = APICreateL2HardwareVxlanNetworkEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateL2HardwareVxlanNetworkMsg extends APICreateL2NetworkMsg {
@APIParam(required = false, numberRange = {1, 16777214})
private Integer vni;
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..56a501dbe57 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
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.network.l2.APICreateL2NetworkMsg;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/l2-networks/hardware-vxlan-pool",
@@ -11,6 +12,7 @@
responseClass = APICreateL2HardwareVxlanNetworkPoolEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateL2HardwareVxlanNetworkPoolMsg extends APICreateL2NetworkMsg {
@APIParam(resourceType = SdnControllerVO.class)
private String sdnControllerUuid;
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 62225c5b0bf..8a28fed8afd 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
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created with IntelliJ IDEA.
@@ -22,6 +23,7 @@
method = HttpMethod.GET,
responseClass = APIQuerySdnControllerReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQuerySdnControllerMsg extends APIQueryMessage {
public static List __example__() {
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 7a6aef5419c..0f705061452 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,12 +4,14 @@
import org.zstack.header.message.APIDeleteMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/sdn-controllers/{uuid}",
method = HttpMethod.DELETE,
responseClass = APIRemoveSdnControllerEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRemoveSdnControllerMsg extends APIDeleteMessage {
@APIParam(successIfResourceNotExisting = true, resourceType = SdnControllerVO.class)
private String uuid;
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 06a24c57457..2e53879b161 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
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.network.l2.L2NetworkMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin.ruan on 09/19/2019.
@@ -15,6 +16,7 @@
responseClass = APIUpdateSdnControllerEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateSdnControllerMsg extends APIMessage implements L2NetworkMessage {
@APIParam(resourceType = SdnControllerVO.class)
private String uuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddSecurityGroupRuleMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddSecurityGroupRuleMsg.java
index 0f2a95b67cf..a904f1d5d28 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddSecurityGroupRuleMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddSecurityGroupRuleMsg.java
@@ -10,6 +10,7 @@
import java.util.Objects;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -102,6 +103,7 @@
responseClass = APIAddSecurityGroupRuleEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSecurityGroupRuleMsg extends APIMessage implements AddSecurityGroupRuleMessage {
/**
* @inventory
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddVmNicToSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddVmNicToSecurityGroupMsg.java
index 147a093852f..2d486a08087 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddVmNicToSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAddVmNicToSecurityGroupMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -59,6 +60,7 @@
responseClass = APIAddVmNicToSecurityGroupEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddVmNicToSecurityGroupMsg extends APIMessage {
/**
* @desc security group uuid
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAttachSecurityGroupToL3NetworkMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAttachSecurityGroupToL3NetworkMsg.java
index e4322e8c969..ef4889c24ba 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAttachSecurityGroupToL3NetworkMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIAttachSecurityGroupToL3NetworkMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.network.l3.L3NetworkVO;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -50,6 +51,7 @@
parameterName = "params",
responseClass = APIAttachSecurityGroupToL3NetworkEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAttachSecurityGroupToL3NetworkMsg extends APIMessage implements SecurityGroupMessage {
@APIParam(resourceType=SecurityGroupVO.class)
private String securityGroupUuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleMsg.java
index 08c465887a0..d44678fc18c 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
@@ -13,6 +14,8 @@
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+
public class APIChangeSecurityGroupRuleMsg extends APIMessage{
@APIParam(resourceType = SecurityGroupRuleVO.class, nonempty = true)
private String uuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleStateMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleStateMsg.java
index 9120e35173a..997c24e0053 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleStateMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupRuleStateMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/security-groups/{securityGroupUuid}/rules/state/actions",
@@ -15,6 +16,7 @@
responseClass = APIChangeSecurityGroupRuleStateEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeSecurityGroupRuleStateMsg extends APIMessage implements SecurityGroupMessage {
@APIParam(required = true, nonempty = true)
private String securityGroupUuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupStateMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupStateMsg.java
index a206abeaca5..ac60ceb1ee2 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupStateMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeSecurityGroupStateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -51,6 +52,7 @@
responseClass = APIChangeSecurityGroupStateEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeSecurityGroupStateMsg extends APIMessage {
@APIParam(resourceType = SecurityGroupVO.class)
private String uuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeVmNicSecurityPolicyMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeVmNicSecurityPolicyMsg.java
index 43192344e1e..46b00c9999d 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeVmNicSecurityPolicyMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIChangeVmNicSecurityPolicyMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmNicVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/security-groups/nics/{vmNicUuid}/security-policy/actions",
@@ -12,6 +13,7 @@
responseClass = APIChangeVmNicSecurityPolicyEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeVmNicSecurityPolicyMsg extends APIMessage implements VmNicSecurityGroupMessage {
@APIParam(resourceType = VmNicVO.class)
private String vmNicUuid;
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 49c2e99a096..6c8982438db 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
@@ -7,6 +7,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -50,6 +51,7 @@
responseClass = APICreateSecurityGroupEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateSecurityGroupMsg extends APICreateMessage implements APIAuditor {
/**
* @desc max length of 255 characters
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupMsg.java
index 76bbd319790..0ba30488ddb 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static org.zstack.utils.CollectionDSL.list;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -52,6 +53,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteSecurityGroupEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteSecurityGroupMsg extends APIDeleteMessage implements SecurityGroupMessage {
/**
* @desc security group uuid
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupRuleMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupRuleMsg.java
index 01bceb920c7..bfbd89da29a 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupRuleMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteSecurityGroupRuleMsg.java
@@ -10,6 +10,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -58,6 +59,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteSecurityGroupRuleEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteSecurityGroupRuleMsg extends APIMessage implements APIAuditor {
/**
* @desc a list of rule uuid
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteVmNicFromSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteVmNicFromSecurityGroupMsg.java
index f8c9b5cfbef..1c1c44ef176 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteVmNicFromSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDeleteVmNicFromSecurityGroupMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -55,6 +56,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteVmNicFromSecurityGroupEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteVmNicFromSecurityGroupMsg extends APIMessage {
/**
* @desc security group uuid
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDetachSecurityGroupFromL3NetworkMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDetachSecurityGroupFromL3NetworkMsg.java
index d2555d35f47..b508fb14f6a 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDetachSecurityGroupFromL3NetworkMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIDetachSecurityGroupFromL3NetworkMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.network.l3.L3NetworkVO;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
@@ -42,6 +43,7 @@
method = HttpMethod.DELETE,
responseClass = APIDetachSecurityGroupFromL3NetworkEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDetachSecurityGroupFromL3NetworkMsg extends APIMessage implements SecurityGroupMessage {
/**
* @desc security group uuid
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIGetCandidateVmNicForSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIGetCandidateVmNicForSecurityGroupMsg.java
index e230f92368d..f67039635d9 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIGetCandidateVmNicForSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIGetCandidateVmNicForSecurityGroupMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -12,6 +13,7 @@
method = HttpMethod.GET,
responseClass = APIGetCandidateVmNicForSecurityGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetCandidateVmNicForSecurityGroupMsg extends APISyncCallMessage {
@APIParam(resourceType = SecurityGroupVO.class)
private String securityGroupUuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupMsg.java
index e8719e627e4..55191e88b3d 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQuerySecurityGroupReply.class, inventoryClass = SecurityGroupInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
method = HttpMethod.GET,
responseClass = APIQuerySecurityGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQuerySecurityGroupMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupRuleMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupRuleMsg.java
index c7576ed6475..0e5e8fec8c2 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupRuleMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQuerySecurityGroupRuleMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -18,6 +19,7 @@
method = HttpMethod.GET,
responseClass = APIQuerySecurityGroupRuleReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQuerySecurityGroupRuleMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicInSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicInSecurityGroupMsg.java
index 8ed12c7e43f..756fc9c73e8 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicInSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicInSecurityGroupMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryVmNicInSecurityGroupReply.class, inventoryClass = VmNicSecurityGroupRefInventory.class)
@RestRequest(
@@ -15,6 +16,7 @@
method = HttpMethod.GET,
responseClass = APIQueryVmNicInSecurityGroupReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVmNicInSecurityGroupMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicSecurityPolicyMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicSecurityPolicyMsg.java
index adcb6cb810a..77bb277017d 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicSecurityPolicyMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIQueryVmNicSecurityPolicyMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryVmNicSecurityPolicyReply.class, inventoryClass = VmNicSecurityPolicyInventory.class)
@RestRequest(
@@ -17,6 +18,8 @@
responseClass = APIQueryVmNicSecurityPolicyReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+
public class APIQueryVmNicSecurityPolicyMsg extends APIQueryMessage {
public static List __example__() {
return asList("ingressPolicy=DROP", "egressPolicy=DROP");
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APISetVmNicSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APISetVmNicSecurityGroupMsg.java
index 45598831bca..e95611ae2e8 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APISetVmNicSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APISetVmNicSecurityGroupMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/security-groups/nics/{vmNicUuid}/actions",
@@ -15,6 +16,7 @@
responseClass = APISetVmNicSecurityGroupEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APISetVmNicSecurityGroupMsg extends APIMessage implements VmNicSecurityGroupMessage {
@APIParam(resourceType = VmNicVO.class, nonempty = true, required = true)
private String vmNicUuid;
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupMsg.java
index bf0eafcc71e..ff6cc322e9c 100755
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/15/2015.
@@ -14,6 +15,7 @@
isAction = true,
responseClass = APIUpdateSecurityGroupEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateSecurityGroupMsg extends APIMessage implements SecurityGroupMessage {
@APIParam(resourceType = SecurityGroupVO.class)
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupRulePriorityMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupRulePriorityMsg.java
index e7df5fbc598..1f15dfb20f3 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupRulePriorityMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIUpdateSecurityGroupRulePriorityMsg.java
@@ -7,6 +7,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/security-groups/{securityGroupUuid}/rules/priority/actions",
@@ -15,6 +16,8 @@
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
+
public class APIUpdateSecurityGroupRulePriorityMsg extends APIMessage implements SecurityGroupMessage {
public static class SecurityGroupRulePriorityAO {
@APIParam(resourceType = SecurityGroupRuleVO.class, nonempty = true, required = true)
diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIValidateSecurityGroupRuleMsg.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIValidateSecurityGroupRuleMsg.java
index 055867116b6..0cb2c85064b 100644
--- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIValidateSecurityGroupRuleMsg.java
+++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/APIValidateSecurityGroupRuleMsg.java
@@ -4,12 +4,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/security-groups/{securityGroupUuid}/rules/validation",
method = HttpMethod.GET,
responseClass = APIValidateSecurityGroupRuleReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIValidateSecurityGroupRuleMsg extends APISyncCallMessage {
@APIParam(resourceType = SecurityGroupVO.class, required = true, nonempty = true)
diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIAddSftpBackupStorageMsg.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIAddSftpBackupStorageMsg.java
index 80f94f1fcd2..6d71b7de7ea 100755
--- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIAddSftpBackupStorageMsg.java
+++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIAddSftpBackupStorageMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.backup.APIAddBackupStorageMsg;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
* add a sftp backup storage
@@ -61,6 +62,7 @@
responseClass = APIAddSftpBackupStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSftpBackupStorageMsg extends APIAddBackupStorageMsg {
@APIParam(maxLength = 255, emptyString = false)
private String hostname;
diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIQuerySftpBackupStorageMsg.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIQuerySftpBackupStorageMsg.java
index 4bf737b735f..b3c660111f1 100755
--- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIQuerySftpBackupStorageMsg.java
+++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIQuerySftpBackupStorageMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQuerySftpBackupStorageReply.class, inventoryClass = SftpBackupStorageInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
method = HttpMethod.GET,
responseClass = APIQuerySftpBackupStorageReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQuerySftpBackupStorageMsg extends APIQueryMessage {
diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIReconnectSftpBackupStorageMsg.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIReconnectSftpBackupStorageMsg.java
index d8acf71130e..fb07bfc451d 100755
--- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIReconnectSftpBackupStorageMsg.java
+++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIReconnectSftpBackupStorageMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.backup.BackupStorageMessage;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/backup-storage/sftp/{uuid}/actions",
@@ -13,6 +14,7 @@
responseClass = APIReconnectSftpBackupStorageEvent.class,
method = HttpMethod.PUT
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIReconnectSftpBackupStorageMsg extends APIMessage implements BackupStorageMessage {
@APIParam(resourceType = SftpBackupStorageVO.class)
private String uuid;
diff --git a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIUpdateSftpBackupStorageMsg.java b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIUpdateSftpBackupStorageMsg.java
index 882a2a25a17..746615069b2 100755
--- a/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIUpdateSftpBackupStorageMsg.java
+++ b/plugin/sftpBackupStorage/src/main/java/org/zstack/storage/backup/sftp/APIUpdateSftpBackupStorageMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.backup.APIUpdateBackupStorageEvent;
import org.zstack.header.storage.backup.APIUpdateBackupStorageMsg;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/15/2015.
@@ -16,6 +17,7 @@
method = HttpMethod.PUT,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateSftpBackupStorageMsg extends APIUpdateBackupStorageMsg {
@APIParam(maxLength = 255, required = false)
private String username;
diff --git a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/APIAddSharedMountPointPrimaryStorageMsg.java b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/APIAddSharedMountPointPrimaryStorageMsg.java
index 832d167aac6..42718e0cdf0 100755
--- a/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/APIAddSharedMountPointPrimaryStorageMsg.java
+++ b/plugin/sharedMountPointPrimaryStorage/src/main/java/org/zstack/storage/primary/smp/APIAddSharedMountPointPrimaryStorageMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.storage.primary.APIAddPrimaryStorageMsg;
import org.zstack.header.storage.primary.PrimaryStorageVO;
import org.zstack.header.tag.TagResourceType;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by xing5 on 2016/3/27.
@@ -17,6 +18,7 @@
responseClass = APIAddPrimaryStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSharedMountPointPrimaryStorageMsg extends APIAddPrimaryStorageMsg {
public APIAddSharedMountPointPrimaryStorageMsg() {
this.setType(SMPConstants.SMP_TYPE);
diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIAttachSshKeyPairToVmInstanceMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIAttachSshKeyPairToVmInstanceMsg.java
index e6281f7679a..aa2c1610248 100644
--- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIAttachSshKeyPairToVmInstanceMsg.java
+++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIAttachSshKeyPairToVmInstanceMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ssh-key-pair/{sshKeyPairUuid}/vm-instance/{vmInstanceUuid}",
@@ -12,6 +13,7 @@
responseClass = APIAttachSshKeyPairToVmInstanceEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAttachSshKeyPairToVmInstanceMsg extends APIMessage implements SshKeyPairMessage {
@APIParam(resourceType = VmInstanceVO.class)
private String vmInstanceUuid;
diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APICreateSshKeyPairMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APICreateSshKeyPairMsg.java
index 0f3b67ecc49..e03b1bd8ad2 100644
--- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APICreateSshKeyPairMsg.java
+++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APICreateSshKeyPairMsg.java
@@ -7,6 +7,7 @@
import org.zstack.header.tag.TagResourceType;
import org.zstack.header.volume.VolumeVO;
import org.zstack.sshkeypair.SshKeyPairConstant;
+import org.zstack.header.vm.MetadataImpact;
@TagResourceType(VolumeVO.class)
@RestRequest(
@@ -15,6 +16,7 @@
responseClass = APICreateSshKeyPairEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateSshKeyPairMsg extends APICreateMessage {
@APIParam(maxLength = 255, validRegexValues = SshKeyPairConstant.SSH_KEY_PAIR_NAME_REGEX)
private String name;
diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDeleteSshKeyPairMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDeleteSshKeyPairMsg.java
index b15b8160f47..210b6196f1b 100644
--- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDeleteSshKeyPairMsg.java
+++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDeleteSshKeyPairMsg.java
@@ -6,12 +6,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ssh-key-pair/{uuid}",
method = HttpMethod.DELETE,
responseClass = APIDeleteSshKeyPairEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteSshKeyPairMsg extends APIMessage implements SshKeyPairMessage, APIAuditor {
@APIParam(resourceType = SshKeyPairVO.class)
private String uuid;
diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDetachSshKeyPairFromVmInstanceMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDetachSshKeyPairFromVmInstanceMsg.java
index e2e1465795a..8b1335a7891 100644
--- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDetachSshKeyPairFromVmInstanceMsg.java
+++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIDetachSshKeyPairFromVmInstanceMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ssh-key-pair/{sshKeyPairUuid}/vm-instance/{vmInstanceUuid}",
method = HttpMethod.DELETE,
responseClass = APIDetachSshKeyPairFromVmInstanceEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDetachSshKeyPairFromVmInstanceMsg extends APIMessage implements SshKeyPairMessage {
@APIParam(resourceType = VmInstanceVO.class)
private String vmInstanceUuid;
diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIGenerateSshKeyPairMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIGenerateSshKeyPairMsg.java
index 1e3e368d59d..b5887318d8d 100644
--- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIGenerateSshKeyPairMsg.java
+++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIGenerateSshKeyPairMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.tag.TagResourceType;
import org.zstack.header.volume.VolumeVO;
import org.zstack.sshkeypair.SshKeyPairConstant;
+import org.zstack.header.vm.MetadataImpact;
@TagResourceType(VolumeVO.class)
@RestRequest(
@@ -14,6 +15,7 @@
responseClass = APIGenerateSshKeyPairReply.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGenerateSshKeyPairMsg extends APISyncCallMessage {
@APIParam(maxLength = 255, validRegexValues = SshKeyPairConstant.SSH_KEY_PAIR_NAME_REGEX)
private String name;
diff --git a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIQuerySshKeyPairMsg.java b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIQuerySshKeyPairMsg.java
index fafb3949bfd..4f7778ed918 100644
--- a/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIQuerySshKeyPairMsg.java
+++ b/plugin/sshKeyPair/src/main/java/org/zstack/header/sshkeypair/APIQuerySshKeyPairMsg.java
@@ -7,6 +7,7 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQuerySshKeyPairReply.class, inventoryClass = SshKeyPairInventory.class)
@RestRequest(
@@ -15,6 +16,7 @@
responseClass = APIQuerySshKeyPairReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQuerySshKeyPairMsg extends APIQueryMessage {
public static List __example__() {
return Collections.singletonList("uuid=" + uuid());
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 bfcfb307759..fb8c6f8b756 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
@@ -7,6 +7,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
import org.zstack.sshkeypair.SshKeyPairConstant;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/ssh-key-pair/{uuid}/actions",
@@ -14,6 +15,7 @@
responseClass = APIUpdateSshKeyPairEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateSshKeyPairMsg extends APIMessage implements SshKeyPairMessage, APIAuditor {
@APIParam(resourceType = SshKeyPairVO.class, maxLength = 32)
private String uuid;
diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/APICreateL2TfNetworkMsg.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/APICreateL2TfNetworkMsg.java
index 85a9c2b08f6..dfbcd7cc29a 100644
--- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/APICreateL2TfNetworkMsg.java
+++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/header/APICreateL2TfNetworkMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.network.l2.APICreateL2NetworkMsg;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.zone.ZoneVO;
+import org.zstack.header.vm.MetadataImpact;
@OverriddenApiParams({
@OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)),
@@ -20,6 +21,7 @@
responseClass = APICreateL2NetworkEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateL2TfNetworkMsg extends APICreateL2NetworkMsg {
@APIParam(required = false, maxLength = 255)
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIChangeVipStateMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIChangeVipStateMsg.java
index 9ff28c48729..e0462ba2c2a 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIChangeVipStateMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIChangeVipStateMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -13,6 +14,7 @@
responseClass = APIChangeVipStateEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIChangeVipStateMsg extends APIMessage implements VipMessage {
@APIParam(resourceType = VipVO.class)
private String uuid;
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APICheckVipPortAvailabilityMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APICheckVipPortAvailabilityMsg.java
index 47672f44076..1278fa25650 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APICheckVipPortAvailabilityMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APICheckVipPortAvailabilityMsg.java
@@ -3,12 +3,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.message.APIGetMessage;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/vips/{vipUuid}/check-port-availability",
method = HttpMethod.GET,
responseClass = APICheckVipPortAvailabilityReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICheckVipPortAvailabilityMsg extends APIGetMessage {
@APIParam(resourceType = VipVO.class)
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APICreateVipMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APICreateVipMsg.java
index 657dac182ab..846c1325142 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APICreateVipMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APICreateVipMsg.java
@@ -9,6 +9,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api
@@ -55,6 +56,7 @@
responseClass = APICreateVipEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVipMsg extends APICreateMessage implements L3NetworkMessage, IpAllocateMessage, APIAuditor {
/**
* @desc max length of 255 characters
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIDeleteVipMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIDeleteVipMsg.java
index 0d183b34c2e..fbd7b2f5311 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIDeleteVipMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIDeleteVipMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.network.l3.L3NetworkMessage;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @api delete vip
@@ -38,6 +39,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteVipEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteVipMsg extends APIDeleteMessage implements L3NetworkMessage, VipMessage {
/**
* @ignore
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIGetVipAvailablePortMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIGetVipAvailablePortMsg.java
index 95508023302..aff64542e1c 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIGetVipAvailablePortMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIGetVipAvailablePortMsg.java
@@ -3,12 +3,14 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.message.APIGetMessage;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/vips/{vipUuid}/get-port-availability",
method = HttpMethod.GET,
responseClass = APIGetVipAvailablePortReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetVipAvailablePortMsg extends APIGetMessage {
@APIParam(resourceType = VipVO.class)
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIQueryVipMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIQueryVipMsg.java
index 0613a9a4bfb..cb6ab85b694 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIQueryVipMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIQueryVipMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created with IntelliJ IDEA.
@@ -22,6 +23,7 @@
method = HttpMethod.GET,
responseClass = APIQueryVipReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVipMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIUpdateVipMsg.java b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIUpdateVipMsg.java
index ede5bcd8f44..1ad44db5421 100755
--- a/plugin/vip/src/main/java/org/zstack/network/service/vip/APIUpdateVipMsg.java
+++ b/plugin/vip/src/main/java/org/zstack/network/service/vip/APIUpdateVipMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIMessage;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 6/15/2015.
@@ -14,6 +15,7 @@
responseClass = APIUpdateVipEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateVipMsg extends APIMessage implements VipMessage {
@APIParam(resourceType = VipVO.class)
private String uuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterOfferingMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterOfferingMsg.java
index cefe3c3ef0a..f165ae114d9 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterOfferingMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterOfferingMsg.java
@@ -10,6 +10,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.tag.TagResourceType;
import org.zstack.header.zone.ZoneVO;
+import org.zstack.header.vm.MetadataImpact;
@TagResourceType(InstanceOfferingVO.class)
@RestRequest(
@@ -18,6 +19,7 @@
parameterName = "params",
method = HttpMethod.POST
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVirtualRouterOfferingMsg extends APICreateInstanceOfferingMsg {
@APIParam(resourceType = ZoneVO.class)
private String zoneUuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterVmMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterVmMsg.java
index 314d5d1c910..055be5d1f43 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterVmMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APICreateVirtualRouterVmMsg.java
@@ -9,6 +9,7 @@
import java.util.Set;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/*
@RestRequest(
@@ -18,6 +19,7 @@
parameterName = "params"
)
*/
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVirtualRouterVmMsg extends APICreateVmInstanceMsg {
@APIParam(resourceType = L3NetworkVO.class)
private String managementNetworkUuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetAttachablePublicL3ForVRouterMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetAttachablePublicL3ForVRouterMsg.java
index 68d9b60503c..5bc29be4cb6 100644
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetAttachablePublicL3ForVRouterMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetAttachablePublicL3ForVRouterMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceMessage;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/vm-instances/appliances/virtual-routers/{vmInstanceUuid}/attachable-public-l3s",
method = HttpMethod.GET,
responseClass = APIGetAttachablePublicL3ForVRouterReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetAttachablePublicL3ForVRouterMsg extends APISyncCallMessage implements VmInstanceMessage {
@APIParam(resourceType = VirtualRouterVmVO.class)
private String vmInstanceUuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetVipUsedPortsMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetVipUsedPortsMsg.java
index 52de35df050..fe7bfcfe8f9 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetVipUsedPortsMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIGetVipUsedPortsMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.network.service.vip.VipVO;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -13,6 +14,7 @@
method = HttpMethod.GET,
responseClass = APIGetVipUsedPortsReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetVipUsedPortsMsg extends APISyncCallMessage {
@APIParam(resourceType = VipVO.class)
private String uuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIProvisionVirtualRouterConfigMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIProvisionVirtualRouterConfigMsg.java
index a4c98b77e15..37f78131c99 100644
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIProvisionVirtualRouterConfigMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIProvisionVirtualRouterConfigMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceMessage;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -14,6 +15,7 @@
responseClass = APIProvisionVirtualRouterConfigEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIProvisionVirtualRouterConfigMsg extends APIMessage implements VmInstanceMessage {
@APIParam(resourceType = VirtualRouterVmVO.class)
private String vmInstanceUuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterOfferingMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterOfferingMsg.java
index 58f4c4736c2..cbc607f017c 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterOfferingMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterOfferingMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
@AutoQuery(replyClass = APIQueryVirtualRouterOfferingReply.class, inventoryClass = VirtualRouterOfferingInventory.class)
@RestRequest(
@@ -16,6 +17,7 @@
responseClass = APIQueryVirtualRouterOfferingReply.class,
method = HttpMethod.GET
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVirtualRouterOfferingMsg extends APIQueryMessage {
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterVmMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterVmMsg.java
index 3a23782fe6b..0a29f86f6f9 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterVmMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIQueryVirtualRouterVmMsg.java
@@ -9,6 +9,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryApplianceVmReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVirtualRouterVmMsg extends APIQueryApplianceVmMsg {
public static List __example__() {
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIReconnectVirtualRouterMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIReconnectVirtualRouterMsg.java
index 38cb76b31cc..590c8a4cd1e 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIReconnectVirtualRouterMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIReconnectVirtualRouterMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceMessage;
+import org.zstack.header.vm.MetadataImpact;
/**
*/
@@ -14,6 +15,7 @@
responseClass = APIReconnectVirtualRouterEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIReconnectVirtualRouterMsg extends APIMessage implements VmInstanceMessage {
@APIParam(resourceType = VirtualRouterVmVO.class)
private String vmInstanceUuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterMsg.java
index dfb2f4db2ae..5c931053a28 100644
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.network.l3.L3NetworkVO;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vm.VmInstanceMessage;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by shixin.ruan 2020/02/12.
@@ -16,6 +17,7 @@
isAction = true,
responseClass = APIUpdateVirtualRouterEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateVirtualRouterMsg extends APIMessage implements VmInstanceMessage {
@APIParam(resourceType = VirtualRouterVmVO.class)
private String vmInstanceUuid;
diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterOfferingMsg.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterOfferingMsg.java
index 87467ff6095..341fe95c9ba 100755
--- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterOfferingMsg.java
+++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/APIUpdateVirtualRouterOfferingMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.image.ImageVO;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by frank on 7/31/2015.
@@ -16,6 +17,7 @@
method = HttpMethod.PUT,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateVirtualRouterOfferingMsg extends APIUpdateInstanceOfferingMsg {
private Boolean isDefault;
@APIParam(resourceType = ImageVO.class, required = false)
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APICreateVxlanVtepMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APICreateVxlanVtepMsg.java
index a1cc5a81037..c740bf2a38e 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APICreateVxlanVtepMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APICreateVxlanVtepMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.network.l2.L2NetworkMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/l2-networks/vxlan/vteps",
@@ -13,6 +14,7 @@
responseClass = APICreateVxlanVtepEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVxlanVtepMsg extends APICreateMessage implements L2NetworkMessage {
@APIParam(resourceType = HostVO.class)
private String hostUuid;
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APIQueryVtepMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APIQueryVtepMsg.java
index 24426a14f77..a59961e9a30 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APIQueryVtepMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vtep/APIQueryVtepMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by weiwang on 27/05/2017.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryVtepReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVtepMsg extends APIQueryMessage {
public static List __example__() {
return asList();
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APICreateL2VxlanNetworkMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APICreateL2VxlanNetworkMsg.java
index 141aa30719e..c4772a2c73b 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APICreateL2VxlanNetworkMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APICreateL2VxlanNetworkMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.zone.ZoneVO;
import org.zstack.network.l2.vxlan.vxlanNetworkPool.VxlanNetworkPoolVO;
+import org.zstack.header.vm.MetadataImpact;
@OverriddenApiParams({
@OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false)),
@@ -19,6 +20,7 @@
responseClass = APICreateL2VxlanNetworkEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateL2VxlanNetworkMsg extends APICreateL2NetworkMsg {
@APIParam(required = false, numberRange = {1, 16777214})
private Integer vni;
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APIQueryL2VxlanNetworkMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APIQueryL2VxlanNetworkMsg.java
index a7aaf9b01c8..48de03da585 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APIQueryL2VxlanNetworkMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetwork/APIQueryL2VxlanNetworkMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by weiwang on 15/03/2017.
@@ -20,6 +21,7 @@
method = HttpMethod.GET,
responseClass = APIQueryL2VxlanNetworkReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryL2VxlanNetworkMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateL2VxlanNetworkPoolMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateL2VxlanNetworkPoolMsg.java
index 9ccac6077d0..dda902e183b 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateL2VxlanNetworkPoolMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateL2VxlanNetworkPoolMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.message.OverriddenApiParams;
import org.zstack.header.network.l2.APICreateL2NetworkMsg;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@OverriddenApiParams({
@OverriddenApiParam(field = "physicalInterface", param = @APIParam(maxLength = 1024, required = false))
@@ -16,6 +17,7 @@
responseClass = APICreateL2VxlanNetworkPoolEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateL2VxlanNetworkPoolMsg extends APICreateL2NetworkMsg {
@Override
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVniRangeMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVniRangeMsg.java
index b48abcd0857..872265877e3 100755
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVniRangeMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVniRangeMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.network.l2.L2NetworkMessage;
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by weiwang on 09/03/2017.
@@ -18,6 +19,7 @@
responseClass = APICreateVniRangeEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVniRangeMsg extends APICreateMessage implements L2NetworkMessage, APIAuditor {
@APIParam(maxLength = 255)
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVxlanPoolRemoteVtepMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVxlanPoolRemoteVtepMsg.java
index 6871cb12344..385de0efe48 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVxlanPoolRemoteVtepMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APICreateVxlanPoolRemoteVtepMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.network.l2.L2NetworkMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
@@ -13,6 +14,7 @@
responseClass = APICreateVxlanPoolRemoteVtepEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APICreateVxlanPoolRemoteVtepMsg extends APICreateMessage implements L2NetworkMessage {
@APIParam
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVniRangeMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVniRangeMsg.java
index d7ff35489ea..7f77ac16f9f 100755
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVniRangeMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVniRangeMsg.java
@@ -10,6 +10,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by weiwang on 03/05/2017.
@@ -19,6 +20,7 @@
method = HttpMethod.DELETE,
responseClass = APIDeleteVniRangeEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteVniRangeMsg extends APIDeleteMessage implements L2NetworkMessage, APIAuditor {
@APIParam(resourceType = VniRangeVO.class, successIfResourceNotExisting = true)
private String uuid;
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVxlanPoolRemoteVtepMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVxlanPoolRemoteVtepMsg.java
index c8b8e13807f..0515383fbe7 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVxlanPoolRemoteVtepMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIDeleteVxlanPoolRemoteVtepMsg.java
@@ -5,12 +5,14 @@
import org.zstack.header.network.l2.L2NetworkMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.message.APIDeleteMessage;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/l2-networks/{l2NetworkUuid}/clusters/{clusterUuid}/delete/remote-vtep-ip",
method = HttpMethod.DELETE,
responseClass = APIDeleteVxlanPoolRemoteVtepEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIDeleteVxlanPoolRemoteVtepMsg extends APIDeleteMessage implements L2NetworkMessage {
@APIParam
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryL2VxlanNetworkPoolMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryL2VxlanNetworkPoolMsg.java
index 2661e9665a5..bacd6ac78ea 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryL2VxlanNetworkPoolMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryL2VxlanNetworkPoolMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by weiwang on 15/03/2017.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryL2VxlanNetworkPoolReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryL2VxlanNetworkPoolMsg extends APIQueryMessage {
public static List __example__() {
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryVniRangeMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryVniRangeMsg.java
index c7fef02c711..fed3a52444b 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryVniRangeMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIQueryVniRangeMsg.java
@@ -8,6 +8,7 @@
import java.util.List;
import static java.util.Arrays.asList;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by weiwang on 15/03/2017.
@@ -19,6 +20,7 @@
method = HttpMethod.GET,
responseClass = APIQueryVniRangeReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryVniRangeMsg extends APIQueryMessage {
public static List __example__() {
return asList();
diff --git a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIUpdateVniRangeMsg.java b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIUpdateVniRangeMsg.java
index 35bd3ca1a90..fed74c547eb 100644
--- a/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIUpdateVniRangeMsg.java
+++ b/plugin/vxlan/src/main/java/org/zstack/network/l2/vxlan/vxlanNetworkPool/APIUpdateVniRangeMsg.java
@@ -8,6 +8,7 @@
import org.zstack.header.other.APIAuditor;
import org.zstack.header.rest.APINoSee;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @author: kefeng.wang
@@ -19,6 +20,7 @@
responseClass = APIUpdateVniRangeEvent.class,
isAction = true
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateVniRangeMsg extends APIMessage implements L2NetworkMessage, APIAuditor {
@APIParam(resourceType = VniRangeVO.class)
private String uuid;
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIDeleteResourceConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIDeleteResourceConfigMsg.java
index fd43d66dac3..6aaa88a6f69 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIDeleteResourceConfigMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIDeleteResourceConfigMsg.java
@@ -6,10 +6,12 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vo.ResourceVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(path = "/resource-configurations/{category}/{name}/{resourceUuid}",
method = HttpMethod.DELETE,
responseClass = APIDeleteResourceConfigEvent.class)
+@MetadataImpact(MetadataImpact.Impact.CONFIG)
public class APIDeleteResourceConfigMsg extends APIDeleteMessage implements ResourceConfigMessage {
@APIParam
private String category;
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceBindableConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceBindableConfigMsg.java
index dd8d92b7bb5..b70e857691b 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceBindableConfigMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceBindableConfigMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by MaJin on 2019/2/23.
@@ -11,6 +12,7 @@
@RestRequest(path = "/resource-configurations/bindable",
optionalPaths = {"/resource-configurations/bindable/{category}"},
method = HttpMethod.GET, responseClass = APIGetResourceBindableConfigReply.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetResourceBindableConfigMsg extends APISyncCallMessage {
@APIParam(required = false)
private String category;
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigMsg.java
index 1133a6b8a3c..3c068844e22 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigMsg.java
@@ -6,6 +6,7 @@
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vo.ResourceVO;
+import org.zstack.header.vm.MetadataImpact;
/**
* Created by MaJin on 2019/2/23.
@@ -13,6 +14,7 @@
@RestRequest(path = "/resource-configurations/{resourceUuid}/{category}/{name}",
method = HttpMethod.GET, responseClass = APIGetResourceConfigReply.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetResourceConfigMsg extends APISyncCallMessage implements ResourceConfigMessage {
@APIParam
private String category;
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigsMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigsMsg.java
index 7950613273d..e5826b114bb 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigsMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIGetResourceConfigsMsg.java
@@ -8,9 +8,11 @@
import java.util.Arrays;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(path = "/resource-configurations/{resourceUuid}/{category}",
method = HttpMethod.GET, responseClass = APIGetResourceConfigsReply.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIGetResourceConfigsMsg extends APISyncCallMessage implements ResourceConfigMessage {
@APIParam
private String category;
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIQueryResourceConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIQueryResourceConfigMsg.java
index a5c8f646015..22b9a08f023 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIQueryResourceConfigMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIQueryResourceConfigMsg.java
@@ -7,9 +7,11 @@
import java.util.Collections;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(path = "/resource-configurations", method = HttpMethod.GET, responseClass = APIQueryResourceConfigReply.class)
@AutoQuery(replyClass = APIQueryResourceConfigReply.class, inventoryClass = ResourceConfigInventory.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIQueryResourceConfigMsg extends APIQueryMessage {
public static List __example__() {
return Collections.singletonList("category=host");
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java
index 1b8437d2404..4a4cf153b12 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigMsg.java
@@ -6,11 +6,13 @@
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
import org.zstack.header.vo.ResourceVO;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(path = "/resource-configurations/{category}/{name}/{resourceUuid}/actions",
method = HttpMethod.PUT,
isAction = true,
responseClass = APIUpdateResourceConfigEvent.class)
+@MetadataImpact(MetadataImpact.Impact.CONFIG)
public class APIUpdateResourceConfigMsg extends APIMessage implements ResourceConfigMessage {
@APIParam
private String category;
diff --git a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigsMsg.java b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigsMsg.java
index 74a6c261d0d..0e2169b50c7 100644
--- a/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigsMsg.java
+++ b/resourceconfig/src/main/java/org/zstack/resourceconfig/APIUpdateResourceConfigsMsg.java
@@ -9,6 +9,7 @@
import java.util.Arrays;
import java.util.List;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/resource-configurations/{resourceUuid}/resource-configs/actions",
@@ -16,6 +17,7 @@
parameterName = "params",
responseClass = APIUpdateResourceConfigsEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIUpdateResourceConfigsMsg extends APIMessage {
@PythonClassInventory
public static class ResourceConfigAO {
diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceAction.java
new file mode 100644
index 00000000000..1fb295bf5ae
--- /dev/null
+++ b/sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceAction.java
@@ -0,0 +1,113 @@
+package org.zstack.sdk;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.zstack.sdk.*;
+
+public class RegisterVmInstanceAction 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.RegisterVmInstanceResult 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 clusterUuid;
+
+ @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 primaryStorageUuid;
+
+ @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
+ public java.lang.String hostUuid;
+
+ @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
+ public java.lang.String metadataPath;
+
+ @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.RegisterVmInstanceResult value = res.getResult(org.zstack.sdk.RegisterVmInstanceResult.class);
+ ret.value = value == null ? new org.zstack.sdk.RegisterVmInstanceResult() : 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 = "/vm-instances/register";
+ info.needSession = true;
+ info.needPoll = true;
+ info.parameterName = "params";
+ return info;
+ }
+
+}
diff --git a/sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceResult.java b/sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceResult.java
new file mode 100644
index 00000000000..49510a84cb9
--- /dev/null
+++ b/sdk/src/main/java/org/zstack/sdk/RegisterVmInstanceResult.java
@@ -0,0 +1,14 @@
+package org.zstack.sdk;
+
+import org.zstack.sdk.VmInstanceInventory;
+
+public class RegisterVmInstanceResult {
+ public VmInstanceInventory inventory;
+ public void setInventory(VmInstanceInventory inventory) {
+ this.inventory = inventory;
+ }
+ public VmInstanceInventory getInventory() {
+ return this.inventory;
+ }
+
+}
diff --git a/search/src/main/java/org/zstack/query/APIBatchQueryMsg.java b/search/src/main/java/org/zstack/query/APIBatchQueryMsg.java
index 0ad91850f93..0235e89926d 100755
--- a/search/src/main/java/org/zstack/query/APIBatchQueryMsg.java
+++ b/search/src/main/java/org/zstack/query/APIBatchQueryMsg.java
@@ -3,9 +3,11 @@
import org.springframework.http.HttpMethod;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(path = "/batch-queries", method = HttpMethod.GET, responseClass = APIBatchQueryReply.class)
@Deprecated
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIBatchQueryMsg extends APISyncCallMessage {
private String script;
diff --git a/search/src/main/java/org/zstack/query/APIZQLQueryMsg.java b/search/src/main/java/org/zstack/query/APIZQLQueryMsg.java
index 7c153eaa25a..14795806507 100755
--- a/search/src/main/java/org/zstack/query/APIZQLQueryMsg.java
+++ b/search/src/main/java/org/zstack/query/APIZQLQueryMsg.java
@@ -3,8 +3,10 @@
import org.springframework.http.HttpMethod;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(path = "/zql", method = HttpMethod.GET, responseClass = APIZQLQueryReply.class)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIZQLQueryMsg extends APISyncCallMessage {
private String zql;
diff --git a/search/src/main/java/org/zstack/search/APIRefreshSearchIndexesMsg.java b/search/src/main/java/org/zstack/search/APIRefreshSearchIndexesMsg.java
index 10064236fa8..25ca14205dc 100644
--- a/search/src/main/java/org/zstack/search/APIRefreshSearchIndexesMsg.java
+++ b/search/src/main/java/org/zstack/search/APIRefreshSearchIndexesMsg.java
@@ -3,6 +3,7 @@
import org.springframework.http.HttpMethod;
import org.zstack.header.message.APISyncCallMessage;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
/**
* @ Author : yh.w
@@ -12,6 +13,7 @@
method = HttpMethod.GET,
responseClass = APIRefreshSearchIndexesReply.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIRefreshSearchIndexesMsg extends APISyncCallMessage {
public static APIRefreshSearchIndexesMsg __example__() {
diff --git a/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/APIAddSimulatorHostMsg.java b/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/APIAddSimulatorHostMsg.java
index 9b90fcb0ed2..70c0fa2317b 100755
--- a/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/APIAddSimulatorHostMsg.java
+++ b/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/APIAddSimulatorHostMsg.java
@@ -5,6 +5,7 @@
import org.zstack.header.host.APIAddHostMsg;
import org.zstack.header.message.APIParam;
import org.zstack.header.rest.RestRequest;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/hosts/simulators",
@@ -12,6 +13,7 @@
parameterName = "params",
responseClass = APIAddHostEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSimulatorHostMsg extends APIAddHostMsg {
@APIParam
private long memoryCapacity = 1000000000;
diff --git a/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/backup/APIAddSimulatorBackupStorageMsg.java b/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/backup/APIAddSimulatorBackupStorageMsg.java
index 57f741be93d..724c2ef6619 100755
--- a/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/backup/APIAddSimulatorBackupStorageMsg.java
+++ b/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/backup/APIAddSimulatorBackupStorageMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.backup.APIAddBackupStorageEvent;
import org.zstack.header.storage.backup.APIAddBackupStorageMsg;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
@@ -12,6 +13,7 @@
parameterName = "params",
responseClass = APIAddBackupStorageEvent.class
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSimulatorBackupStorageMsg extends APIAddBackupStorageMsg {
private long totalCapacity;
private long availableCapacity;
diff --git a/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/primary/APIAddSimulatorPrimaryStorageMsg.java b/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/primary/APIAddSimulatorPrimaryStorageMsg.java
index ab5739c5ed3..dadae84696d 100755
--- a/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/primary/APIAddSimulatorPrimaryStorageMsg.java
+++ b/simulator/simulatorHeader/src/main/java/org/zstack/header/simulator/storage/primary/APIAddSimulatorPrimaryStorageMsg.java
@@ -4,6 +4,7 @@
import org.zstack.header.rest.RestRequest;
import org.zstack.header.storage.primary.APIAddPrimaryStorageEvent;
import org.zstack.header.storage.primary.APIAddPrimaryStorageMsg;
+import org.zstack.header.vm.MetadataImpact;
@RestRequest(
path = "/primary-storage/simulators",
@@ -11,6 +12,7 @@
responseClass = APIAddPrimaryStorageEvent.class,
parameterName = "params"
)
+@MetadataImpact(MetadataImpact.Impact.NONE)
public class APIAddSimulatorPrimaryStorageMsg extends APIAddPrimaryStorageMsg {
private long totalCapacity = 100000000;
private long availableCapacity = 10000000;
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 b7f8cfbc24d..869e7133c26 100755
--- a/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java
+++ b/storage/src/main/java/org/zstack/storage/primary/PrimaryStorageBase.java
@@ -14,6 +14,8 @@
import org.zstack.core.cloudbus.CloudBusListCallBack;
import org.zstack.core.cloudbus.EventFacade;
import org.zstack.core.componentloader.PluginRegistry;
+import org.zstack.core.config.GlobalConfig;
+import org.zstack.core.config.GlobalConfigDefinition;
import org.zstack.core.db.*;
import org.zstack.core.db.SimpleQuery.Op;
import org.zstack.core.errorcode.ErrorFacade;
@@ -27,6 +29,7 @@
import org.zstack.core.trash.TrashType;
import org.zstack.core.workflow.FlowChainBuilder;
import org.zstack.core.workflow.ShareFlow;
+import org.zstack.core.workflow.ShareFlowChain;
import org.zstack.header.apimediator.ApiMessageInterceptionException;
import org.zstack.header.core.*;
import org.zstack.header.core.trash.CleanTrashResult;
@@ -49,16 +52,24 @@
import org.zstack.header.storage.primary.PrimaryStorageCanonicalEvent.PrimaryStorageDeletedData;
import org.zstack.header.storage.primary.PrimaryStorageCanonicalEvent.PrimaryStorageStatusChangedData;
import org.zstack.header.storage.snapshot.*;
+import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupRefVO;
+import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupVO;
+import org.zstack.header.tag.TagDefinition;
import org.zstack.header.vm.*;
import org.zstack.header.volume.*;
+import org.zstack.resourceconfig.BindResourceConfig;
import org.zstack.storage.volume.VolumeUtils;
+import org.zstack.tag.SystemTag;
+import org.zstack.utils.BeanUtils;
import org.zstack.utils.CollectionDSL;
import org.zstack.utils.DebugUtils;
import org.zstack.utils.Utils;
+import org.zstack.utils.gson.JSONObjectUtil;
import org.zstack.utils.logging.CLogger;
import javax.persistence.LockModeType;
import javax.persistence.TypedQuery;
+import java.lang.reflect.Field;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -177,6 +188,8 @@ public void setNewAdded(boolean newAdded) {
protected abstract void handle(GetVolumeSnapshotEncryptedOnPrimaryStorageMsg msg);
+ protected abstract void handle(GetVmInstanceMetadataFromPrimaryStorageMsg msg);
+
public PrimaryStorageBase(PrimaryStorageVO self) {
this.self = self;
}
@@ -935,6 +948,10 @@ protected void handleApiMessage(APIMessage msg) {
handle((APICleanUpStorageTrashOnPrimaryStorageMsg) msg);
} else if (msg instanceof APIAddStorageProtocolMsg) {
handle((APIAddStorageProtocolMsg) msg);
+ } else if (msg instanceof APIRegisterVmInstanceMsg) {
+ handle((APIRegisterVmInstanceMsg) msg);
+ } else if (msg instanceof APIGetVmInstanceMetadataFromPrimaryStorageMsg) {
+ handle((APIGetVmInstanceMetadataFromPrimaryStorageMsg) msg);
} else {
bus.dealWithUnknownMessage(msg);
}
@@ -1812,4 +1829,375 @@ protected ImageCacheVO createTemporaryImageCacheFromVolumeSnapshot(ImageInventor
private static String getDeduplicateError(String operationName) {
return String.format("an other %s task is running, cancel this operation", operationName);
}
+
+ private void handle(APIRegisterVmInstanceMsg msg) {
+ APIRegisterVmInstanceReply event = new APIRegisterVmInstanceReply(msg.getId());
+ thdf.chainSubmit(new ChainTask(msg) {
+ @Override
+ public String getSyncSignature() {
+ return String.format("register-vm-from-%s", msg.getMetadataPath());
+ }
+
+ @Override
+ public void run(SyncTaskChain chain) {
+ registerVmInstance(msg, new ReturnValueCompletion(chain, msg) {
+ @Override
+ public void success(VmInstanceInventory vmInstanceInventory) {
+ event.setInventory(vmInstanceInventory);
+ bus.publish(event);
+ chain.next();
+ }
+
+ @Override
+ public void fail(ErrorCode errorCode) {
+ bus.publish(event);
+ chain.next();
+ }
+ });
+ }
+
+ @Override
+ public String getName() {
+ return String.format("register-vm-from-%s", msg.getMetadataPath());
+ }
+ });
+ }
+
+ private void registerVmInstance(APIRegisterVmInstanceMsg msg, ReturnValueCompletion completion) {
+ FlowChain chain = new ShareFlowChain();
+ chain.setName("register-vm-from-metadata");
+ chain.then(new ShareFlow() {
+ VmMetadata vmMetadata;
+ VmInstanceInventory vmInstanceInventory;
+
+ @Override
+ public void setup() {
+ flow(new NoRollbackFlow() {
+ String __name__ = "read-metadata";
+
+ @Override
+ public void run(FlowTrigger trigger, Map data) {
+ ReadVmInstanceMetadataOnHypervisorMsg umsg = new ReadVmInstanceMetadataOnHypervisorMsg();
+ umsg.setHostUuid(msg.getHostUuid());
+ umsg.setMetadataPath(msg.getMetadataPath());
+ bus.makeTargetServiceIdByResourceUuid(umsg, HostConstant.SERVICE_ID, msg.getHostUuid());
+ bus.send(umsg, new CloudBusCallBack(msg) {
+ @Override
+ public void run(MessageReply r) {
+ if (!r.isSuccess()) {
+ trigger.fail(operr("failed to update vm[uuid=%s] on hypervisor.",
+ self.getUuid()).withCause(r.getError()));
+ return;
+ }
+ ReadVmInstanceMetadataOnHypervisorReply reply = r.castReply();
+ vmMetadata = JSONObjectUtil.toObject(reply.getMetadata(), VmMetadata.class);
+ trigger.next();
+ }
+ });
+ }
+ });
+
+ flow(new NoRollbackFlow() {
+ String __name__ = "register-volume";
+
+ @Override
+ public void run(FlowTrigger trigger, Map data) {
+ List volumesString = vmMetadata.volumeVOs;
+
+ List