diff --git a/conf/springConfigXml/sugonSdnController.xml b/conf/springConfigXml/sugonSdnController.xml index 6188abb0a962b52218ab0dcd7fb88568f7573a61..f0ff6ad0033d34701ad8e919f8661285c6428789 100644 --- a/conf/springConfigXml/sugonSdnController.xml +++ b/conf/springConfigXml/sugonSdnController.xml @@ -44,9 +44,10 @@ - + + diff --git a/header/src/main/java/org/zstack/header/vm/VmUpdateNicOnHypervisorMsg.java b/header/src/main/java/org/zstack/header/vm/VmUpdateNicOnHypervisorMsg.java index 4941955e250f2c5c0f4f4d9275841418bee4bc19..4ece5fd8b290b33998aef56abeeacc20d217d91d 100644 --- a/header/src/main/java/org/zstack/header/vm/VmUpdateNicOnHypervisorMsg.java +++ b/header/src/main/java/org/zstack/header/vm/VmUpdateNicOnHypervisorMsg.java @@ -10,7 +10,6 @@ public class VmUpdateNicOnHypervisorMsg extends NeedReplyMessage implements Host private String hostUuid; private String vmInstanceUuid; private List nicsUuid = new ArrayList<>(); - private boolean notifySugonSdn; @Override public String getHostUuid() { @@ -36,12 +35,4 @@ public class VmUpdateNicOnHypervisorMsg extends NeedReplyMessage implements Host public List getNicsUuid() { return nicsUuid; } - - public boolean isNotifySugonSdn() { - return notifySugonSdn; - } - - public void setNotifySugonSdn(boolean notifySugonSdn) { - this.notifySugonSdn = notifySugonSdn; - } -} +} \ No newline at end of file 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 43e3b0b3d943a9b001c7de68b75b56a6f3e5fe23..87478afbbdfe84fc51ee9a85a1212dda28d82e06 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -7,15 +7,11 @@ import org.zstack.header.core.validation.Validation; import org.zstack.header.host.HostNUMANode; import org.zstack.header.host.VmNicRedirectConfig; import org.zstack.header.log.NoLogging; -import org.zstack.header.vm.PriorityConfigStruct; -import org.zstack.header.vm.VmBootDevice; -import org.zstack.header.vm.VmNicInventory; -import org.zstack.header.vm.VmPriorityConfigVO; +import org.zstack.header.vm.*; import org.zstack.header.vm.devices.DeviceAddress; import org.zstack.header.vm.devices.VirtualDeviceInfo; import org.zstack.network.securitygroup.RuleTO; import org.zstack.network.securitygroup.SecurityGroupMembersTO; -import org.zstack.network.securitygroup.SecurityGroupRuleTO; import org.zstack.network.securitygroup.VmNicSecurityTO; import java.io.Serializable; @@ -200,8 +196,6 @@ public class KVMAgentCommands { private List nics; private Map addons = new HashMap<>(); private String accountUuid; - // This api may called after migration - private boolean notifySugonSdn; public List getNics() { return nics; @@ -238,14 +232,6 @@ public class KVMAgentCommands { public void setAccountUuid(String accountUuid) { this.accountUuid = accountUuid; } - - public boolean isNotifySugonSdn() { - return notifySugonSdn; - } - - public void setNotifySugonSdn(boolean notifySugonSdn) { - this.notifySugonSdn = notifySugonSdn; - } } public static class UpdateNicRsp extends AgentResponse { 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 58d7ed6867923726143fd9f9c584302e44b690e4..aee1f07a2d22d8a83b221a74b6d6f102eb83c0e6 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -210,7 +210,6 @@ public class KVMHost extends HostBase implements Host { private String attachVolumePath; private String detachVolumePath; private String vmFstrimPath; - private String agentPackageName = KVMGlobalProperty.AGENT_PACKAGE_NAME; private String hostTakeOverFlagPath = KVMGlobalProperty.TAKEVOERFLAGPATH; @@ -2865,7 +2864,6 @@ public class KVMHost extends HostBase implements Host { UpdateNicCmd cmd = new UpdateNicCmd(); cmd.setVmInstanceUuid(msg.getVmInstanceUuid()); cmd.setNics(VmNicInventory.valueOf(nics).stream().map(this::completeNicInfo).collect(Collectors.toList())); - cmd.setNotifySugonSdn(msg.isNotifySugonSdn()); cmd.setAccountUuid(accountMgr.getOwnerAccountUuidOfResource(cmd.getVmInstanceUuid())); KVMHostInventory inv = (KVMHostInventory) getSelfInventory(); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfAfterMigrateExtensionPointImpl.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfAfterMigrateExtensionPointImpl.java deleted file mode 100644 index 0760f867d18349418dfe6829cd9491001cbd6c06..0000000000000000000000000000000000000000 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfAfterMigrateExtensionPointImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.zstack.sugonSdnController.network; - -import org.springframework.beans.factory.annotation.Autowired; -import org.zstack.core.cloudbus.CloudBus; -import org.zstack.core.cloudbus.CloudBusCallBack; -import org.zstack.header.errorcode.ErrorCode; -import org.zstack.header.host.HostConstant; -import org.zstack.header.message.MessageReply; -import org.zstack.header.vm.VmInstanceInventory; -import org.zstack.header.vm.VmInstanceMigrateExtensionPoint; -import org.zstack.header.vm.VmUpdateNicOnHypervisorMsg; -import org.zstack.utils.Utils; -import org.zstack.utils.logging.CLogger; - - -public class TfAfterMigrateExtensionPointImpl implements VmInstanceMigrateExtensionPoint { - private static final CLogger logger = Utils.getLogger(TfAfterMigrateExtensionPointImpl.class); - @Autowired - private CloudBus bus; - - @Override - public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { - - } - - @Override - public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { - - } - - @Override - public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { - VmUpdateNicOnHypervisorMsg cmsg = new VmUpdateNicOnHypervisorMsg(); - cmsg.setVmInstanceUuid(inv.getUuid()); - cmsg.setHostUuid(inv.getHostUuid()); - cmsg.setNotifySugonSdn(true); - bus.makeTargetServiceIdByResourceUuid(cmsg, HostConstant.SERVICE_ID, inv.getUuid()); - bus.send(cmsg, new CloudBusCallBack(null) { - @Override - public void run(MessageReply reply) { - if (!reply.isSuccess()) { - logger.error(String.format("failed to notify sugon sdn vrouter for vm [uuid:%s], %s", inv.getUuid(), - reply.getError())); - } else { - logger.info(String.format("successfully to notify sugon sdn vrouter for vm[uuid:%s]", inv.getUuid())); - } - } - }); - } - - @Override - public void failedToMigrateVm(VmInstanceInventory inv, String destHostUuid, ErrorCode reason) { - - } -} 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 new file mode 100644 index 0000000000000000000000000000000000000000..672e630f4335b56a2e5db450217a2e867a772e47 --- /dev/null +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfMigrateVmBackend.java @@ -0,0 +1,192 @@ +package org.zstack.sugonSdnController.network; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.transaction.annotation.Transactional; +import org.zstack.compute.vm.VmGlobalConfig; +import org.zstack.compute.vm.VmSystemTags; +import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.cloudbus.CloudBusCallBack; +import org.zstack.core.db.DatabaseFacade; +import org.zstack.core.db.Q; +import org.zstack.header.core.Completion; +import org.zstack.header.errorcode.ErrorCode; +import org.zstack.header.errorcode.OperationFailureException; +import org.zstack.header.host.HostConstant; +import org.zstack.header.message.MessageReply; +import org.zstack.header.network.l2.L2NetworkInventory; +import org.zstack.header.network.l2.L2NetworkType; +import org.zstack.header.network.l2.L2NetworkVO; +import org.zstack.header.network.l2.L2NetworkVO_; +import org.zstack.header.network.l3.L3NetworkInventory; +import org.zstack.header.network.l3.L3NetworkVO; +import org.zstack.header.network.l3.L3NetworkVO_; +import org.zstack.header.vm.*; +import org.zstack.header.vm.devices.DeviceAddress; +import org.zstack.identity.AccountManager; +import org.zstack.kvm.*; +import org.zstack.network.service.MtuGetter; +import org.zstack.sugonSdnController.userdata.TfUserdataBackend; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; + +import javax.persistence.TypedQuery; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.zstack.core.Platform.operr; + + +public class TfMigrateVmBackend implements VmInstanceMigrateExtensionPoint, VmPreMigrationExtensionPoint { + private static final CLogger logger = Utils.getLogger(TfMigrateVmBackend.class); + public static final String NOTIFY_TF_NIC = "/vm/nodifytfnic"; + @Autowired + private CloudBus bus; + @Autowired + private AccountManager accountMgr; + @Autowired + protected DatabaseFacade dbf; + + public static class SugonNicNotifyCmd extends KVMAgentCommands.AgentCommand { + private String sugonSdnAction; + private List nics; + private String vmInstanceUuid; + + private String accountUuid; + public String getSugonSdnAction() { + return sugonSdnAction; + } + + public void setSugonSdnAction(String sugonSdnAction) { + this.sugonSdnAction = sugonSdnAction; + } + + public List getNics() { + return nics; + } + + public void setNics(List nics) { + this.nics = nics; + } + public String getVmInstanceUuid() { + return vmInstanceUuid; + } + + public void setVmInstanceUuid(String vmInstanceUuid) { + this.vmInstanceUuid = vmInstanceUuid; + } + + public String getAccountUuid() { + return accountUuid; + } + + public void setAccountUuid(String accountUuid) { + this.accountUuid = accountUuid; + } + + } + + public static class SugonNicNotifyCmdRsp extends KVMAgentCommands.AgentResponse { + + } + + + @Override + public void preVmMigration(VmInstanceInventory vm, VmMigrationType type, Completion completion) { +// try { +// notifySugonSdn(vm, vm.getHostUuid(), "add"); +// completion.success(); +// } catch (OperationFailureException e) { +// completion.fail(e.getErrorCode()); +// } + } + + @Override + public void preMigrateVm(VmInstanceInventory inv, String destHostUuid) { + // pre支持物理机+本地存储迁移,以及物理机+共享存储迁移,before不支持物理机+共享存储的迁移 + notifySugonSdn(inv, destHostUuid, "add"); + } + + @Override + public void beforeMigrateVm(VmInstanceInventory inv, String destHostUuid) { + + } + + @Override + public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid) { + notifySugonSdn(inv, srcHostUuid, "delete"); + } + + @Override + public void failedToMigrateVm(VmInstanceInventory inv, String destHostUuid, ErrorCode reason) { + notifySugonSdn(inv, destHostUuid, "delete"); + } + + private boolean needNotiySugonSdn(VmInstanceInventory inv) { + for (VmNicInventory nic : inv.getVmNics()) { + if (VmInstanceConstant.TF_VIRTUAL_NIC_TYPE.equalsIgnoreCase(nic.getType())) { + return true; + } + } + return false; + } + + private void notifySugonSdn(VmInstanceInventory inv, String destHostUuid, String operate) { + if (!needNotiySugonSdn(inv)) { + return; + } + logger.info(String.format("notifySugonSdn: start to notify sugon sdn to %s vrouter for vm[uuid:%s] in success flow", operate, inv.getUuid())); + SugonNicNotifyCmd cmd = new SugonNicNotifyCmd(); + cmd.setSugonSdnAction(operate); + cmd.setVmInstanceUuid(inv.getUuid()); + cmd.setAccountUuid(accountMgr.getOwnerAccountUuidOfResource(cmd.getVmInstanceUuid())); + List nics = Q.New(VmNicVO.class).eq(VmNicVO_.vmInstanceUuid, inv.getUuid()).list(); + List nicInvs = VmNicInventory.valueOf(nics); + if (nicInvs == null || nicInvs.isEmpty()) { + logger.info(String.format("notifySugonSdn: nic count is zero, will not call sugon sdn")); + return; + } + cmd.setNics(nicInvs.stream().filter(vmNic -> VmInstanceConstant.TF_VIRTUAL_NIC_TYPE.equalsIgnoreCase(vmNic.getType())) + .map(this::completeNicInfo).collect(Collectors.toList())); + logger.info(String.format("after completeNicInfo:nic count: %s", cmd.getNics().size())); + KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg(); + msg.setHostUuid(destHostUuid); + msg.setCommand(cmd); + msg.setPath(NOTIFY_TF_NIC); + bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, destHostUuid); + MessageReply reply = bus.call(msg); + if (!reply.isSuccess()) { + logger.error(String.format("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], %s", operate, inv.getUuid(), + reply.getError())); + throw new OperationFailureException(operr("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], on the destination host[uuid:%s]", + operate, inv.getUuid(), destHostUuid).causedBy(reply.getError())); + } + + KVMHostAsyncHttpCallReply r = reply.castReply(); + TfMigrateVmBackend.SugonNicNotifyCmdRsp rsp = r.toResponse(TfMigrateVmBackend.SugonNicNotifyCmdRsp.class); + if (!rsp.isSuccess()) { + logger.error(String.format("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], %s", operate, inv.getUuid(), + rsp.getError())); + throw new OperationFailureException(operr("notifySugonSdn: failed to notify sugon sdn to %s vrouter for vm [uuid:%s], on the destination host[uuid:%s], error is:%s", + operate, inv.getUuid(), destHostUuid, rsp.getError())); + } + logger.info(String.format("notifySugonSdn: successfully to notify sugon sdn to %s vrouter for vm[uuid:%s]", operate, inv.getUuid())); + } + + @Transactional(readOnly = true) + private KVMAgentCommands.NicTO completeNicInfo(VmNicInventory nic) { + L3NetworkVO l3NetworkVO = Q.New(L3NetworkVO.class).eq(L3NetworkVO_.uuid, nic.getL3NetworkUuid()).find(); + L2NetworkVO l2NetworkVO = Q.New(L2NetworkVO.class).eq(L2NetworkVO_.uuid, l3NetworkVO.getL2NetworkUuid()).find(); + L2NetworkInventory l2inv = L2NetworkInventory.valueOf(l2NetworkVO); + KVMAgentCommands.NicTO to = KVMAgentCommands.NicTO.fromVmNicInventory(nic); + to.setIpForTf(nic.getIp()); + to.setMtu(new MtuGetter().getMtu(l3NetworkVO.getUuid())); + to.setL2NetworkUuid(l2inv.getUuid()); + to.setResourceUuid(nic.getUuid()); + logger.debug("notifySugonSdn: Complete nic information for TfL2Network"); + return to; + } +}