Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion conf/db/upgrade/V5.5.12__schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,21 @@ END $$
DELIMITER ;

CALL ModifyUsedIpVOForeignKey();
DROP PROCEDURE IF EXISTS ModifyUsedIpVOForeignKey;
DROP PROCEDURE IF EXISTS ModifyUsedIpVOForeignKey;

-- ZSTAC-83157: Add VM model mount feature
CREATE TABLE IF NOT EXISTS `zstack`.`VmModelMountVO` (
`uuid` VARCHAR(32) NOT NULL,
`vmInstanceUuid` VARCHAR(32) NOT NULL,
`modelUuid` VARCHAR(32) NOT NULL,
`modelName` VARCHAR(256) NOT NULL,
`juicefsSubdir` VARCHAR(512) NOT NULL,
`mountPath` VARCHAR(512) NOT NULL,
`status` VARCHAR(32) NOT NULL,
`createDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastOpDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`uuid`),
KEY `idx_vm` (`vmInstanceUuid`),
CONSTRAINT `fk_VmModelMount_vm` FOREIGN KEY (`vmInstanceUuid`)
REFERENCES `VmInstanceEO`(`uuid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
92 changes: 92 additions & 0 deletions plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -5205,4 +5205,96 @@ public void setMemoryUsage(long memoryUsage) {
}
}

public static class KvmAttachModelCmd extends AgentCommand {
@GrayVersion(value = "5.5.12")
private String vmInstanceUuid;
@GrayVersion(value = "5.5.12")
private String zdfsUrl;
@GrayVersion(value = "5.5.12")
private String juicefsSubdir;
@GrayVersion(value = "5.5.12")
private String mountPath;

public String getVmInstanceUuid() {
return vmInstanceUuid;
}

public void setVmInstanceUuid(String vmInstanceUuid) {
this.vmInstanceUuid = vmInstanceUuid;
}

public String getZdfsUrl() {
return zdfsUrl;
}

public void setZdfsUrl(String zdfsUrl) {
this.zdfsUrl = zdfsUrl;
}

public String getJuicefsSubdir() {
return juicefsSubdir;
}

public void setJuicefsSubdir(String juicefsSubdir) {
this.juicefsSubdir = juicefsSubdir;
}

public String getMountPath() {
return mountPath;
}

public void setMountPath(String mountPath) {
this.mountPath = mountPath;
}
}

public static class KvmAttachModelResponse extends AgentResponse {
@GrayVersion(value = "5.5.12")
private String status;

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}
}

public static class KvmDetachModelCmd extends AgentCommand {
@GrayVersion(value = "5.5.12")
private String vmInstanceUuid;
@GrayVersion(value = "5.5.12")
private String mountPath;

public String getVmInstanceUuid() {
return vmInstanceUuid;
}

public void setVmInstanceUuid(String vmInstanceUuid) {
this.vmInstanceUuid = vmInstanceUuid;
}

public String getMountPath() {
return mountPath;
}

public void setMountPath(String mountPath) {
this.mountPath = mountPath;
}
}

public static class KvmDetachModelResponse extends AgentResponse {
@GrayVersion(value = "5.5.12")
private String status;

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}
}

}
2 changes: 2 additions & 0 deletions plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ public interface KVMConstant {
String KVM_REGISTER_PRIMARY_VM_HEARTBEAT = "/register/primary/vm/heartbeat";
String CLEAN_FIRMWARE_FLASH = "/clean/firmware/flash";
String FSTRIM_VM_PATH = "/vm/fstrim";
String KVM_ATTACH_AI_MODEL_PATH = "/aimodel/attach";
String KVM_DETACH_AI_MODEL_PATH = "/aimodel/detach";

String ISO_TO = "kvm.isoto";
String ANSIBLE_PLAYBOOK_NAME = "kvm.py";
Expand Down
2 changes: 2 additions & 0 deletions sdk/src/main/java/SourceClassMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class SourceClassMap {
put("org.zstack.ai.entity.ModelServiceRefInventory", "org.zstack.sdk.ModelServiceRefInventory");
put("org.zstack.ai.entity.ModelServiceTemplateInventory", "org.zstack.sdk.ModelServiceTemplateInventory");
put("org.zstack.ai.entity.TrainedModelRecordInventory", "org.zstack.sdk.TrainedModelRecordInventory");
put("org.zstack.ai.entity.VmModelMountInventory", "org.zstack.sdk.VmModelMountInventory");
put("org.zstack.ai.message.ArchitectureImageMapping", "org.zstack.sdk.ArchitectureImageMapping");
put("org.zstack.ai.message.MaaSUsage", "org.zstack.sdk.MaaSUsage");
put("org.zstack.ai.message.ModelCenterServiceInventory", "org.zstack.sdk.ModelCenterServiceInventory");
Expand Down Expand Up @@ -1549,6 +1550,7 @@ public class SourceClassMap {
put("org.zstack.sdk.VmInstancePciDeviceSpecRefInventory", "org.zstack.pciDevice.specification.pci.VmInstancePciDeviceSpecRefInventory");
put("org.zstack.sdk.VmMemoryBillingInventory", "org.zstack.billing.generator.vm.memory.VmMemoryBillingInventory");
put("org.zstack.sdk.VmMemorySpendingDetails", "org.zstack.billing.spendingcalculator.vm.VmMemorySpendingDetails");
put("org.zstack.sdk.VmModelMountInventory", "org.zstack.ai.entity.VmModelMountInventory");
put("org.zstack.sdk.VmNicBandwidthSpendingDetails", "org.zstack.billing.spendingcalculator.vmnic.VmNicBandwidthSpendingDetails");
put("org.zstack.sdk.VmNicInventory", "org.zstack.header.vm.VmNicInventory");
put("org.zstack.sdk.VmNicSecurityGroupRefInventory", "org.zstack.network.securitygroup.VmNicSecurityGroupRefInventory");
Expand Down
107 changes: 107 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package org.zstack.sdk;

import java.util.HashMap;
import java.util.Map;
import org.zstack.sdk.*;

public class MountModelToVmInstanceAction extends AbstractAction {

private static final HashMap<String, Parameter> parameterMap = new HashMap<>();

private static final HashMap<String, Parameter> nonAPIParameterMap = new HashMap<>();

public static class Result {
public ErrorCode error;
public org.zstack.sdk.MountModelToVmInstanceResult value;

public Result throwExceptionIfError() {
if (error != null) {
throw new ApiException(
String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode)
);
}

return this;
}
}

@Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
public java.lang.String vmInstanceUuid;

@Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
public java.lang.String modelUuid;

@Param(required = false, maxLength = 512, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
public java.lang.String mountPath;

@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.MountModelToVmInstanceResult value = res.getResult(org.zstack.sdk.MountModelToVmInstanceResult.class);
ret.value = value == null ? new org.zstack.sdk.MountModelToVmInstanceResult() : value;

return ret;
}

public Result call() {
ApiResult res = ZSClient.call(this);
return makeResult(res);
}

public void call(final Completion<Result> completion) {
ZSClient.call(this, new InternalCompletion() {
@Override
public void complete(ApiResult res) {
completion.complete(makeResult(res));
}
});
}

protected Map<String, Parameter> getParameterMap() {
return parameterMap;
}

protected Map<String, Parameter> getNonAPIParameterMap() {
return nonAPIParameterMap;
}

protected RestInfo getRestInfo() {
RestInfo info = new RestInfo();
info.httpMethod = "PUT";
info.path = "/ai/models/{modelUuid}/vm-instances/{vmInstanceUuid}/actions";
info.needSession = true;
info.needPoll = true;
info.parameterName = "mountModelToVmInstance";
return info;
}

}
14 changes: 14 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/MountModelToVmInstanceResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.zstack.sdk;

import org.zstack.sdk.VmModelMountInventory;

public class MountModelToVmInstanceResult {
public VmModelMountInventory inventory;
public void setInventory(VmModelMountInventory inventory) {
this.inventory = inventory;
}
public VmModelMountInventory getInventory() {
return this.inventory;
}

}
75 changes: 75 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/QueryVmModelMountAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package org.zstack.sdk;

import java.util.HashMap;
import java.util.Map;
import org.zstack.sdk.*;

public class QueryVmModelMountAction extends QueryAction {

private static final HashMap<String, Parameter> parameterMap = new HashMap<>();

private static final HashMap<String, Parameter> nonAPIParameterMap = new HashMap<>();

public static class Result {
public ErrorCode error;
public org.zstack.sdk.QueryVmModelMountResult value;

public Result throwExceptionIfError() {
if (error != null) {
throw new ApiException(
String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode)
);
}

return this;
}
}



private Result makeResult(ApiResult res) {
Result ret = new Result();
if (res.error != null) {
ret.error = res.error;
return ret;
}

org.zstack.sdk.QueryVmModelMountResult value = res.getResult(org.zstack.sdk.QueryVmModelMountResult.class);
ret.value = value == null ? new org.zstack.sdk.QueryVmModelMountResult() : value;

return ret;
}

public Result call() {
ApiResult res = ZSClient.call(this);
return makeResult(res);
}

public void call(final Completion<Result> completion) {
ZSClient.call(this, new InternalCompletion() {
@Override
public void complete(ApiResult res) {
completion.complete(makeResult(res));
}
});
}

protected Map<String, Parameter> getParameterMap() {
return parameterMap;
}

protected Map<String, Parameter> getNonAPIParameterMap() {
return nonAPIParameterMap;
}

protected RestInfo getRestInfo() {
RestInfo info = new RestInfo();
info.httpMethod = "GET";
info.path = "/ai/vm-model-mounts";
info.needSession = true;
info.needPoll = false;
info.parameterName = "";
return info;
}

}
22 changes: 22 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/QueryVmModelMountResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.zstack.sdk;



public class QueryVmModelMountResult {
public java.util.List inventories;
public void setInventories(java.util.List inventories) {
this.inventories = inventories;
}
public java.util.List getInventories() {
return this.inventories;
}

public java.lang.Long total;
public void setTotal(java.lang.Long total) {
this.total = total;
}
public java.lang.Long getTotal() {
return this.total;
}

}
Loading