package org.zstack.network.service.virtualrouter.vip;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Qualifier;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.db.SimpleQuery.Op;
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.network.service.vip.VipInventory;
import org.zstack.network.service.vip.VipVO;
import org.zstack.network.service.vip.VipVO_;
import org.zstack.network.service.virtualrouter.VirtualRouterConstant;
import org.zstack.network.service.virtualrouter.VirtualRouterVmInventory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class VirtualRouterSyncVipFlow implements Flow {
@Autowired
protected DatabaseFacade dbf;
@Autowired
@Qualifier("VirtualRouterVipBackend")
protected VirtualRouterVipBackend vipExt;
@Override
public void run(final FlowTrigger chain, Map data) {
final VirtualRouterVmInventory vr = (VirtualRouterVmInventory) data.get(VirtualRouterConstant.Param.VR.toString());
SimpleQuery<VipVO> q = dbf.createQuery(VipVO.class);
q.add(VipVO_.peerL3NetworkUuid, Op.IN, vr.getGuestL3Networks());
List<VipVO> vips = q.list();
if (vips.isEmpty()) {
chain.next();
return;
}
List<VipInventory> invs = VipInventory.valueOf(vips);
vipExt.createVipOnVirtualRouterVm(vr, invs, new Completion(chain) {
@Override
public void success() {
List<VirtualRouterVipVO> vrvips = new ArrayList<>();
for (VipVO vip : vips) {
VirtualRouterVipVO vo = dbf.findByUuid(vip.getUuid(), VirtualRouterVipVO.class);
if (vo == null) {
vo = new VirtualRouterVipVO();
vo.setUuid(vip.getUuid());
vo.setVirtualRouterVmUuid(vr.getUuid());
vrvips.add(vo);
}
}
if (!vrvips.isEmpty()) {
dbf.persistCollection(vrvips);
}
chain.next();
}
@Override
public void fail(ErrorCode errorCode) {
chain.fail(errorCode);
}
});
}
@Override
public void rollback(FlowRollback chain, Map data) {
chain.rollback();
}
}