mirror of
https://github.com/ctripcorp/zeus.git
synced 2024-09-20 07:36:02 +08:00
task update for policy
This commit is contained in:
parent
ec1ab8e95f
commit
b1d8c8c6a7
|
@ -59,6 +59,8 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
private ConfVersionService confVersionService;
|
||||
@Resource
|
||||
private CommitService commitService;
|
||||
@Resource
|
||||
private TrafficPolicyRepository trafficPolicyRepository;
|
||||
|
||||
Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
|
@ -69,6 +71,9 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
private HashMap<Long, OpsTask> activateGroupOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> deactivateGroupOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> softDeactivateGroupOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> activatePolicyOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> deactivatePolicyOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> softDeactivatePolicyOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> activateVsOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> deactivateVsOps = new HashMap<>();
|
||||
private HashMap<Long, OpsTask> softDeactivateVsOps = new HashMap<>();
|
||||
|
@ -138,6 +143,7 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
ModelStatusMapping<Slb> slbMap;
|
||||
ModelStatusMapping<VirtualServer> vsMap;
|
||||
ModelStatusMapping<Group> groupMap;
|
||||
ModelStatusMapping<TrafficPolicy> tpMap;
|
||||
|
||||
//1.1 slb
|
||||
slbMap = mapSlbVersionAndRevise(slbId, activateSlbOps.values());
|
||||
|
@ -149,11 +155,13 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
relatedVsIds.addAll(vsMap.getOnlineMapping().keySet());
|
||||
relatedVsIds.addAll(vsMap.getOfflineMapping().keySet());
|
||||
groupMap = mapVersionAndRevise(relatedVsIds, activateGroupOps.values());
|
||||
|
||||
//1.4 policy
|
||||
tpMap = mapPolicyVersionAndRevise(relatedVsIds, activatePolicyOps.values());
|
||||
|
||||
//2. merge data and get next online entities
|
||||
Map<Long, Group> nxOnlineGroups;
|
||||
Map<Long, VirtualServer> nxOnlineVses;
|
||||
Map<Long, TrafficPolicy> nxOnlineTpes;
|
||||
Slb nxOnlineSlb;
|
||||
|
||||
//2.1 group
|
||||
|
@ -172,37 +180,53 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
if (activateSlbOps.size() > 0) {
|
||||
nxOnlineSlb = slbMap.getOfflineMapping().get(slbId);
|
||||
}
|
||||
//2.4 policy
|
||||
nxOnlineTpes = new HashMap<>(tpMap.getOnlineMapping());
|
||||
for (Long pid : activatePolicyOps.keySet()) {
|
||||
TrafficPolicy offlineVersion = tpMap.getOfflineMapping().get(pid);
|
||||
nxOnlineTpes.put(pid, offlineVersion);
|
||||
}
|
||||
|
||||
|
||||
//3. find out vses which need build.
|
||||
//3.1 deactivate vs pre check
|
||||
if (deactivateVsOps.size() > 0) {
|
||||
deactivateVsPreCheck(vsMap.getOnlineMapping().keySet(), nxOnlineGroups);
|
||||
deactivateVsPreCheck(vsMap.getOnlineMapping().keySet(), nxOnlineGroups, nxOnlineTpes);
|
||||
}
|
||||
//3.2 find out vses which need build.
|
||||
Set<Long> buildingVsIds;
|
||||
Set<Long> buildingGroupIds;
|
||||
buildingGroupIds = new HashSet<>();
|
||||
Set<Long> buildingPolicyIds;
|
||||
buildingPolicyIds = new HashSet<>();
|
||||
Map<Long, List<Group>> groupReferrerOfBuildingVs = new HashMap<>();
|
||||
final Map<String, Integer> gvsPriorityReferrer = new HashMap<>();
|
||||
Map<Long, List<TrafficPolicy>> policyReferrerOfBuildingVs = new HashMap<>();
|
||||
|
||||
// build all
|
||||
if (activateSlbOps.size() > 0 && activateSlbOps.get(slbId) != null) {
|
||||
buildingVsIds = nxOnlineVses.keySet();
|
||||
} else {
|
||||
buildingVsIds = filterBuildingVsByDemand(nxOnlineVses, groupMap.getOnlineMapping(), nxOnlineGroups);
|
||||
buildingVsIds = filterBuildingVsByDemand(nxOnlineVses, groupMap.getOnlineMapping(), nxOnlineGroups, tpMap.getOnlineMapping(), nxOnlineTpes);
|
||||
}
|
||||
|
||||
buildingGroupIds = new HashSet<>();
|
||||
for (Map.Entry<Long, Group> e : nxOnlineGroups.entrySet()) {
|
||||
boolean buildingRequired = traverseGroupContent(e.getKey(), e.getValue(), slbId,
|
||||
nxOnlineVses,
|
||||
buildingVsIds,
|
||||
gvsPriorityReferrer, groupReferrerOfBuildingVs);
|
||||
buildingVsIds, groupReferrerOfBuildingVs);
|
||||
|
||||
if (buildingRequired) {
|
||||
buildingGroupIds.add(e.getKey());
|
||||
}
|
||||
}
|
||||
for (Map.Entry<Long, TrafficPolicy> e : nxOnlineTpes.entrySet()) {
|
||||
boolean buildingRequired = traversePolicyContent(e.getKey(), e.getValue(), slbId,
|
||||
nxOnlineVses,
|
||||
buildingVsIds, policyReferrerOfBuildingVs);
|
||||
|
||||
if (buildingRequired) {
|
||||
buildingPolicyIds.add(e.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
//3.* in case of no need to update the config files.
|
||||
//only have operation for inactivated groups.
|
||||
|
@ -212,19 +236,6 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
return;
|
||||
}
|
||||
|
||||
//3.3 sort Groups by priority
|
||||
for (final Long vsId : groupReferrerOfBuildingVs.keySet()) {
|
||||
final Long _vsId = vsId;
|
||||
List<Group> list = groupReferrerOfBuildingVs.get(vsId);
|
||||
Collections.sort(list, new Comparator<Group>() {
|
||||
public int compare(Group group0, Group group1) {
|
||||
int prio0 = gvsPriorityReferrer.get(priorityKey(group0.getId(), _vsId));
|
||||
int prio1 = gvsPriorityReferrer.get(priorityKey(group1.getId(), vsId));
|
||||
return prio1 == prio0 ? (int) (group1.getId() - group0.getId()) : prio1 - prio0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//5.2 push config to all slb servers. reload if needed.
|
||||
//5.2.1 remove deactivate vs ids from need build vses
|
||||
Set<Long> cleanVsIds = new HashSet<>();
|
||||
|
@ -239,14 +250,15 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
//4.2 allUpGroupServers
|
||||
Set<String> allUpGroupServers = getAllUpGroupServers(buildingVsIds, nxOnlineGroups, slbId);
|
||||
//4.3 build config
|
||||
buildVersion = buildService.build(nxOnlineSlb, nxOnlineVses, buildingVsIds, cleanVsIds,
|
||||
buildVersion = buildService.build(nxOnlineSlb, nxOnlineVses, buildingVsIds, cleanVsIds, policyReferrerOfBuildingVs,
|
||||
groupReferrerOfBuildingVs, allDownServers, allUpGroupServers);
|
||||
|
||||
//5. push config
|
||||
//5.1 need reload?
|
||||
boolean needReload = activateSlbOps.size() > 0
|
||||
|| activateGroupOps.size() > 0 || deactivateGroupOps.size() > 0 || softDeactivateGroupOps.size() > 0
|
||||
|| activateVsOps.size() > 0 || deactivateVsOps.size() > 0 || softDeactivateVsOps.size() > 0;
|
||||
|| activateVsOps.size() > 0 || deactivateVsOps.size() > 0 || softDeactivateVsOps.size() > 0
|
||||
|| activatePolicyOps.size() > 0 || deactivatePolicyOps.size() > 0 || softDeactivatePolicyOps.size() > 0;
|
||||
|
||||
if (writeEnable.get()) {
|
||||
//5.2.2 update slb current version
|
||||
|
@ -319,8 +331,23 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
return groupMap;
|
||||
}
|
||||
|
||||
private ModelStatusMapping<TrafficPolicy> mapPolicyVersionAndRevise(Set<Long> vsIds, Collection<OpsTask> activatePolicyTask) throws Exception {
|
||||
ModelStatusMapping<TrafficPolicy> tpMap = entityFactory.getTrafficPolicies(vsIds.toArray(new Long[vsIds.size()]));
|
||||
Map<Long, TrafficPolicy> offlineGroups = tpMap.getOfflineMapping();
|
||||
List<IdVersion> revisedVersion = new ArrayList<>();
|
||||
for (OpsTask task : activatePolicyTask) {
|
||||
if (!offlineGroups.get(task.getPolicyId()).getVersion().equals(task.getVersion())) {
|
||||
revisedVersion.add(new IdVersion(task.getId(), task.getVersion()));
|
||||
}
|
||||
}
|
||||
for (TrafficPolicy policy : trafficPolicyRepository.list(revisedVersion.toArray(new IdVersion[revisedVersion.size()]))) {
|
||||
offlineGroups.put(policy.getId(), policy);
|
||||
}
|
||||
return tpMap;
|
||||
}
|
||||
|
||||
private Set<Long> filterBuildingVsByDemand(Map<Long, VirtualServer> nxOnlineVses,
|
||||
Map<Long, Group> currOnlineGroups, Map<Long, Group> nxOnlineGroups) {
|
||||
Map<Long, Group> currOnlineGroups, Map<Long, Group> nxOnlineGroups, Map<Long, TrafficPolicy> currOnlinePolicies, Map<Long, TrafficPolicy> nxOnlineTpes) {
|
||||
Set<Long> buildingVsIds = new HashSet<>();
|
||||
buildingVsIds.addAll(activateVsOps.keySet());
|
||||
|
||||
|
@ -334,6 +361,16 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
}
|
||||
}
|
||||
|
||||
if (softDeactivatePolicyOps.size() > 0) {
|
||||
for (OpsTask task : softDeactivatePolicyOps.values()) {
|
||||
if (task.getSlbVirtualServerId() != null && nxOnlineVses.containsKey(task.getSlbVirtualServerId())) {
|
||||
buildingVsIds.add(task.getSlbVirtualServerId());
|
||||
} else {
|
||||
setTaskFail(task, "Not found online vs for soft deactivate policy ops. vs=" + task.getSlbVirtualServerId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Set<Long> _buildingGroupIds = new HashSet<>(activateGroupOps.keySet());
|
||||
|
||||
|
@ -374,6 +411,45 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
}
|
||||
}
|
||||
|
||||
Set<Long> _buildingPolicyIds = new HashSet<>(activatePolicyOps.keySet());
|
||||
|
||||
// policy with 2~n vses which share the current target slb-id(cond1)
|
||||
// while 1~(n-1) of those vses are involved in any vs-ops(cond2)
|
||||
// must be rebuilt for the need of regenerating concat upstream filename
|
||||
for (TrafficPolicy p : currOnlinePolicies.values()) {
|
||||
if (p.getPolicyVirtualServers().size() <= 1) continue;
|
||||
boolean cond1 = false;
|
||||
boolean cond2 = false;
|
||||
for (PolicyVirtualServer pvs : p.getPolicyVirtualServers()) {
|
||||
if (deactivateVsOps.keySet().contains(pvs.getVirtualServer().getId()) ||
|
||||
softDeactivateVsOps.keySet().contains(pvs.getVirtualServer().getId())) {
|
||||
cond1 = true;
|
||||
} else if (nxOnlineVses.containsKey(pvs.getVirtualServer().getId())) {
|
||||
cond2 = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (cond1 && cond2) {
|
||||
_buildingPolicyIds.add(p.getId());
|
||||
}
|
||||
}
|
||||
for (TrafficPolicy p : nxOnlineTpes.values()) {
|
||||
if (p.getPolicyVirtualServers().size() <= 1) continue;
|
||||
boolean cond1 = false;
|
||||
boolean cond2 = false;
|
||||
for (PolicyVirtualServer pvs : p.getPolicyVirtualServers()) {
|
||||
if (activateVsOps.keySet().contains(pvs.getVirtualServer().getId())) {
|
||||
cond1 = true;
|
||||
} else if (nxOnlineVses.containsKey(pvs.getVirtualServer().getId())) {
|
||||
cond2 = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (cond1 && cond2) {
|
||||
_buildingPolicyIds.add(p.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Set<Long> _buildingVsIds = new HashSet<>();
|
||||
for (Long gid : _buildingGroupIds) {
|
||||
|
@ -385,9 +461,20 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
for (GroupVirtualServer gvs : nxOnlineGroups.get(gid).getGroupVirtualServers()) {
|
||||
_buildingVsIds.add(gvs.getVirtualServer().getId());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
for (Long pid : _buildingPolicyIds) {
|
||||
TrafficPolicy currVersion = currOnlinePolicies.get(pid);
|
||||
if (currVersion != null) {
|
||||
for (PolicyVirtualServer pvs : currVersion.getPolicyVirtualServers()) {
|
||||
_buildingVsIds.add(pvs.getVirtualServer().getId());
|
||||
}
|
||||
for (PolicyVirtualServer pvs : nxOnlineTpes.get(pid).getPolicyVirtualServers()) {
|
||||
_buildingVsIds.add(pvs.getVirtualServer().getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_buildingVsIds.retainAll(nxOnlineVses.keySet());
|
||||
buildingVsIds.addAll(_buildingVsIds);
|
||||
|
||||
|
@ -396,8 +483,7 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
|
||||
private boolean traverseGroupContent(Long groupId, Group group, Long slbId,
|
||||
final Map<Long, VirtualServer> nxOnlineVses,
|
||||
Set<Long> buildingVsIds,
|
||||
Map<String, Integer> gvsPriorityReferrer, Map<Long, List<Group>> groupReferrerOfBuildingVs) throws NginxProcessingException {
|
||||
Set<Long> buildingVsIds, Map<Long, List<Group>> groupReferrerOfBuildingVs) throws NginxProcessingException {
|
||||
if (group == null) {
|
||||
String errMsg = "Unexpected online group with null value. groupId=" + groupId + ".";
|
||||
logger.error(errMsg);
|
||||
|
@ -444,7 +530,6 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
groupReferrerOfBuildingVs.put(vsId, vsRelatedGroups);
|
||||
}
|
||||
vsRelatedGroups.add(group);
|
||||
gvsPriorityReferrer.put(priorityKey(groupId, vsId), gvs.getPriority());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -472,8 +557,64 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
return buildingGroupRequired;
|
||||
}
|
||||
|
||||
private boolean traversePolicyContent(Long policyId, TrafficPolicy policy, Long slbId,
|
||||
final Map<Long, VirtualServer> nxOnlineVses,
|
||||
Set<Long> buildingVsIds, Map<Long, List<TrafficPolicy>> policyReferrerOfBuildingVs) throws NginxProcessingException {
|
||||
if (policy == null) {
|
||||
String errMsg = "Unexpected online group with null value. policyId =" + policyId + ".";
|
||||
logger.error(errMsg);
|
||||
throw new NginxProcessingException(errMsg);
|
||||
}
|
||||
|
||||
boolean buildingPolicyRequired = false;
|
||||
if (activatePolicyOps.containsKey(policyId) || deactivatePolicyOps.containsKey(policyId)) {
|
||||
buildingPolicyRequired = true;
|
||||
}
|
||||
|
||||
boolean currSlbRelevant = false;
|
||||
|
||||
for (PolicyVirtualServer pvs : policy.getPolicyVirtualServers()) {
|
||||
if (nxOnlineVses.containsKey(pvs.getVirtualServer().getId())) {
|
||||
currSlbRelevant = true;
|
||||
|
||||
Long vsId = pvs.getVirtualServer().getId();
|
||||
|
||||
if (buildingPolicyRequired) {
|
||||
if (!buildingVsIds.contains(vsId)) {
|
||||
buildingVsIds.add(vsId);
|
||||
}
|
||||
}
|
||||
|
||||
if (deactivatePolicyOps.containsKey(policyId)
|
||||
|| (softDeactivatePolicyOps.containsKey(policyId) && softDeactivatePolicyOps.get(policyId).getSlbVirtualServerId().equals(vsId))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<TrafficPolicy> vsRelatedPolicies = policyReferrerOfBuildingVs.get(vsId);
|
||||
if (vsRelatedPolicies == null) {
|
||||
// give an empty list as long as vs is activated
|
||||
vsRelatedPolicies = new ArrayList<>();
|
||||
policyReferrerOfBuildingVs.put(vsId, vsRelatedPolicies);
|
||||
}
|
||||
vsRelatedPolicies.add(policy);
|
||||
}
|
||||
}
|
||||
|
||||
if (!currSlbRelevant) {
|
||||
//TODO elegantly solve issue of migrating vs and operating related groups simultaneously
|
||||
if (activatePolicyOps.containsKey(policyId)) {
|
||||
setTaskFail(activatePolicyOps.get(policyId), "Not found online virtual server for Policy[" + policyId + "] in slb[" + slbId + "].");
|
||||
} else if (deactivatePolicyOps.containsKey(policyId)) {
|
||||
setTaskFail(deactivatePolicyOps.get(policyId), "Not found online virtual server for Policy[" + policyId + "] in slb[" + slbId + "].");
|
||||
}
|
||||
}
|
||||
|
||||
return buildingPolicyRequired;
|
||||
}
|
||||
|
||||
|
||||
private void taskExecutorLog(Long slbId, long cost) {
|
||||
if (tasks == null || tasks.size() == 0 ){
|
||||
if (tasks == null || tasks.size() == 0) {
|
||||
return;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder(256);
|
||||
|
@ -506,7 +647,7 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
commitService.add(commit);
|
||||
}
|
||||
|
||||
private void deactivateVsPreCheck(Set<Long> currOnlineVses, Map<Long, Group> nxOnlineGroups) throws Exception {
|
||||
private void deactivateVsPreCheck(Set<Long> currOnlineVses, Map<Long, Group> nxOnlineGroups, Map<Long, TrafficPolicy> nxOnlinePolicies) throws Exception {
|
||||
Set<Long> keySet = new HashSet<>(deactivateVsOps.keySet());
|
||||
for (Long id : keySet) {
|
||||
OpsTask task = deactivateVsOps.get(id);
|
||||
|
@ -528,6 +669,20 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
setTaskFail(activateGroupOps.get(groupId), "[Vs deactivate Pre Check] Activating Group While Related Vs is deactivating!");
|
||||
activateGroupOps.remove(groupId);
|
||||
}
|
||||
|
||||
List<Long> activatingPolicyIds = new ArrayList<>();
|
||||
for (Long pid : activatePolicyOps.keySet()) {
|
||||
TrafficPolicy policy = nxOnlinePolicies.get(pid);
|
||||
for (PolicyVirtualServer pvs : policy.getPolicyVirtualServers()) {
|
||||
if (deactivateVsOps.containsKey(pvs.getVirtualServer().getId())) {
|
||||
activatingPolicyIds.add(pid);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Long pid : activatingPolicyIds) {
|
||||
setTaskFail(activatePolicyOps.get(pid), "[Vs deactivate Pre Check] Activating Policy While Related Vs is deactivating!");
|
||||
activatePolicyOps.remove(pid);
|
||||
}
|
||||
}
|
||||
|
||||
private void rollBack(Slb slb, Long buildVersion, boolean needRollbackConf) {
|
||||
|
@ -590,6 +745,22 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
}
|
||||
groupRepository.updateStatus(newGroupStatus.toArray(new IdVersion[newGroupStatus.size()]));
|
||||
|
||||
// update policy status
|
||||
List<IdVersion> newPolicyStatus = new ArrayList<>();
|
||||
for (OpsTask task : activatePolicyOps.values()) {
|
||||
if (!task.getStatus().equals(TaskStatus.DOING)) {
|
||||
continue;
|
||||
}
|
||||
newPolicyStatus.add(new IdVersion(task.getPolicyId(), task.getVersion()));
|
||||
}
|
||||
for (OpsTask task : deactivatePolicyOps.values()) {
|
||||
if (!task.getStatus().equals(TaskStatus.DOING)) {
|
||||
continue;
|
||||
}
|
||||
newPolicyStatus.add(new IdVersion(task.getPolicyId(), 0));
|
||||
}
|
||||
trafficPolicyRepository.updateActiveStatus(newPolicyStatus.toArray(new IdVersion[newPolicyStatus.size()]));
|
||||
|
||||
// update server status
|
||||
for (OpsTask task : serverOps.values()) {
|
||||
if (!task.getStatus().equals(TaskStatus.DOING)) {
|
||||
|
@ -792,6 +963,9 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
deactivateVsOps.clear();
|
||||
softDeactivateVsOps.clear();
|
||||
softDeactivateGroupOps.clear();
|
||||
activatePolicyOps.clear();
|
||||
deactivatePolicyOps.clear();
|
||||
softDeactivatePolicyOps.clear();
|
||||
|
||||
List<OpsTask> taskList;
|
||||
for (OpsTask task : pendingTasks) {
|
||||
|
@ -845,6 +1019,15 @@ public class TaskExecutorImpl implements TaskExecutor {
|
|||
case TaskOpsType.ACTIVATE_VS:
|
||||
activateVsOps.put(task.getSlbVirtualServerId(), task);
|
||||
break;
|
||||
case TaskOpsType.ACTIVATE_POLICY:
|
||||
activatePolicyOps.put(task.getPolicyId(), task);
|
||||
break;
|
||||
case TaskOpsType.DEACTIVATE_POLICY:
|
||||
deactivatePolicyOps.put(task.getPolicyId(), task);
|
||||
break;
|
||||
case TaskOpsType.SOFT_DEACTIVATE_POLICY:
|
||||
softDeactivatePolicyOps.put(task.getPolicyId(), task);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,9 @@ import com.ctrip.zeus.service.build.ConfigHandler;
|
|||
import com.ctrip.zeus.service.message.queue.MessageQueue;
|
||||
import com.ctrip.zeus.service.message.queue.MessageType;
|
||||
import com.ctrip.zeus.service.model.*;
|
||||
import com.ctrip.zeus.service.model.handler.GroupValidator;
|
||||
import com.ctrip.zeus.service.model.handler.TrafficPolicyValidator;
|
||||
import com.ctrip.zeus.service.model.handler.VirtualServerValidator;
|
||||
import com.ctrip.zeus.service.query.GroupCriteriaQuery;
|
||||
import com.ctrip.zeus.service.query.SlbCriteriaQuery;
|
||||
import com.ctrip.zeus.service.task.constant.TaskOpsType;
|
||||
|
@ -57,6 +60,16 @@ public class ActivateResource {
|
|||
@Resource
|
||||
private GroupCriteriaQuery groupCriteriaQuery;
|
||||
@Resource
|
||||
private GroupValidator groupValidator;
|
||||
@Resource
|
||||
private VirtualServerValidator virtualServerValidator;
|
||||
@Resource
|
||||
private com.ctrip.zeus.service.model.handler.SlbValidator slbModelValidator;
|
||||
@Resource
|
||||
private TrafficPolicyValidator trafficPolicyValidator;
|
||||
@Resource
|
||||
private TrafficPolicyRepository trafficPolicyRepository;
|
||||
@Resource
|
||||
private MessageQueue messageQueue;
|
||||
@Resource
|
||||
private ConfigHandler configHandler;
|
||||
|
@ -81,6 +94,7 @@ public class ActivateResource {
|
|||
if (slbModelStatusMapping.getOfflineMapping() == null || slbModelStatusMapping.getOfflineMapping().size() == 0) {
|
||||
throw new ValidationException("Not Found Slb By Id.");
|
||||
}
|
||||
slbModelValidator.validateForActivate(slbModelStatusMapping.getOfflineMapping().values().toArray(new Slb[]{}), true);
|
||||
for (Long id : _slbIds) {
|
||||
if (slbModelStatusMapping.getOfflineMapping().get(id) == null) {
|
||||
throw new ValidationException("Not Found Slb By Id." + id);
|
||||
|
@ -151,6 +165,8 @@ public class ActivateResource {
|
|||
throw new ValidationException("Groups with id (" + Joiner.on(",").join(_groupIds) + ") are not found.");
|
||||
}
|
||||
|
||||
groupValidator.validateForActivate(groupMap.getOfflineMapping().values().toArray(new Group[]{}), false);
|
||||
|
||||
// Fetch all related vs entities first to reduce IO
|
||||
Set<Long> vsIds = new HashSet<>();
|
||||
for (Map.Entry<Long, Group> e : groupMap.getOfflineMapping().entrySet()) {
|
||||
|
@ -275,6 +291,8 @@ public class ActivateResource {
|
|||
throw new ValidationException("Cannot find vs by id " + vsId + ".");
|
||||
}
|
||||
|
||||
virtualServerValidator.validateForActivate(vsMap.getOfflineMapping().values().toArray(new VirtualServer[]{}), true);
|
||||
|
||||
Set<Long> offlineRelatedSlbIds = new HashSet<>();
|
||||
offlineRelatedSlbIds.addAll(offlineVersion.getSlbIds());
|
||||
|
||||
|
@ -345,4 +363,95 @@ public class ActivateResource {
|
|||
|
||||
return responseHandler.handle(resultList, hh.getMediaType());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/policy")
|
||||
@Authorize(name = "activate")
|
||||
public Response activatePolicy(@Context HttpServletRequest request,
|
||||
@Context HttpHeaders hh,
|
||||
@QueryParam("policy") Long policyId) throws Exception {
|
||||
if (policyId == null || policyId <= 0) {
|
||||
throw new ValidationException("Invalidate Parameter policy.");
|
||||
}
|
||||
ModelStatusMapping<TrafficPolicy> trafficPolicyMap = entityFactory.getTrafficPolicies(new Long[]{policyId});
|
||||
if (trafficPolicyMap.getOfflineMapping().size() == 0) {
|
||||
throw new ValidationException("Not Found Policy By Id. Policy Id:" + policyId);
|
||||
}
|
||||
trafficPolicyValidator.validateForActivate(trafficPolicyMap.getOfflineMapping().values().toArray(new TrafficPolicy[]{}), true);
|
||||
|
||||
TrafficPolicy toActivateObj = trafficPolicyMap.getOfflineMapping().get(policyId);
|
||||
TrafficPolicy activatedObj = trafficPolicyMap.getOnlineMapping().get(policyId);
|
||||
|
||||
Set<Long> vsIds = new HashSet<>();
|
||||
Set<Long> offlineRelatedVsIds = new HashSet<>();
|
||||
Set<Long> onlineRelatedVsIds = new HashSet<>();
|
||||
for (PolicyVirtualServer pvs : toActivateObj.getPolicyVirtualServers()) {
|
||||
offlineRelatedVsIds.add(pvs.getVirtualServer().getId());
|
||||
}
|
||||
if (activatedObj != null) {
|
||||
for (PolicyVirtualServer pvs : activatedObj.getPolicyVirtualServers()) {
|
||||
onlineRelatedVsIds.add(pvs.getVirtualServer().getId());
|
||||
}
|
||||
}
|
||||
vsIds.addAll(offlineRelatedVsIds);
|
||||
vsIds.addAll(onlineRelatedVsIds);
|
||||
|
||||
ModelStatusMapping<VirtualServer> vsMap = entityFactory.getVsesByIds(vsIds.toArray(new Long[]{}));
|
||||
|
||||
for (PolicyVirtualServer pvs : toActivateObj.getPolicyVirtualServers()) {
|
||||
if (!vsMap.getOnlineMapping().containsKey(pvs.getVirtualServer().getId())) {
|
||||
throw new ValidationException("Virtual server " + pvs.getVirtualServer().getId() + " is not activated. PolicyId :" + policyId);
|
||||
}
|
||||
}
|
||||
|
||||
List<OpsTask> tasks = new ArrayList<>();
|
||||
Map<Long, OpsTask> activateTasks = new HashMap<>();
|
||||
for (Long vsId : vsIds) {
|
||||
VirtualServer vs = vsMap.getOnlineMapping().get(vsId);
|
||||
if (onlineRelatedVsIds.contains(vsId) && !offlineRelatedVsIds.contains(vsId)) {
|
||||
for (Long slbId : vs.getSlbIds()) {
|
||||
OpsTask task = new OpsTask();
|
||||
task.setPolicyId(policyId)
|
||||
.setTargetSlbId(slbId)
|
||||
.setSlbVirtualServerId(vsId)
|
||||
.setOpsType(TaskOpsType.SOFT_DEACTIVATE_POLICY)
|
||||
.setVersion(toActivateObj.getVersion())
|
||||
.setCreateTime(new Date());
|
||||
tasks.add(task);
|
||||
}
|
||||
} else {
|
||||
for (Long slbId : vs.getSlbIds()) {
|
||||
if (activateTasks.get(slbId) == null) {
|
||||
OpsTask task = new OpsTask();
|
||||
task.setPolicyId(policyId)
|
||||
.setTargetSlbId(slbId)
|
||||
.setOpsType(TaskOpsType.ACTIVATE_POLICY)
|
||||
.setVersion(toActivateObj.getVersion())
|
||||
.setCreateTime(new Date());
|
||||
activateTasks.put(slbId, task);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tasks.addAll(activateTasks.values());
|
||||
List<Long> taskIds = taskManager.addTask(tasks);
|
||||
|
||||
List<TaskResult> results = taskManager.getResult(taskIds, apiTimeout.get());
|
||||
|
||||
TaskResultList resultList = new TaskResultList();
|
||||
for (TaskResult t : results) {
|
||||
resultList.addTaskResult(t);
|
||||
}
|
||||
resultList.setTotal(results.size());
|
||||
|
||||
try {
|
||||
propertyBox.set("status", "activated", "policy", policyId);
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
|
||||
String slbMessageData = MessageUtil.getMessageData(request, null, null, null, null, true);
|
||||
messageQueue.produceMessage(request.getRequestURI(), policyId, slbMessageData);
|
||||
|
||||
return responseHandler.handle(resultList, hh.getMediaType());
|
||||
}
|
||||
}
|
|
@ -3,10 +3,7 @@ package com.ctrip.zeus.restful.resource;
|
|||
import com.ctrip.zeus.auth.Authorize;
|
||||
import com.ctrip.zeus.exceptions.ValidationException;
|
||||
import com.ctrip.zeus.executor.TaskManager;
|
||||
import com.ctrip.zeus.model.entity.Group;
|
||||
import com.ctrip.zeus.model.entity.GroupVirtualServer;
|
||||
import com.ctrip.zeus.model.entity.Slb;
|
||||
import com.ctrip.zeus.model.entity.VirtualServer;
|
||||
import com.ctrip.zeus.model.entity.*;
|
||||
import com.ctrip.zeus.restful.message.ResponseHandler;
|
||||
import com.ctrip.zeus.service.build.ConfigHandler;
|
||||
import com.ctrip.zeus.service.message.queue.MessageQueue;
|
||||
|
@ -57,6 +54,8 @@ public class DeactivateResource {
|
|||
private MessageQueue messageQueue;
|
||||
@Resource
|
||||
private ConfigHandler configHandler;
|
||||
@Resource
|
||||
private TrafficPolicyRepository trafficPolicyRepository;
|
||||
|
||||
private static DynamicLongProperty apiTimeout = DynamicPropertyFactory.getInstance().getLongProperty("api.timeout", 15000L);
|
||||
|
||||
|
@ -316,4 +315,114 @@ public class DeactivateResource {
|
|||
}
|
||||
return responseHandler.handle(slb, hh.getMediaType());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/soft/policy")
|
||||
@Authorize(name = "activate")
|
||||
public Response softDeactivatePolicy(@Context HttpServletRequest request,
|
||||
@Context HttpHeaders hh,
|
||||
@QueryParam("vsId") Long vsId,
|
||||
@QueryParam("policyId") Long policyId) throws Exception {
|
||||
TrafficPolicy policy = trafficPolicyRepository.getById(policyId);
|
||||
if (policy == null) {
|
||||
throw new ValidationException("Cannot find policy by Id-" + policyId + ".");
|
||||
}
|
||||
|
||||
ModelStatusMapping<VirtualServer> vsMap = entityFactory.getVsesByIds(new Long[]{vsId});
|
||||
if (vsMap.getOnlineMapping() == null || vsMap.getOnlineMapping().get(vsId) == null) {
|
||||
throw new ValidationException("Vs is not activated.VsId:" + vsId);
|
||||
}
|
||||
|
||||
VirtualServer vs = vsMap.getOnlineMapping().get(vsId);
|
||||
List<OpsTask> softDeactivatingTasks = new ArrayList<>();
|
||||
for (Long slbId : vs.getSlbIds()) {
|
||||
OpsTask task = new OpsTask();
|
||||
task.setSlbVirtualServerId(vsId);
|
||||
task.setCreateTime(new Date());
|
||||
task.setOpsType(TaskOpsType.SOFT_DEACTIVATE_POLICY);
|
||||
task.setTargetSlbId(slbId);
|
||||
task.setPolicyId(policyId);
|
||||
task.setVersion(policy.getVersion());
|
||||
softDeactivatingTasks.add(task);
|
||||
}
|
||||
List<Long> taskIds = taskManager.addTask(softDeactivatingTasks);
|
||||
|
||||
List<TaskResult> results = taskManager.getResult(taskIds, apiTimeout.get());
|
||||
|
||||
TaskResultList resultList = new TaskResultList();
|
||||
for (TaskResult t : results) {
|
||||
resultList.addTaskResult(t);
|
||||
}
|
||||
resultList.setTotal(results.size());
|
||||
|
||||
return responseHandler.handle(resultList, hh.getMediaType());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("/policy")
|
||||
@Authorize(name = "deactivate")
|
||||
public Response deactivatePolicy(@Context HttpServletRequest request, @Context HttpHeaders hh, @QueryParam("policyId") List<Long> policyIds) throws Exception {
|
||||
|
||||
ModelStatusMapping<TrafficPolicy> tpMap = entityFactory.getTrafficPolicies(policyIds.toArray(new Long[]{}));
|
||||
|
||||
if (!tpMap.getOnlineMapping().keySet().containsAll(policyIds)) {
|
||||
throw new ValidationException("Have inactivated policy in " + Joiner.on(",").join(policyIds));
|
||||
}
|
||||
|
||||
Set<Long> vsIds = new HashSet<>();
|
||||
for (Map.Entry<Long, TrafficPolicy> e : tpMap.getOnlineMapping().entrySet()) {
|
||||
TrafficPolicy policy = e.getValue();
|
||||
if (policy == null) {
|
||||
throw new Exception("Unexpected online group with null value. groupId=" + e.getKey() + ".");
|
||||
}
|
||||
for (PolicyVirtualServer vs : policy.getPolicyVirtualServers()) {
|
||||
vsIds.add(vs.getVirtualServer().getId());
|
||||
}
|
||||
}
|
||||
ModelStatusMapping<VirtualServer> vsMap = entityFactory.getVsesByIds(vsIds.toArray(new Long[]{}));
|
||||
|
||||
List<OpsTask> tasks = new ArrayList<>();
|
||||
for (Map.Entry<Long, TrafficPolicy> e : tpMap.getOnlineMapping().entrySet()) {
|
||||
TrafficPolicy policy = e.getValue();
|
||||
|
||||
Set<Long> slbIds = new HashSet<>();
|
||||
for (PolicyVirtualServer pvs : policy.getPolicyVirtualServers()) {
|
||||
VirtualServer vs = vsMap.getOnlineMapping().get(pvs.getVirtualServer().getId());
|
||||
if (vs == null) {
|
||||
throw new ValidationException("Virtual server " + pvs.getVirtualServer().getId() + " is found deactivated.");
|
||||
}
|
||||
slbIds.addAll(vs.getSlbIds());
|
||||
}
|
||||
|
||||
for (Long slbId : slbIds) {
|
||||
OpsTask task = new OpsTask();
|
||||
task.setPolicyId(e.getKey());
|
||||
task.setOpsType(TaskOpsType.DEACTIVATE_POLICY);
|
||||
task.setTargetSlbId(slbId);
|
||||
tasks.add(task);
|
||||
}
|
||||
}
|
||||
List<Long> taskIds = taskManager.addTask(tasks);
|
||||
|
||||
List<TaskResult> results = taskManager.getResult(taskIds, apiTimeout.get());
|
||||
|
||||
TaskResultList resultList = new TaskResultList();
|
||||
for (TaskResult t : results) {
|
||||
resultList.addTaskResult(t);
|
||||
}
|
||||
resultList.setTotal(results.size());
|
||||
|
||||
try {
|
||||
propertyBox.set("status", "deactivated", "policy", tpMap.getOnlineMapping().keySet().toArray(new Long[tpMap.getOnlineMapping().size()]));
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
|
||||
String slbMessageData = MessageUtil.getMessageData(request,
|
||||
null, null, null, null, true);
|
||||
for (Long id : tpMap.getOfflineMapping().keySet()) {
|
||||
messageQueue.produceMessage(request.getRequestURI(), id, slbMessageData);
|
||||
}
|
||||
|
||||
return responseHandler.handle(resultList, hh.getMediaType());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,9 @@ public class TaskOpsType {
|
|||
public static final String ACTIVATE_GROUP = "Activate_Group";
|
||||
public static final String DEACTIVATE_GROUP = "Deactivate_Group";
|
||||
public static final String SOFT_DEACTIVATE_GROUP = "Soft_Deactivate_Group";
|
||||
public static final String SOFT_DEACTIVATE_POLICY = "Soft_Deactivate_Policy";
|
||||
public static final String DEACTIVATE_POLICY = "Deactivate_Policy";
|
||||
public static final String ACTIVATE_POLICY = "Activate_Policy";
|
||||
public static final String ACTIVATE_SLB = "Activate_SLB";
|
||||
public static final String SERVER_OPS = "Server_Ops";
|
||||
public static final String MEMBER_OPS = "Member_Ops";
|
||||
|
|
|
@ -87,6 +87,7 @@ public class C {
|
|||
.setCreateTime(msg.getCreateTime())
|
||||
.setPerformer(msg.getPerformer());
|
||||
}
|
||||
|
||||
public static Message toMessage(MessageQueueDo msg) {
|
||||
return new Message()
|
||||
.setTargetData(msg.getTargetData())
|
||||
|
@ -108,6 +109,7 @@ public class C {
|
|||
.setFailCause(task.getFailCause())
|
||||
.setIpList(task.getIpList())
|
||||
.setGroupId(task.getGroupId())
|
||||
.setPolicyId(task.getPolicyId())
|
||||
.setOpsType(task.getOpsType())
|
||||
.setResources(task.getResources())
|
||||
.setSlbVirtualServerId(task.getSlbVirtualServerId())
|
||||
|
@ -126,6 +128,7 @@ public class C {
|
|||
.setFailCause(opsTask.getFailCause())
|
||||
.setIpList(opsTask.getIpList())
|
||||
.setGroupId(opsTask.getGroupId() == null ? 0 : opsTask.getGroupId())
|
||||
.setGroupId(opsTask.getPolicyId() == null ? 0 : opsTask.getPolicyId())
|
||||
.setOpsType(opsTask.getOpsType())
|
||||
.setResources(opsTask.getResources())
|
||||
.setSlbVirtualServerId(opsTask.getSlbVirtualServerId() == null ? 0 : opsTask.getSlbVirtualServerId())
|
||||
|
@ -209,17 +212,16 @@ public class C {
|
|||
}
|
||||
|
||||
private static String subIds(List<Long> sub) {
|
||||
if(sub==null || sub.size()==0) return null;
|
||||
if (sub == null || sub.size() == 0) return null;
|
||||
|
||||
StringBuilder sb=new StringBuilder();
|
||||
for (Long i:sub)
|
||||
{
|
||||
sb.append(i+",");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (Long i : sub) {
|
||||
sb.append(i + ",");
|
||||
}
|
||||
|
||||
String result=sb.toString();
|
||||
String result = sb.toString();
|
||||
int lastSpliter = result.lastIndexOf(",");
|
||||
|
||||
return result.substring(0,lastSpliter);
|
||||
return result.substring(0, lastSpliter);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2972,6 +2972,7 @@
|
|||
<member name="id" field="id" value-type="long" length="19" nullable="false" key="true" auto-increment="true" />
|
||||
<member name="ops-type" field="ops_type" value-type="String" length="50" nullable="false" />
|
||||
<member name="group-id" field="group_id" value-type="long" length="19" />
|
||||
<member name="policy-id" field="policy_id" value-type="long" length="19" />
|
||||
<member name="slb-id" field="slb_id" value-type="long" length="19" />
|
||||
<member name="slb-virtual-server-id" field="slb_virtual_server_id" value-type="long" length="19" />
|
||||
<member name="ip-list" field="ip_list" value-type="String" length="4096" />
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
<element name="id" value-type="long" />
|
||||
<element name="slb-id" value-type="long" />
|
||||
<element name="group-id" value-type="long" />
|
||||
<element name="policy-id" value-type="long" />
|
||||
<element name="ops-type" value-type="String" />
|
||||
<element name="ip-list" value-type="String" />
|
||||
<element name="up" value-type="boolean" />
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<id>12345678901</id>
|
||||
<slb-id>12345678901</slb-id>
|
||||
<group-id>12345678901</group-id>
|
||||
<policy-id>12345678901</policy-id>
|
||||
<ops-type>type</ops-type>
|
||||
<ip-list>list</ip-list>
|
||||
<up>true</up>
|
||||
|
|
Loading…
Reference in a new issue