package org.zstack.network.l2.vxlan.vxlanNetworkPool;
import org.zstack.core.Platform;
import org.zstack.core.db.Q;
import org.zstack.header.apimediator.ApiMessageInterceptionException;
import org.zstack.header.errorcode.SysErrors;
import org.zstack.header.message.APIMessage;
import org.zstack.header.network.l2.APIAttachL2NetworkToClusterMsg;
import org.zstack.header.network.l2.L2NetworkVO;
import org.zstack.header.network.l2.L2NetworkVO_;
import org.zstack.header.network.l3.APICreateL3NetworkMsg;
import org.zstack.network.l2.vxlan.vxlanNetwork.VxlanNetworkConstant;
import org.zstack.utils.network.NetworkUtils;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
/**
* Created by weiwang on 02/05/2017.
*/
public class VxlanNetworkCheckerImpl implements VxlanNetworkChecker {
@Override
public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException {
if (msg instanceof APIAttachL2NetworkToClusterMsg) {
validate((APIAttachL2NetworkToClusterMsg) msg);
} else if (msg instanceof APICreateL3NetworkMsg) {
validate((APICreateL3NetworkMsg) msg);
}
return msg;
}
private void validate(APIAttachL2NetworkToClusterMsg msg) {
String type = Q.New(L2NetworkVO.class).select(L2NetworkVO_.type).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).findValue();
if (!type.equals(VxlanNetworkPoolConstant.VXLAN_NETWORK_POOL_TYPE)) {
return;
}
String pattern = ".*cidr::\\{.*\\}";
if (msg.getSystemTags() == null) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("need to input one system tag like : l2NetworkUuid::XXX::clusterUuid::XXX::cidr::{X.X.X.X/Y}")
));
}
for (String tag : msg.getSystemTags()) {
if (!Pattern.matches(pattern, tag)) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("wrong system tag format, shoud be like : l2NetworkUuid::XXX::clusterUuid::XXX::cidr::{X.X.X.X/Y}")
));
}
StringTokenizer st = new StringTokenizer(tag, "::");
while (st.hasMoreElements()) {
String t = st.nextToken();
if (Pattern.matches("\\{.*\\}", t)) {
if (!NetworkUtils.isCidr(t.replaceAll("\\{|\\}", ""))) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("wrong cidr format in system tag")
));
}
}
}
}
}
private void validate(APICreateL3NetworkMsg msg) {
String type = Q.New(L2NetworkVO.class).select(L2NetworkVO_.type).eq(L2NetworkVO_.uuid, msg.getL2NetworkUuid()).findValue();
if (type.equals(VxlanNetworkPoolConstant.VXLAN_NETWORK_POOL_TYPE)) {
throw new ApiMessageInterceptionException(Platform.err(SysErrors.INVALID_ARGUMENT_ERROR,
String.format("vxlan network pool do not support create l3 network")
));
}
}
}