task update for policy

This commit is contained in:
vfqq樊琪琦 2017-01-24 13:50:18 +08:00
parent ec1ab8e95f
commit b1d8c8c6a7
8 changed files with 449 additions and 40 deletions

View file

@ -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;
}
}
}

View file

@ -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());
}
}

View file

@ -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());
}
}

View file

@ -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";

View file

@ -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);
}
}

View file

@ -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" />

View file

@ -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" />

View file

@ -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>