package org.zstack.network.l2.vxlan.vxlanNetwork;
import org.springframework.beans.factory.annotation.Autowired;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.header.Component;
import org.zstack.header.errorcode.OperationFailureException;
import org.zstack.header.message.MessageReply;
import org.zstack.header.network.l2.*;
import org.zstack.network.l2.vxlan.vxlanNetworkPool.AllocateVniMsg;
import org.zstack.network.l2.vxlan.vxlanNetworkPool.AllocateVniReply;
import org.zstack.query.QueryFacade;
import org.zstack.utils.Utils;
import org.zstack.utils.gson.JSONObjectUtil;
import org.zstack.utils.logging.CLogger;
import java.util.List;
/**
* Created by weiwang on 02/03/2017.
*/
public class VxlanNetworkFactory implements L2NetworkFactory, Component {
private static CLogger logger = Utils.getLogger(VxlanNetworkFactory.class);
static L2NetworkType type = new L2NetworkType(VxlanNetworkConstant.VXLAN_NETWORK_TYPE);
@Autowired
private DatabaseFacade dbf;
@Autowired
private CloudBus bus;
@Autowired
private QueryFacade qf;
@Override
public L2NetworkType getType() {
return type;
}
@Override
public L2NetworkInventory createL2Network(L2NetworkVO ovo, APICreateL2NetworkMsg msg) {
APICreateL2VxlanNetworkMsg amsg = (APICreateL2VxlanNetworkMsg) msg;
VxlanNetworkVO vo = new VxlanNetworkVO(ovo);
AllocateVniMsg vniMsg = new AllocateVniMsg();
vniMsg.setL2NetworkUuid(amsg.getPoolUuid());
vniMsg.setRequiredVni(amsg.getVni());
bus.makeTargetServiceIdByResourceUuid(vniMsg, L2NetworkConstant.SERVICE_ID, amsg.getPoolUuid());
MessageReply reply = bus.call(vniMsg);
if (!reply.isSuccess()) {
throw new OperationFailureException(reply.getError());
}
AllocateVniReply r = reply.castReply();
vo.setVni(r.getVni());
vo.setPoolUuid((amsg.getPoolUuid()));
if (vo.getPhysicalInterface() == null) {
vo.setPhysicalInterface("");
}
vo = dbf.persistAndRefresh(vo);
SimpleQuery<L2NetworkClusterRefVO> q = dbf.createQuery(L2NetworkClusterRefVO.class);
q.add(L2NetworkClusterRefVO_.l2NetworkUuid, SimpleQuery.Op.EQ, amsg.getPoolUuid());
final List<L2NetworkClusterRefVO> refs = q.list();
for (L2NetworkClusterRefVO ref : refs) {
L2NetworkClusterRefVO rvo = new L2NetworkClusterRefVO();
rvo.setClusterUuid(ref.getClusterUuid());
rvo.setL2NetworkUuid(vo.getUuid());
dbf.persist(rvo);
}
vo = dbf.reload(vo);
L2VxlanNetworkInventory inv = L2VxlanNetworkInventory.valueOf(vo);
String info = String.format("successfully create L2VxlanNetwork, %s", JSONObjectUtil.toJsonString(inv));
logger.debug(info);
return inv;
}
@Override
public L2Network getL2Network(L2NetworkVO vo) {
return new VxlanNetwork(vo);
}
@Override
public boolean start() {
return true;
}
@Override
public boolean stop() {
return true;
}
}