Skip to content
Merged
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
6 changes: 3 additions & 3 deletions conf/springConfigXml/Kvm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@
<zstack:plugin>
<zstack:extension interface="org.zstack.header.console.ConsoleHypervisorBackend"/>
</zstack:plugin>
</bean>
<bean id="KVMApiInterceptor" class="org.zstack.kvm.KVMApiInterceptor">
</bean>

<bean id="KVMApiInterceptor" class="org.zstack.kvm.KVMApiInterceptor">
<zstack:plugin>
<zstack:extension interface="org.zstack.header.apimediator.ApiMessageInterceptor"/>
<zstack:extension interface="org.zstack.header.apimediator.GlobalApiMessageInterceptor" />
Expand Down
22 changes: 22 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 @@ -90,6 +90,28 @@ public static class UpdateVmPriorityCmd extends AgentCommand {
public static class UpdateVmPriorityRsp extends AgentResponse {
}

public static class VmShmemDevice {
public String name;
public String path;
public long size;
}

public static class HotPlugVmShmemCmd extends AgentCommand {
public String vmUuid;
public VmShmemDevice shmem;
}

public static class HotPlugVmShmemRsp extends AgentResponse {
}

public static class HotUnplugVmShmemCmd extends AgentCommand {
public String vmUuid;
public VmShmemDevice shmem;
}

public static class HotUnplugVmShmemRsp extends AgentResponse {
}

public static class ChangeVmNicStateCommand extends AgentCommand {
@GrayVersion(value = "5.0.0")
private String vmUuid;
Expand Down
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 @@ -67,6 +67,8 @@ public interface KVMConstant {
String KVM_DETACH_VOLUME = "/vm/detachdatavolume";
String KVM_ATTACH_NIC_PATH = "/vm/attachnic";
String KVM_DETACH_NIC_PATH = "/vm/detachnic";
String KVM_VM_SHMEM_HOTPLUG_PATH = "/vm/shmem/hotplug";
String KVM_VM_SHMEM_HOTUNPLUG_PATH = "/vm/shmem/hotunplug";
String KVM_CHANGE_NIC_STATE_PATH = "/vm/changenicstate";
String KVM_UPDATE_NIC_PATH = "/vm/updatenic";
String KVM_SET_VF_NIC_MAC_PATH = "/vm/setvfnicmac";
Expand Down
45 changes: 45 additions & 0 deletions plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import org.zstack.header.core.workflow.*;
import org.zstack.header.errorcode.ErrorCode;
import org.zstack.header.errorcode.ErrorCodeList;
import org.zstack.header.errorcode.ErrorableValue;
import org.zstack.header.errorcode.OperationFailureException;
import org.zstack.header.errorcode.SysErrors;
import org.zstack.header.exception.CloudRuntimeException;
Expand Down Expand Up @@ -634,6 +635,10 @@ protected void handleLocalMessage(Message msg) {
handle((CheckSnapshotOnHypervisorMsg) msg);
} else if (msg instanceof MergeVolumeSnapshotOnKvmMsg) {
handle((MergeVolumeSnapshotOnKvmMsg) msg);
} else if (msg instanceof KVMHotPlugVmShmemMsg) {
handle((KVMHotPlugVmShmemMsg) msg);
} else if (msg instanceof KVMHotUnplugVmShmemMsg) {
handle((KVMHotUnplugVmShmemMsg) msg);
} else if (msg instanceof KVMHostAsyncHttpCallMsg) {
handle((KVMHostAsyncHttpCallMsg) msg);
} else if (msg instanceof KVMHostSyncHttpCallMsg) {
Expand Down Expand Up @@ -2708,6 +2713,46 @@ public void done() {
);
}

private void handle(final KVMHotPlugVmShmemMsg msg) {
KVMAgentCommands.HotPlugVmShmemCmd cmd = new KVMAgentCommands.HotPlugVmShmemCmd();
cmd.vmUuid = msg.getVmUuid();
cmd.shmem = msg.getShmem();

sendVmShmemCommand(msg, cmd, KVMConstant.KVM_VM_SHMEM_HOTPLUG_PATH,
KVMAgentCommands.HotPlugVmShmemRsp.class);
}

private void handle(final KVMHotUnplugVmShmemMsg msg) {
KVMAgentCommands.HotUnplugVmShmemCmd cmd = new KVMAgentCommands.HotUnplugVmShmemCmd();
cmd.vmUuid = msg.getVmUuid();
cmd.shmem = msg.getShmem();

sendVmShmemCommand(msg, cmd, KVMConstant.KVM_VM_SHMEM_HOTUNPLUG_PATH,
KVMAgentCommands.HotUnplugVmShmemRsp.class);
}

private <T extends AgentResponse> void sendVmShmemCommand(NeedReplyMessage origin,
Object cmd,
String path,
Class<T> responseClass) {
KVMHostAsyncHttpCallMsg kmsg = new KVMHostAsyncHttpCallMsg();
kmsg.setCommand(cmd);
kmsg.setHostUuid(((HostMessage) origin).getHostUuid());
kmsg.setPath(path);
bus.makeTargetServiceIdByResourceUuid(kmsg, HostConstant.SERVICE_ID, ((HostMessage) origin).getHostUuid());
bus.send(kmsg, new CloudBusCallBack(origin) {
@Override
public void run(MessageReply reply) {
ErrorableValue<T> response = KVMHostAsyncHttpCallReply.unwrap(reply, responseClass);
MessageReply ret = new MessageReply();
if (!response.isSuccess()) {
ret.setError(response.error);
}
bus.reply(origin, ret);
}
});
}

private String buildUrl(String path) {
UriComponentsBuilder ub = UriComponentsBuilder.newInstance();
ub.scheme(KVMGlobalProperty.AGENT_URL_SCHEME);
Expand Down
35 changes: 35 additions & 0 deletions plugin/kvm/src/main/java/org/zstack/kvm/KVMHotPlugVmShmemMsg.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.zstack.kvm;

import org.zstack.header.host.HostMessage;
import org.zstack.header.message.NeedReplyMessage;

public class KVMHotPlugVmShmemMsg extends NeedReplyMessage implements HostMessage {
private String hostUuid;
private String vmUuid;
private KVMAgentCommands.VmShmemDevice shmem;

@Override
public String getHostUuid() {
return hostUuid;
}

public void setHostUuid(String hostUuid) {
this.hostUuid = hostUuid;
}

public String getVmUuid() {
return vmUuid;
}

public void setVmUuid(String vmUuid) {
this.vmUuid = vmUuid;
}

public KVMAgentCommands.VmShmemDevice getShmem() {
return shmem;
}

public void setShmem(KVMAgentCommands.VmShmemDevice shmem) {
this.shmem = shmem;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.zstack.kvm;

import org.zstack.header.host.HostMessage;
import org.zstack.header.message.NeedReplyMessage;

public class KVMHotUnplugVmShmemMsg extends NeedReplyMessage implements HostMessage {
private String hostUuid;
private String vmUuid;
private KVMAgentCommands.VmShmemDevice shmem;

@Override
public String getHostUuid() {
return hostUuid;
}

public void setHostUuid(String hostUuid) {
this.hostUuid = hostUuid;
}

public String getVmUuid() {
return vmUuid;
}

public void setVmUuid(String vmUuid) {
this.vmUuid = vmUuid;
}

public KVMAgentCommands.VmShmemDevice getShmem() {
return shmem;
}

public void setShmem(KVMAgentCommands.VmShmemDevice shmem) {
this.shmem = shmem;
}
}
113 changes: 113 additions & 0 deletions sdk/src/main/java/org/zstack/sdk/AttachDGpuToVmAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package org.zstack.sdk;

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

public class AttachDGpuToVmAction 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.AttachDGpuToVmResult 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 dgpuProfileUuid;

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

@Param(required = true, validValues = {"BySpec","ByDevice"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false)
public java.lang.String chooser;

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

@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.AttachDGpuToVmResult value = res.getResult(org.zstack.sdk.AttachDGpuToVmResult.class);
ret.value = value == null ? new org.zstack.sdk.AttachDGpuToVmResult() : 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 = "/vm-instances/{vmInstanceUuid}/actions";
info.needSession = true;
info.needPoll = true;
info.parameterName = "attachDGpuToVm";
return info;
}

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

import org.zstack.sdk.DGpuDeviceInventory;

public class AttachDGpuToVmResult {
public DGpuDeviceInventory inventory;
public void setInventory(DGpuDeviceInventory inventory) {
this.inventory = inventory;
}
public DGpuDeviceInventory getInventory() {
return this.inventory;
}

}
6 changes: 3 additions & 3 deletions test/src/test/resources/springConfigXml/Kvm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@
<zstack:plugin>
<zstack:extension interface="org.zstack.header.console.ConsoleHypervisorBackend"/>
</zstack:plugin>
</bean>
<bean id="KVMApiInterceptor" class="org.zstack.kvm.KVMApiInterceptor">
</bean>

<bean id="KVMApiInterceptor" class="org.zstack.kvm.KVMApiInterceptor">
<zstack:plugin>
<zstack:extension interface="org.zstack.header.apimediator.ApiMessageInterceptor"/>
<zstack:extension interface="org.zstack.header.apimediator.GlobalApiMessageInterceptor" />
Expand Down
27 changes: 27 additions & 0 deletions testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -18539,6 +18539,33 @@ abstract class ApiHelper {
}


def attachDGpuToVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AttachDGpuToVmAction.class) Closure c) {
def a = new org.zstack.sdk.AttachDGpuToVmAction()
a.sessionId = Test.currentEnvSpec?.session?.uuid
c.resolveStrategy = Closure.OWNER_FIRST
c.delegate = a
c()


if (System.getProperty("apipath") != null) {
if (a.apiId == null) {
a.apiId = Platform.uuid
}

def tracker = new ApiPathTracker(a.apiId)
def out = errorOut(a.call())
def path = tracker.getApiPath()
if (!path.isEmpty()) {
Test.apiPaths[a.class.name] = path.join(" --->\n")
}

return out
} else {
return errorOut(a.call())
}
}


def detachBaremetalPxeServerFromCluster(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DetachBaremetalPxeServerFromClusterAction.class) Closure c) {
def a = new org.zstack.sdk.DetachBaremetalPxeServerFromClusterAction()
a.sessionId = Test.currentEnvSpec?.session?.uuid
Expand Down