From fc4fd4bd60d6fc63dc8bf36203239f4db5870168 Mon Sep 17 00:00:00 2001 From: "pengchao.liu" Date: Tue, 19 Mar 2024 14:55:42 +0800 Subject: [PATCH] [sriov]: feature-5.1.0-sriov-live-migration DBImpact Resolves: ZSTAC-63816 Change-Id: I6265696663776d636a6464706c69616562767a78 --- .../org/zstack/compute/vm/VmInstanceBase.java | 4 + .../vm/VmInstanceExtensionPointEmitter.java | 24 ++++ .../compute/vm/VmInstanceManagerImpl.java | 5 + .../vm/VmMigratePostCallExtensionFlow.java | 49 +++++++++ .../zstack/compute/vm/VmNicManagerImpl.java | 5 +- conf/db/upgrade/V5.1.0__schema.sql | 2 + .../zstack/console/ConsoleManagerImpl.java | 5 + .../l3/UsedIpInventoryDoc_zh_cn.groovy | 26 ++--- .../vm/VmInstanceMigrateExtensionPoint.java | 7 ++ .../network/service/flat/FlatDhcpBackend.java | 5 + .../network/service/flat/FlatEipBackend.java | 5 + .../service/flat/FlatUserdataBackend.java | 5 + .../zstack/iscsi/kvm/KvmIscsiNodeServer.java | 5 + .../src/main/java/org/zstack/kvm/KVMHost.java | 8 +- .../KvmHypervisorInfoExtensions.java | 9 ++ .../SecurityGroupManagerImpl.java | 5 + .../network/TfMigrateVmBackend.java | 5 + .../userdata/TfUserdataBackend.java | 5 + .../VirtualRouterCentralizedDnsBackend.java | 5 + .../zstack/sdk/ChangeVfNicHaStateAction.java | 104 ++++++++++++++++++ .../zstack/sdk/ChangeVfNicHaStateResult.java | 14 +++ .../java/org/zstack/sdk/VmVfNicInventory.java | 8 ++ .../ExternalPrimaryStorageFactory.java | 4 + .../java/org/zstack/testlib/ApiHelper.groovy | 27 +++++ 24 files changed, 323 insertions(+), 18 deletions(-) create mode 100644 compute/src/main/java/org/zstack/compute/vm/VmMigratePostCallExtensionFlow.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateResult.java diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 3d7e87e05bc..3ea7e3cae13 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -46,6 +46,8 @@ import org.zstack.header.message.*; import org.zstack.header.network.l3.*; import org.zstack.header.storage.primary.*; +import org.zstack.header.tag.SystemTagVO; +import org.zstack.header.tag.SystemTagVO_; import org.zstack.header.vm.*; import org.zstack.header.vm.ChangeVmMetaDataMsg.AtomicHostUuid; import org.zstack.header.vm.ChangeVmMetaDataMsg.AtomicVmState; @@ -6837,6 +6839,8 @@ public void done() { } }); + chain.then(new VmMigratePostCallExtensionFlow()); + chain.done(new FlowDoneHandler(completion) { @Override public void handle(final Map data) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java index ce9d5c49dfc..3f05006cff7 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceExtensionPointEmitter.java @@ -352,6 +352,30 @@ public void beforeMigrateVm(final VmInstanceInventory inv, final String dstHostU CollectionUtils.safeForEach(migrateVmExtensions, arg -> arg.beforeMigrateVm(inv, dstHostUuid)); } + public void postMigrateVm(final VmInstanceInventory inv, final String dstHostUuid, Completion completion) { + new While<>(migrateVmExtensions).each((ext, comp) -> ext.postMigrateVm(inv, dstHostUuid, new Completion(comp) { + @Override + public void success() { + comp.done(); + } + + @Override + public void fail(ErrorCode errorCode) { + comp.addError(errorCode); + comp.allDone(); + } + })).run(new WhileDoneCompletion(completion) { + @Override + public void done(ErrorCodeList errorCodeList) { + if (errorCodeList.getCauses().size() > 0) { + completion.fail(errorCodeList.getCauses().get(0)); + } else { + completion.success(); + } + } + }); + } + public void afterMigrateVm(final VmInstanceInventory inv, final String srcHostUuid, NoErrorCompletion completion) { new While<>(migrateVmExtensions).each((ext, comp) -> ext.afterMigrateVm(inv, srcHostUuid, new NoErrorCompletion(comp) { @Override diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index a9a111b2a23..95d14b4e9c7 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -2678,6 +2678,11 @@ public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { if (!inv.getHypervisorType().equals(VmInstanceConstant.KVM_HYPERVISOR_TYPE)) { diff --git a/compute/src/main/java/org/zstack/compute/vm/VmMigratePostCallExtensionFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmMigratePostCallExtensionFlow.java new file mode 100644 index 00000000000..dbb27ccd11c --- /dev/null +++ b/compute/src/main/java/org/zstack/compute/vm/VmMigratePostCallExtensionFlow.java @@ -0,0 +1,49 @@ +package org.zstack.compute.vm; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.zstack.core.componentloader.PluginRegistry; +import org.zstack.header.core.Completion; +import org.zstack.header.core.workflow.Flow; +import org.zstack.header.core.workflow.FlowRollback; +import org.zstack.header.core.workflow.FlowTrigger; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.host.HostInventory; +import org.zstack.header.vm.VmInstanceConstant; +import org.zstack.header.vm.VmInstanceSpec; + +import java.util.Map; + +/** + */ +@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) +public class VmMigratePostCallExtensionFlow implements Flow { + @Autowired + protected PluginRegistry pluginRgty; + @Autowired + private VmInstanceExtensionPointEmitter extEmitter; + + @Override + public void run(FlowTrigger trigger, Map data) { + final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); + + final HostInventory destHost = spec.getDestHost(); + extEmitter.postMigrateVm(spec.getVmInventory(), destHost.getUuid(), new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + + @Override + public void rollback(FlowRollback trigger, Map data) { + trigger.rollback(); + } +} diff --git a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java index b9b33f94e86..14a21f15d50 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmNicManagerImpl.java @@ -275,10 +275,13 @@ public void setNicDriverType(VmNicInventory nic, boolean isImageSupportVirtIo, b @Override public VmNicType getVmNicType(String vmUuid, L3NetworkInventory l3nw) { + List tags = new ArrayList<>(); + tags.add(String.format("enableSRIOV::%s", l3nw.getUuid())); + tags.add(String.format("enableVFHA::%s", l3nw.getUuid())); boolean enableSriov = Q.New(SystemTagVO.class) .eq(SystemTagVO_.resourceType, VmInstanceVO.class.getSimpleName()) .eq(SystemTagVO_.resourceUuid, vmUuid) - .eq(SystemTagVO_.tag, String.format("enableSRIOV::%s", l3nw.getUuid())) + .in(SystemTagVO_.tag, tags) .isExists(); logger.debug(String.format("create %s on l3 network[uuid:%s] inside VmAllocateNicFlow", enableSriov ? "vf nic" : "vnic", l3nw.getUuid())); diff --git a/conf/db/upgrade/V5.1.0__schema.sql b/conf/db/upgrade/V5.1.0__schema.sql index 24339e1483b..c7be456c687 100644 --- a/conf/db/upgrade/V5.1.0__schema.sql +++ b/conf/db/upgrade/V5.1.0__schema.sql @@ -33,6 +33,8 @@ ALTER TABLE `zstack`.`LoadBalancerServerGroupVO` ADD COLUMN `ipVersion` int(10) UPDATE `zstack`.`VipVO` set serviceProvider='SLB' where uuid in (select vipUuid from LoadBalancerVO where type='SLB'); UPDATE `zstack`.`VipVO` set serviceProvider='SLB' where uuid in (select ipv6VipUuid from LoadBalancerVO where type='SLB'); +ALTER TABLE `zstack`.`VmVfNicVO` ADD COLUMN `haState` varchar(32) NOT NULL DEFAULT "Disabled" AFTER `pciDeviceUuid`; + CREATE TABLE IF NOT EXISTS `zstack`.`VpcSharedQosVO` ( `uuid` varchar(32) NOT NULL UNIQUE, `name` varchar(255) NOT NULL, diff --git a/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java b/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java index 0435eab4dbf..58bc298cc7a 100755 --- a/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java +++ b/console/src/main/java/org/zstack/console/ConsoleManagerImpl.java @@ -221,6 +221,11 @@ public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { ConsoleBackend bkd = getBackend(); diff --git a/header/src/main/java/org/zstack/header/network/l3/UsedIpInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/network/l3/UsedIpInventoryDoc_zh_cn.groovy index 2c77b582e28..1ea54d82baf 100644 --- a/header/src/main/java/org/zstack/header/network/l3/UsedIpInventoryDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/network/l3/UsedIpInventoryDoc_zh_cn.groovy @@ -5,78 +5,78 @@ import java.sql.Timestamp doc { - title "已使用IP的结构清单" + title "在这里输入结构的名称" field { name "uuid" desc "资源的UUID,唯一标示该资源" type "String" - since "4.7.13" + since "5.0.0" } field { name "ipRangeUuid" desc "IP段UUID" type "String" - since "4.7.13" + since "5.0.0" } field { name "l3NetworkUuid" desc "三层网络UUID" type "String" - since "4.7.13" + since "5.0.0" } field { name "ipVersion" desc "" type "Integer" - since "4.7.13" + since "5.0.0" } field { name "ip" desc "" type "String" - since "4.7.13" + since "5.0.0" } field { name "netmask" desc "" type "String" - since "4.7.13" + since "5.0.0" } field { name "gateway" desc "" type "String" - since "4.7.13" + since "5.0.0" } field { name "usedFor" desc "" type "String" - since "4.7.13" + since "5.0.0" } field { name "ipInLong" desc "" type "long" - since "4.7.13" + since "5.0.0" } field { name "vmNicUuid" desc "云主机网卡UUID" type "String" - since "4.7.13" + since "5.0.0" } field { name "createDate" desc "创建时间" type "Timestamp" - since "4.7.13" + since "5.0.0" } field { name "lastOpDate" desc "最后一次修改时间" type "Timestamp" - since "4.7.13" + since "5.0.0" } } diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceMigrateExtensionPoint.java b/header/src/main/java/org/zstack/header/vm/VmInstanceMigrateExtensionPoint.java index 44b28cbcaf7..705483bd0a3 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceMigrateExtensionPoint.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceMigrateExtensionPoint.java @@ -14,6 +14,13 @@ default void preMigrateVm(VmInstanceInventory inv, String destHostUuid, Completi void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid); + default void postMigrateVm(VmInstanceInventory inv, String destHostUuid) {} + + default void postMigrateVm(VmInstanceInventory inv, String destHostUuid, Completion completion) { + postMigrateVm(inv, destHostUuid); + completion.success(); + } + default void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) {} default void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid, NoErrorCompletion completion) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index 4993cb3c70b..1566afaaf59 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -1020,6 +1020,11 @@ public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { } } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { } diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java index 0500fb4e2ea..b62c6a9430e 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatEipBackend.java @@ -135,6 +135,11 @@ public static class BatchDeleteEipCmd extends AgentCmd { public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java index a52e422e98b..2ff61d81ce8 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatUserdataBackend.java @@ -366,6 +366,11 @@ public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { } } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 7ffabf644ab..c116466b9b8 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -419,6 +419,11 @@ public void done(ErrorCodeList errorCodeList) { }); } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { 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 234574b8d6b..8dacc03bb6a 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -2250,17 +2250,17 @@ private void handle(final DetachNicFromVmOnHypervisorMsg msg) { if (msg.getNic().getL3NetworkUuid() == null) { logger.debug(String.format("Skip detach nic[uuid=%s] on hypervisor: This nic is not attach any networks", msg.getNic().getUuid())); - bus.reply(msg, new VmAttachNicOnHypervisorReply()); + bus.reply(msg, new DetachNicFromVmOnHypervisorReply()); } boolean running = Q.New(VmInstanceVO.class) .eq(VmInstanceVO_.uuid, msg.getVmInstanceUuid()) - .eq(VmInstanceVO_.state, VmInstanceState.Running) + .notNull(VmInstanceVO_.hostUuid) .isExists(); if (!running) { logger.debug(String.format("Skip detach nic[uuid=%s] on hypervisor: VM[uuid=%s] is not running", msg.getNic().getUuid(), msg.getVmInstanceUuid())); - bus.reply(msg, new VmAttachNicOnHypervisorReply()); + bus.reply(msg, new DetachNicFromVmOnHypervisorReply()); return; } @@ -3130,7 +3130,7 @@ public void fail(ErrorCode errorCode) { private void handle(final VmAttachNicOnHypervisorMsg msg) { boolean running = Q.New(VmInstanceVO.class) .eq(VmInstanceVO_.uuid, msg.getNicInventory().getVmInstanceUuid()) - .eq(VmInstanceVO_.state, VmInstanceState.Running) + .notNull(VmInstanceVO_.hostUuid) .isExists(); if (!running) { logger.debug(String.format("Skip attach nic[uuid=%s] on hypervisor: VM[uuid=%s] is not running", diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoExtensions.java b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoExtensions.java index 416762fb034..1f8fa51647c 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoExtensions.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/hypervisor/KvmHypervisorInfoExtensions.java @@ -13,6 +13,10 @@ import org.zstack.header.message.MessageReply; import org.zstack.header.vm.*; import org.zstack.kvm.*; +import org.zstack.kvm.KVMAgentCommands.DestroyVmCmd; +import org.zstack.kvm.KVMAgentCommands.RebootVmResponse; +import org.zstack.kvm.KVMAgentCommands.StopVmCmd; +import org.zstack.kvm.KVMAgentCommands.VmDevicesInfoResponse; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; @@ -126,6 +130,11 @@ public void run(MessageReply reply) { @Override public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) {} + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) {} diff --git a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java index 92b712efada..463d0cb1c58 100755 --- a/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java +++ b/plugin/securityGroup/src/main/java/org/zstack/network/securitygroup/SecurityGroupManagerImpl.java @@ -2453,6 +2453,11 @@ public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java index a470ea272af..8395f374d86 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java @@ -102,6 +102,11 @@ public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { notifySugonSdn(inv, destHostUuid, "add"); } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java index 03e9f8d93f4..2f6b4c004ce 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/userdata/TfUserdataBackend.java @@ -249,6 +249,11 @@ public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { } } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { diff --git a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterCentralizedDnsBackend.java b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterCentralizedDnsBackend.java index f4ef8960fb8..3fe73a35a8f 100755 --- a/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterCentralizedDnsBackend.java +++ b/plugin/virtualRouterProvider/src/main/java/org/zstack/network/service/virtualrouter/dns/VirtualRouterCentralizedDnsBackend.java @@ -278,6 +278,11 @@ public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { bus.send(kmsg); } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java new file mode 100644 index 00000000000..369cb8e7da6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ChangeVfNicHaStateAction 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.ChangeVfNicHaStateResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String vfNicUuid; + + @Param(required = true, validValues = {"Enabled","Disabled"}, maxLength = 32, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String haState; + + @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.ChangeVfNicHaStateResult value = res.getResult(org.zstack.sdk.ChangeVfNicHaStateResult.class); + ret.value = value == null ? new org.zstack.sdk.ChangeVfNicHaStateResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/vm-instances/nics/{vfNicUuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "changeVfNicHaState"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateResult.java b/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateResult.java new file mode 100644 index 00000000000..ec57ef3f397 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVfNicHaStateResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmVfNicInventory; + +public class ChangeVfNicHaStateResult { + public VmVfNicInventory inventory; + public void setInventory(VmVfNicInventory inventory) { + this.inventory = inventory; + } + public VmVfNicInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java b/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java index 4d0d49e4eb1..1a25f664e04 100644 --- a/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/VmVfNicInventory.java @@ -12,4 +12,12 @@ public java.lang.String getPciDeviceUuid() { return this.pciDeviceUuid; } + public java.lang.String haState; + public void setHaState(java.lang.String haState) { + this.haState = haState; + } + public java.lang.String getHaState() { + return this.haState; + } + } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java index b8ec50859e4..2a7e7352b9d 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorageFactory.java @@ -709,6 +709,10 @@ public void handle(ErrorCode errCode, Map data) { }).start(); } + @Override + public void postMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } @Override public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) {} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index e127cda300b..fcc5fe1a50b 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -5957,6 +5957,33 @@ abstract class ApiHelper { } + def changeVfNicHaState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeVfNicHaStateAction.class) Closure c) { + def a = new org.zstack.sdk.ChangeVfNicHaStateAction() + 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 changeVipState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeVipStateAction.class) Closure c) { def a = new org.zstack.sdk.ChangeVipStateAction() a.sessionId = Test.currentEnvSpec?.session?.uuid