mirror of
https://github.com/ctripcorp/zeus.git
synced 2024-09-20 07:36:02 +08:00
add validateForMerge
This commit is contained in:
parent
3606ef4e09
commit
d9fc145084
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue