package org.zstack.network.l2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.db.SimpleQuery.Op; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.apimediator.StopRoutingException; import org.zstack.header.message.APIMessage; import org.zstack.header.network.l2.*; import static org.zstack.core.Platform.argerr; import static org.zstack.core.Platform.operr; import javax.persistence.TypedQuery; import java.util.List; /** * Created with IntelliJ IDEA. * User: frank * Time: 4:52 PM * To change this template use File | Settings | File Templates. */ public class L2NetworkApiInterceptor implements ApiMessageInterceptor { @Autowired private CloudBus bus; @Autowired private DatabaseFacade dbf; @Autowired private ErrorFacade errf; private void setServiceId(APIMessage msg) { if (msg instanceof L2NetworkMessage) { L2NetworkMessage l2msg = (L2NetworkMessage)msg; bus.makeTargetServiceIdByResourceUuid(msg, L2NetworkConstant.SERVICE_ID, l2msg.getL2NetworkUuid()); } } @Override public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { if (msg instanceof APICreateL2NetworkMsg) { validate((APICreateL2NetworkMsg)msg); } else if (msg instanceof APIDeleteL2NetworkMsg) { validate((APIDeleteL2NetworkMsg)msg); } else if (msg instanceof APIDetachL2NetworkFromClusterMsg) { validate((APIDetachL2NetworkFromClusterMsg)msg); } else if (msg instanceof APIAttachL2NetworkToClusterMsg) { validate((APIAttachL2NetworkToClusterMsg) msg); } setServiceId(msg); return msg; } private void validate(final APIAttachL2NetworkToClusterMsg msg) { SimpleQuery<L2NetworkClusterRefVO> q = dbf.createQuery(L2NetworkClusterRefVO.class); q.add(L2NetworkClusterRefVO_.clusterUuid, Op.EQ, msg.getClusterUuid()); q.add(L2NetworkClusterRefVO_.l2NetworkUuid, Op.EQ, msg.getL2NetworkUuid()); if (q.isExists()) { throw new ApiMessageInterceptionException(operr("l2Network[uuid:%s] has attached to cluster[uuid:%s], can't attach again", msg.getL2NetworkUuid(), msg.getClusterUuid())); } } private void validate(APIDetachL2NetworkFromClusterMsg msg) { SimpleQuery<L2NetworkClusterRefVO> q = dbf.createQuery(L2NetworkClusterRefVO.class); q.add(L2NetworkClusterRefVO_.clusterUuid, Op.EQ, msg.getClusterUuid()); q.add(L2NetworkClusterRefVO_.l2NetworkUuid, Op.EQ, msg.getL2NetworkUuid()); if (!q.isExists()) { throw new ApiMessageInterceptionException(operr("l2Network[uuid:%s] has not attached to cluster[uuid:%s]", msg.getL2NetworkUuid(), msg.getClusterUuid())); } } private void validate(APIDeleteL2NetworkMsg msg) { if (!dbf.isExist(msg.getUuid(), L2NetworkVO.class)) { APIDeleteL2NetworkEvent evt = new APIDeleteL2NetworkEvent(msg.getId()); bus.publish(evt); throw new StopRoutingException(); } } private void validate(APICreateL2NetworkMsg msg) { if (!L2NetworkType.hasType(msg.getType())) { throw new ApiMessageInterceptionException(argerr("unsupported l2Network type[%s]", msg.getType())); } } }