Skip to content

Commit ab1b9a4

Browse files
committed
<feature>[vm]: add metadata SDK actions and testlib
Resolves: ZSV-11559 Change-Id: Ie71ae4242af1031164e34d3f55bf8d379a9f74ec
1 parent 2aa69f4 commit ab1b9a4

19 files changed

Lines changed: 871 additions & 2 deletions

compute/src/main/java/org/zstack/compute/vm/VmExpungeMetadataFlow.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public class VmExpungeMetadataFlow extends NoRollbackFlow {
3535

3636
@Override
3737
public void run(FlowTrigger trigger, Map data) {
38+
if (!VmGlobalConfig.VM_METADATA_ENABLED.value(Boolean.class)) {
39+
trigger.next();
40+
return;
41+
}
42+
3843
final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
3944
if (spec == null || spec.getVmInventory() == null) {
4045
logger.warn("[MetadataExpunge] missing VmInstanceSpec or VmInventory, skip metadata cleanup");

conf/db/zsv/V5.0.0__schema.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ CREATE TABLE IF NOT EXISTS `zstack`.`VmMetadataDirtyVO` (
139139
`lastOpDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
140140
`createDate` timestamp NOT NULL DEFAULT '1999-12-31 23:59:59',
141141
PRIMARY KEY (`vmInstanceUuid`),
142+
INDEX `idx_VmMetadataDirtyVO_unclaimed` (`managementNodeUuid`, `nextRetryTime`, `lastOpDate`),
142143
CONSTRAINT `fkVmMetadataDirtyVOVmInstanceEO` FOREIGN KEY (`vmInstanceUuid`) REFERENCES `VmInstanceEO` (`uuid`) ON DELETE CASCADE,
143144
CONSTRAINT `fkVmMetadataDirtyVOManagementNodeVO` FOREIGN KEY (`managementNodeUuid`) REFERENCES `ManagementNodeVO` (`uuid`) ON DELETE SET NULL
144145
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

header/src/main/java/org/zstack/header/vm/APIDestroyVmInstanceMsg.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
method = HttpMethod.DELETE,
4343
responseClass = APIDestroyVmInstanceEvent.class
4444
)
45-
@MetadataImpact(value = MetadataImpact.Impact.STORAGE, resolver = "VmUuidDirectResolver", field = "uuid", updateOnFailure = true)
45+
@MetadataImpact(value = MetadataImpact.Impact.CONFIG, resolver = "VmUuidDirectResolver", field = "uuid")
4646
public class APIDestroyVmInstanceMsg extends APIDeleteMessage implements VmInstanceMessage {
4747
/**
4848
* @desc vm uuid

header/src/main/java/org/zstack/header/vm/APIMigrateVmMsg.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
)
4646
@SkipVmTracer(replyClass = APIMigrateVmEvent.class)
4747
@DefaultTimeout(timeunit = TimeUnit.HOURS, value = 1)
48-
@MetadataImpact(value = MetadataImpact.Impact.STORAGE, resolver = "VmUuidDirectResolver", field = "vmInstanceUuid")
48+
@MetadataImpact(value = MetadataImpact.Impact.CONFIG, resolver = "VmUuidDirectResolver", field = "vmInstanceUuid")
4949
public class APIMigrateVmMsg extends APIMessage implements VmInstanceMessage, MigrateVmMessage, CheckAttachedVolumesMessage {
5050
/**
5151
* @desc vm uuid

sdk/src/main/java/SourceClassMap.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ public class SourceClassMap {
255255
put("org.zstack.header.storage.primary.PrimaryStorageInventory", "org.zstack.sdk.PrimaryStorageInventory");
256256
put("org.zstack.header.storage.primary.ReconnectResult", "org.zstack.sdk.ReconnectResult");
257257
put("org.zstack.header.storage.primary.UsageReport", "org.zstack.sdk.UsageReport");
258+
put("org.zstack.header.storage.primary.VmMetadataScanEntry", "org.zstack.sdk.VmMetadataScanEntry");
258259
put("org.zstack.header.storage.snapshot.BatchDeleteVolumeSnapshotStruct", "org.zstack.sdk.BatchDeleteVolumeSnapshotStruct");
259260
put("org.zstack.header.storage.snapshot.ShrinkResult", "org.zstack.sdk.ShrinkResult");
260261
put("org.zstack.header.storage.snapshot.VolumeSnapshotBackupStorageRefInventory", "org.zstack.sdk.VolumeSnapshotBackupStorageRefInventory");
@@ -1184,6 +1185,7 @@ public class SourceClassMap {
11841185
put("org.zstack.sdk.VmInstanceResourceMetadataGroupInventory", "org.zstack.header.vm.devices.VmInstanceResourceMetadataGroupInventory");
11851186
put("org.zstack.sdk.VmMemoryBillingInventory", "org.zstack.billing.generator.vm.memory.VmMemoryBillingInventory");
11861187
put("org.zstack.sdk.VmMemorySpendingDetails", "org.zstack.billing.spendingcalculator.vm.VmMemorySpendingDetails");
1188+
put("org.zstack.sdk.VmMetadataScanEntry", "org.zstack.header.storage.primary.VmMetadataScanEntry");
11871189
put("org.zstack.sdk.VmNicBandwidthSpendingDetails", "org.zstack.billing.spendingcalculator.vmnic.VmNicBandwidthSpendingDetails");
11881190
put("org.zstack.sdk.VmNicConflictEntry", "org.zstack.header.storage.snapshot.group.VmNicConflictEntry");
11891191
put("org.zstack.sdk.VmNicInventory", "org.zstack.header.vm.VmNicInventory");
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package org.zstack.sdk;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import org.zstack.sdk.*;
6+
7+
public class CleanupVmInstanceMetadataAction extends AbstractAction {
8+
9+
private static final HashMap<String, Parameter> parameterMap = new HashMap<>();
10+
11+
private static final HashMap<String, Parameter> nonAPIParameterMap = new HashMap<>();
12+
13+
public static class Result {
14+
public ErrorCode error;
15+
public org.zstack.sdk.CleanupVmInstanceMetadataResult value;
16+
17+
public Result throwExceptionIfError() {
18+
if (error != null) {
19+
throw new ApiException(
20+
String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details)
21+
);
22+
}
23+
24+
return this;
25+
}
26+
}
27+
28+
@Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false)
29+
public java.util.List vmUuids;
30+
31+
@Param(required = false)
32+
public java.util.List systemTags;
33+
34+
@Param(required = false)
35+
public java.util.List userTags;
36+
37+
@Param(required = false)
38+
public String sessionId;
39+
40+
@Param(required = false)
41+
public String accessKeyId;
42+
43+
@Param(required = false)
44+
public String accessKeySecret;
45+
46+
@Param(required = false)
47+
public String requestIp;
48+
49+
@NonAPIParam
50+
public long timeout = -1;
51+
52+
@NonAPIParam
53+
public long pollingInterval = -1;
54+
55+
56+
private Result makeResult(ApiResult res) {
57+
Result ret = new Result();
58+
if (res.error != null) {
59+
ret.error = res.error;
60+
return ret;
61+
}
62+
63+
org.zstack.sdk.CleanupVmInstanceMetadataResult value = res.getResult(org.zstack.sdk.CleanupVmInstanceMetadataResult.class);
64+
ret.value = value == null ? new org.zstack.sdk.CleanupVmInstanceMetadataResult() : value;
65+
66+
return ret;
67+
}
68+
69+
public Result call() {
70+
ApiResult res = ZSClient.call(this);
71+
return makeResult(res);
72+
}
73+
74+
public void call(final Completion<Result> completion) {
75+
ZSClient.call(this, new InternalCompletion() {
76+
@Override
77+
public void complete(ApiResult res) {
78+
completion.complete(makeResult(res));
79+
}
80+
});
81+
}
82+
83+
protected Map<String, Parameter> getParameterMap() {
84+
return parameterMap;
85+
}
86+
87+
protected Map<String, Parameter> getNonAPIParameterMap() {
88+
return nonAPIParameterMap;
89+
}
90+
91+
protected RestInfo getRestInfo() {
92+
RestInfo info = new RestInfo();
93+
info.httpMethod = "PUT";
94+
info.path = "/vm-instances/metadata/cleanup";
95+
info.needSession = true;
96+
info.needPoll = true;
97+
info.parameterName = "cleanupVmInstanceMetadata";
98+
return info;
99+
}
100+
101+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.zstack.sdk;
2+
3+
4+
5+
public class CleanupVmInstanceMetadataResult {
6+
public java.lang.Integer totalCleaned;
7+
public void setTotalCleaned(java.lang.Integer totalCleaned) {
8+
this.totalCleaned = totalCleaned;
9+
}
10+
public java.lang.Integer getTotalCleaned() {
11+
return this.totalCleaned;
12+
}
13+
14+
public java.lang.Integer totalFailed;
15+
public void setTotalFailed(java.lang.Integer totalFailed) {
16+
this.totalFailed = totalFailed;
17+
}
18+
public java.lang.Integer getTotalFailed() {
19+
return this.totalFailed;
20+
}
21+
22+
public java.util.List failedVmUuids;
23+
public void setFailedVmUuids(java.util.List failedVmUuids) {
24+
this.failedVmUuids = failedVmUuids;
25+
}
26+
public java.util.List getFailedVmUuids() {
27+
return this.failedVmUuids;
28+
}
29+
30+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package org.zstack.sdk;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import org.zstack.sdk.*;
6+
7+
public class GetVmInstanceMetadataFromPrimaryStorageAction extends AbstractAction {
8+
9+
private static final HashMap<String, Parameter> parameterMap = new HashMap<>();
10+
11+
private static final HashMap<String, Parameter> nonAPIParameterMap = new HashMap<>();
12+
13+
public static class Result {
14+
public ErrorCode error;
15+
public org.zstack.sdk.GetVmInstanceMetadataFromPrimaryStorageResult value;
16+
17+
public Result throwExceptionIfError() {
18+
if (error != null) {
19+
throw new ApiException(
20+
String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details)
21+
);
22+
}
23+
24+
return this;
25+
}
26+
}
27+
28+
@Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
29+
public java.lang.String uuid;
30+
31+
@Param(required = false)
32+
public java.util.List systemTags;
33+
34+
@Param(required = false)
35+
public java.util.List userTags;
36+
37+
@Param(required = false)
38+
public String sessionId;
39+
40+
@Param(required = false)
41+
public String accessKeyId;
42+
43+
@Param(required = false)
44+
public String accessKeySecret;
45+
46+
@Param(required = false)
47+
public String requestIp;
48+
49+
@NonAPIParam
50+
public long timeout = -1;
51+
52+
@NonAPIParam
53+
public long pollingInterval = -1;
54+
55+
56+
private Result makeResult(ApiResult res) {
57+
Result ret = new Result();
58+
if (res.error != null) {
59+
ret.error = res.error;
60+
return ret;
61+
}
62+
63+
org.zstack.sdk.GetVmInstanceMetadataFromPrimaryStorageResult value = res.getResult(org.zstack.sdk.GetVmInstanceMetadataFromPrimaryStorageResult.class);
64+
ret.value = value == null ? new org.zstack.sdk.GetVmInstanceMetadataFromPrimaryStorageResult() : value;
65+
66+
return ret;
67+
}
68+
69+
public Result call() {
70+
ApiResult res = ZSClient.call(this);
71+
return makeResult(res);
72+
}
73+
74+
public void call(final Completion<Result> completion) {
75+
ZSClient.call(this, new InternalCompletion() {
76+
@Override
77+
public void complete(ApiResult res) {
78+
completion.complete(makeResult(res));
79+
}
80+
});
81+
}
82+
83+
protected Map<String, Parameter> getParameterMap() {
84+
return parameterMap;
85+
}
86+
87+
protected Map<String, Parameter> getNonAPIParameterMap() {
88+
return nonAPIParameterMap;
89+
}
90+
91+
protected RestInfo getRestInfo() {
92+
RestInfo info = new RestInfo();
93+
info.httpMethod = "GET";
94+
info.path = "/primary-storage/vm-instances/metadata";
95+
info.needSession = true;
96+
info.needPoll = true;
97+
info.parameterName = "";
98+
return info;
99+
}
100+
101+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.zstack.sdk;
2+
3+
4+
5+
public class GetVmInstanceMetadataFromPrimaryStorageResult {
6+
public java.lang.String metadata;
7+
public void setMetadata(java.lang.String metadata) {
8+
this.metadata = metadata;
9+
}
10+
public java.lang.String getMetadata() {
11+
return this.metadata;
12+
}
13+
14+
}

0 commit comments

Comments
 (0)