add validateForMerge

This commit is contained in:
Mengyi Zhou 2017-01-22 19:20:06 +08:00
parent 3606ef4e09
commit d9fc145084
4 changed files with 74 additions and 62 deletions

View file

@ -3,8 +3,10 @@ package com.ctrip.zeus.service.model.handler;
import com.ctrip.zeus.model.entity.Group;
import com.ctrip.zeus.model.entity.GroupServer;
import com.ctrip.zeus.model.entity.GroupVirtualServer;
import com.ctrip.zeus.model.entity.TrafficPolicy;
import java.util.List;
import java.util.Map;
/**
* Created by zhoumy on 2015/6/29.
@ -13,6 +15,8 @@ public interface GroupValidator extends ModelValidator<Group> {
void validate(Group target, boolean escapePathValidation) throws Exception;
void validateForMerge(Long[] toBeMergedItems, Long vsId, Map<Long, Group> groupRef, Map<Long, TrafficPolicy> policyRef, boolean escapePathValidation) throws Exception;
void validateGroupVirtualServers(Group target, boolean escapePathValidation) throws Exception;
void validateGroupServers(List<GroupServer> groupServers) throws Exception;

View file

@ -1,11 +1,16 @@
package com.ctrip.zeus.service.model.handler;
import com.ctrip.zeus.model.entity.Group;
import com.ctrip.zeus.model.entity.TrafficPolicy;
import java.util.Map;
/**
* Created by zhoumy on 2017/1/13.
*/
public interface TrafficPolicyValidator extends ModelValidator<TrafficPolicy> {
void validate(TrafficPolicy target, boolean escapePathValidation) throws Exception;
void validateForMerge(Long[] toBeMergedItems, Long vsId, Map<Long, Group> groupRef, Map<Long, TrafficPolicy> policyRef, boolean escapePathValidation) throws Exception;
}

View file

@ -2,10 +2,7 @@ package com.ctrip.zeus.service.model.handler.impl;
import com.ctrip.zeus.dal.core.*;
import com.ctrip.zeus.exceptions.ValidationException;
import com.ctrip.zeus.model.entity.Group;
import com.ctrip.zeus.model.entity.GroupServer;
import com.ctrip.zeus.model.entity.GroupVirtualServer;
import com.ctrip.zeus.model.entity.VirtualServer;
import com.ctrip.zeus.model.entity.*;
import com.ctrip.zeus.service.model.PathRewriteParser;
import com.ctrip.zeus.service.model.PathValidator;
import com.ctrip.zeus.service.model.common.MetaType;
@ -164,6 +161,36 @@ public class DefaultGroupValidator implements GroupValidator {
validateGroupServers(target.getGroupServers());
}
@Override
public void validateForMerge(Long[] toBeMergedItems, Long vsId, Map<Long, Group> groupRef, Map<Long, TrafficPolicy> policyRef, boolean escapePathValidation) throws Exception {
Map<Long, List<PathValidator.LocationEntry>> locationEntries = new HashMap<>();
Set<Long> groupsAsTrafficControl = new HashSet<>();
for (TrafficPolicy p : policyRef.values()) {
for (PolicyVirtualServer pvs : p.getPolicyVirtualServers()) {
if (pvs.getVirtualServer().getId().equals(vsId)) {
putArrayEntryValue(locationEntries, vsId, new PathValidator.LocationEntry().setEntryId(p.getId()).setEntryType(MetaType.TRAFFIC_POLICY).setVsId(vsId).setPath(pvs.getPath()).setPriority(pvs.getPriority()));
}
}
for (TrafficControl c : p.getControls()) {
groupsAsTrafficControl.add(c.getGroup().getId());
}
}
for (Group g : groupRef.values()) {
if (groupsAsTrafficControl.contains(g.getId())) continue;
for (GroupVirtualServer gvs : g.getGroupVirtualServers()) {
if (gvs.getVirtualServer().getId().equals(vsId)) {
putArrayEntryValue(locationEntries, vsId, new PathValidator.LocationEntry().setEntryId(g.getId()).setEntryType(MetaType.GROUP).setVsId(vsId).setPath(gvs.getPath()).setPriority(gvs.getPriority()));
}
}
}
for (Long i : toBeMergedItems) {
Group g = groupRef.get(i);
validatePathPriority(g, escapePathValidation, locationEntries);
}
}
@Override
public void validateGroupVirtualServers(Group target, boolean escapePathValidation) throws Exception {
if (target.getGroupVirtualServers() == null || target.getGroupVirtualServers().size() == 0)
@ -260,57 +287,6 @@ public class DefaultGroupValidator implements GroupValidator {
}
}
private void compareAndBuildCurrentLocationEntries(Long groupId, Long[] vsIds, List<GroupVirtualServer> groupVirtualServers, Map<Long, List<PathValidator.LocationEntry>> currentLocationEntriesByVs) throws DalException, ValidationException {
List<Long> relatedPolicies = new ArrayList<>();
for (RTrafficPolicyGroupDo e : rTrafficPolicyGroupDao.findAllByGroups(new Long[]{groupId}, RTrafficPolicyGroupEntity.READSET_FULL)) {
relatedPolicies.add(e.getPolicyId());
}
Integer[] priorities = new Integer[vsIds.length];
String[] paths = new String[vsIds.length];
for (GroupVirtualServer e : groupVirtualServers) {
int i = Arrays.binarySearch(vsIds, e.getVirtualServer().getId());
priorities[i] = e.getPriority();
paths[i] = e.getPath();
}
for (RTrafficPolicyVsDo e : rTrafficPolicyVsDao.findAllByPolicyVersion(relatedPolicies.toArray(new Long[relatedPolicies.size()]), RTrafficPolicyVsEntity.READSET_FULL)) {
int i = Arrays.binarySearch(vsIds, e.getVsId());
if (i < 0) {
throw new ValidationException("Group is missing combination on vs " + e.getVsId() + " referring its traffic policy " + e.getPolicyId() + ".");
}
if (priorities[i] != null && priorities[i] > e.getPriority()) {
throw new ValidationException("Group has higher `priority` than its traffic policy " + e.getPolicyId() + " on vs " + e.getVsId() + ".");
}
if (!paths[i].equals(e.getPath())) {
throw new ValidationException("Group has different `path` from its traffic policy " + e.getPolicyId() + " on vs " + e.getVsId() + ".");
}
}
if (currentLocationEntriesByVs != null) {
for (RTrafficPolicyVsDo e : rTrafficPolicyVsDao.findByVsesAndPolicyVersion(vsIds, RTrafficPolicyVsEntity.READSET_FULL)) {
if (relatedPolicies.indexOf(e.getPolicyId()) < 0) {
List<PathValidator.LocationEntry> v = currentLocationEntriesByVs.get(e.getVsId());
if (v == null) {
v = new ArrayList<>();
currentLocationEntriesByVs.put(e.getVsId(), v);
}
v.add(new PathValidator.LocationEntry().setEntryId(e.getPolicyId()).setEntryType(MetaType.TRAFFIC_POLICY).setVsId(e.getVsId()).setPath(e.getPath()).setPriority(e.getPriority()));
}
}
for (RelGroupVsDo e : rGroupVsDao.findByVsesAndGroupOfflineVersion(vsIds, RGroupVsEntity.READSET_FULL)) {
if (e.getGroupId() == groupId) continue;
List<PathValidator.LocationEntry> v = currentLocationEntriesByVs.get(e.getVsId());
if (v == null) {
v = new ArrayList<>();
currentLocationEntriesByVs.put(e.getVsId(), v);
}
v.add(new PathValidator.LocationEntry().setVsId(e.getVsId()).setEntryId(e.getGroupId()).setPath(e.getPath()).setEntryType(MetaType.GROUP).setPriority(e.getPriority() == 0 ? 1000 : e.getPriority()));
}
}
}
private void compareAndBuildCurrentLocationEntries(Group target, Long[] vsIds,
Map<Long, List<RTrafficPolicyVsDo>> policyListByGroupId,
Map<Long, List<RTrafficPolicyVsDo>> pvsListByVsId,

View file

@ -2,10 +2,7 @@ package com.ctrip.zeus.service.model.handler.impl;
import com.ctrip.zeus.dal.core.*;
import com.ctrip.zeus.exceptions.ValidationException;
import com.ctrip.zeus.model.entity.PolicyVirtualServer;
import com.ctrip.zeus.model.entity.TrafficControl;
import com.ctrip.zeus.model.entity.TrafficPolicy;
import com.ctrip.zeus.model.entity.VirtualServer;
import com.ctrip.zeus.model.entity.*;
import com.ctrip.zeus.service.model.PathValidator;
import com.ctrip.zeus.service.model.VersionUtils;
import com.ctrip.zeus.service.model.common.MetaType;
@ -86,10 +83,40 @@ public class DefaultTrafficPolicyValidator implements TrafficPolicyValidator {
compareAndBuildCurrentLocationEntries(target, groupIds, vsIds, policyListByGroupId, pvsListByVsId, gvsListByVsId,
escapePathValidation ? null : currentLocationEntriesByVs);
validatePathOverlap(target, escapePathValidation, currentLocationEntriesByVs);
validatePathPriority(target, escapePathValidation, currentLocationEntriesByVs);
}
private void validatePathOverlap(TrafficPolicy target, boolean escapePathValidation, Map<Long, List<PathValidator.LocationEntry>> currentLocationEntriesByVs) throws ValidationException {
@Override
public void validateForMerge(Long[] toBeMergedItems, Long vsId, Map<Long, Group> groupRef, Map<Long, TrafficPolicy> policyRef, boolean escapePathValidation) throws Exception {
Map<Long, List<PathValidator.LocationEntry>> locationEntries = new HashMap<>();
Set<Long> groupsAsTrafficControl = new HashSet<>();
for (TrafficPolicy p : policyRef.values()) {
for (PolicyVirtualServer pvs : p.getPolicyVirtualServers()) {
if (pvs.getVirtualServer().getId().equals(vsId)) {
putArrayEntryValue(locationEntries, vsId, new PathValidator.LocationEntry().setEntryId(p.getId()).setEntryType(MetaType.TRAFFIC_POLICY).setVsId(vsId).setPath(pvs.getPath()).setPriority(pvs.getPriority()));
}
}
for (TrafficControl c : p.getControls()) {
groupsAsTrafficControl.add(c.getGroup().getId());
}
}
for (Group g : groupRef.values()) {
if (groupsAsTrafficControl.contains(g.getId())) continue;
for (GroupVirtualServer gvs : g.getGroupVirtualServers()) {
if (gvs.getVirtualServer().getId().equals(vsId)) {
putArrayEntryValue(locationEntries, vsId, new PathValidator.LocationEntry().setEntryId(g.getId()).setEntryType(MetaType.GROUP).setVsId(vsId).setPath(gvs.getPath()).setPriority(gvs.getPriority()));
}
}
}
for (Long i : toBeMergedItems) {
TrafficPolicy p = policyRef.get(i);
validatePathPriority(p, escapePathValidation, locationEntries);
}
}
private void validatePathPriority(TrafficPolicy target, boolean escapePathValidation, Map<Long, List<PathValidator.LocationEntry>> currentLocationEntriesByVs) throws ValidationException {
for (PolicyVirtualServer e : target.getPolicyVirtualServers()) {
Long vsId = e.getVirtualServer().getId();
e.setVirtualServer(new VirtualServer().setId(vsId));
@ -179,7 +206,7 @@ public class DefaultTrafficPolicyValidator implements TrafficPolicyValidator {
compareAndBuildCurrentLocationEntries(e, g, v, policyListByGroupId, pvsListByVsId, gvsListByVsId,
escapedPathValidation ? null : currentLocationEntriesByVs);
validatePathOverlap(e, escapedPathValidation, currentLocationEntriesByVs);
validatePathPriority(e, escapedPathValidation, currentLocationEntriesByVs);
}
}