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.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.core.workflow.NoRollbackFlow; import org.zstack.header.network.l3.L3NetworkConstant; import org.zstack.header.network.l3.ReturnIpMsg; import org.zstack.header.vm.*; import org.zstack.header.vm.VmInstanceDeletionPolicyManager.VmInstanceDeletionPolicy; import java.util.ArrayList; import java.util.List; import java.util.Map; @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class VmReturnReleaseNicFlow extends NoRollbackFlow { @Autowired protected DatabaseFacade dbf; @Autowired protected CloudBus bus; @Autowired protected VmInstanceDeletionPolicyManager deletionPolicyMgr; @Override public void run(FlowTrigger chain, Map data) { VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); if (spec.getVmInventory().getVmNics().isEmpty()) { chain.next(); return; } List<ReturnIpMsg> msgs = new ArrayList<ReturnIpMsg>(spec.getVmInventory().getVmNics().size()); for (VmNicInventory nic : spec.getVmInventory().getVmNics()) { if (nic.getUsedIpUuid() != null) { ReturnIpMsg msg = new ReturnIpMsg(); msg.setL3NetworkUuid(nic.getL3NetworkUuid()); msg.setUsedIpUuid(nic.getUsedIpUuid()); bus.makeTargetServiceIdByResourceUuid(msg, L3NetworkConstant.SERVICE_ID, nic.getL3NetworkUuid()); msgs.add(msg); } VmNicVO vo = dbf.findByUuid(nic.getUuid(), VmNicVO.class); if (VmInstanceConstant.USER_VM_TYPE.equals(spec.getVmInventory().getType())) { VmInstanceDeletionPolicy deletionPolicy = deletionPolicyMgr.getDeletionPolicy(spec.getVmInventory().getUuid()); if (deletionPolicy == VmInstanceDeletionPolicy.Direct) { dbf.remove(vo); } else { vo.setUsedIpUuid(null); vo.setIp(null); vo.setGateway(null); vo.setNetmask(null); dbf.update(vo); } } else { dbf.remove(vo); } } bus.send(msgs); chain.next(); } }