package org.zstack.network.l2.vxlan.vxlanNetworkPool;
import org.apache.commons.lang.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.zstack.core.Platform;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.Q;
import org.zstack.header.apimediator.ApiMessageInterceptionException;
import org.zstack.header.apimediator.ApiMessageInterceptor;
import org.zstack.header.errorcode.SysErrors;
import org.zstack.header.message.APIMessage;
import org.zstack.network.l2.vxlan.vxlanNetwork.APICreateL2VxlanNetworkMsg;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.List;
/**
* Created by weiwang on 02/05/2017.
*/
public class VxlanPoolApiInterceptor implements ApiMessageInterceptor {
private static final CLogger logger = Utils.getLogger(VxlanNetworkPool.class);
@Autowired
protected DatabaseFacade dbf;
@Override
public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException {
if (msg instanceof APICreateVniRangeMsg) {
validate((APICreateVniRangeMsg) msg);
} else if (msg instanceof APICreateL2VxlanNetworkMsg) {
validate((APICreateL2VxlanNetworkMsg) msg);
} else if (msg instanceof APIDeleteVniRangeMsg) {
validate((APIDeleteVniRangeMsg) msg);
}
return msg;
}
private void validate(APIDeleteVniRangeMsg msg) {
VniRangeVO vo = Q.New(VniRangeVO.class).eq(VniRangeVO_.uuid, msg.getUuid()).find();
msg.setL2NetworkUuid(vo.getL2NetworkUuid());
}
private void validate(APICreateL2VxlanNetworkMsg msg) {
VxlanNetworkPoolVO vo = Q.New(VxlanNetworkPoolVO.class).eq(VxlanNetworkPoolVO_.uuid, msg.getPoolUuid()).find();
if (msg.getZoneUuid() != null && !msg.getZoneUuid().equals(vo.getZoneUuid())) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("the zone uuid provided not equals to zone uuid of pool [%s], please correct it or do not fill it",
msg.getPoolUuid())
));
} else if (msg.getZoneUuid() == null ) {
msg.setZoneUuid(vo.getZoneUuid());
}
}
private void validate(APICreateVniRangeMsg msg) {
if (msg.getStartVni() > msg.getEndVni()) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("start number [%s] of vni range is bigger than end number [%s]",
msg.getStartVni(), msg.getStartVni())
));
}
List<VniRangeVO> exists = Q.New(VniRangeVO.class).eq(VniRangeVO_.l2NetworkUuid, msg.getL2NetworkUuid()).list();
for (VniRangeVO e : exists) {
if (checkOverlap(msg.getStartVni(), msg.getEndVni(), e.getStartVni(), e.getEndVni()) == true) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("this vni range has overlapped with vni range [%s], which start vni is [%s], end vni is [%s]",
e.getUuid(), e.getStartVni(), e.getEndVni())
));
}
}
}
private boolean checkOverlap(Integer checktart, Integer checkEnd, Integer existStart, Integer existEnd){
if ((checktart >= existStart) && (checktart <= existEnd)) {
return true;
} else if ((checkEnd >= existStart) && (checkEnd <= existEnd)) {
return true;
}
return false;
}
}