update vs activate and group activate

This commit is contained in:
fanqq 2015-12-09 19:29:23 +08:00
parent d60ebbf15c
commit 0122779f6e
5 changed files with 189 additions and 62 deletions

View file

@ -9,6 +9,7 @@ import com.ctrip.zeus.service.activate.ActivateService;
import com.ctrip.zeus.service.build.BuildInfoService;
import com.ctrip.zeus.service.build.BuildService;
import com.ctrip.zeus.service.nginx.NginxService;
import com.ctrip.zeus.service.query.VirtualServerCriteriaQuery;
import com.ctrip.zeus.service.status.StatusOffset;
import com.ctrip.zeus.service.status.StatusService;
import com.ctrip.zeus.service.task.TaskService;
@ -44,6 +45,8 @@ public class TaskExecutorImpl implements TaskExecutor {
NginxService nginxService;
@Resource
private BuildInfoService buildInfoService;
@Resource
private VirtualServerCriteriaQuery virtualServerCriteriaQuery;
Logger logger = LoggerFactory.getLogger(this.getClass());
@ -194,7 +197,7 @@ public class TaskExecutorImpl implements TaskExecutor {
}
}
}
performTasks(slbId,groupVs);
performTasks(slbId,groupVs,activatingGroups,activatingVses);
updateVersion(slbId);
setTaskResult(slbId,true,null);
}catch (Exception e){
@ -236,22 +239,42 @@ public class TaskExecutorImpl implements TaskExecutor {
private HashMap<Long, VirtualServer> getActivatingVses(HashMap<Long, OpsTask> activateVsOps,HashMap<Long, OpsTask> deactivateVsOps, Long slbId) {
HashMap<Long,VirtualServer> result = new HashMap<>();
Set<Long> vsIds = activateVsOps.keySet();
List<Long> tmpIds = new ArrayList<>();
List<Integer> versions = new ArrayList<>();
for (Long vsId : vsIds){
OpsTask task = activateVsOps.get(vsId);
if (deactivateVsOps.containsKey(vsId)){
setTaskFail(activateVsOps.get(vsId),"Activating and Deactivating Vs at same time! VsId:"+vsId);
setTaskFail(task ,"Activating and Deactivating Vs at same time! VsId:"+vsId);
continue;
}
VirtualServer vs = activateService.getActivatingVirtualServer(vsId,activateVsOps.get(vsId).getVersion());
if ( vs != null ){
if ( !vs.getSlbId().equals( slbId) ){
setTaskFail(activateVsOps.get(vsId), "Activating Vs Fail! Not Found Vs[" + vsId + "] In Slb: " + slbId);
continue;
tmpIds.add(vsId);
versions.add(task.getVersion());
// VirtualServer vs = activateService.getActivatingVirtualServer(vsId,activateVsOps.get(vsId).getVersion());
// if ( vs != null ){
// if ( !vs.getSlbId().equals( slbId) ){
// setTaskFail(activateVsOps.get(vsId), "Activating Vs Fail! Not Found Vs[" + vsId + "] In Slb: " + slbId);
// continue;
// }
// result.put(vsId,vs);
// }
}
List<VirtualServer> vses = activateService.getActivatingVirtualServers(tmpIds.toArray(new Long[]{}),versions.toArray(new Integer[]{}));
for (VirtualServer vs : vses){
if ( !vs.getSlbId().equals( slbId) ){
setTaskFail(activateVsOps.get(vs.getId()), "Activating Vs Fail! Not Found Vs[" + vs.getId() + "] In Slb: " + slbId);
continue;
}
result.put(vs.getId(),vs);
}
if (result.size() != tmpIds.size()){
for (Long vsid : tmpIds){
if (!result.containsKey(vsid)){
setTaskFail(activateVsOps.get(vsid), "Activating Vs Fail! Not Found Vs[" + vsid + "] In Slb: " + slbId);
}
result.put(vsId,vs);
}
}
return result;
}
private void updateVersion(Long slbId) throws Exception{
@ -276,7 +299,7 @@ public class TaskExecutorImpl implements TaskExecutor {
}
}
private void performTasks(Long slbId,Map<Long,Long> groupVs) throws Exception{
private void performTasks(Long slbId,Map<Long,Long> groupVs,Map<Long,Group> activatingGroups,Map<Long,VirtualServer> activatingVses) throws Exception{
try {
for (OpsTask task :activateSlbOps.values()){
if (!task.getStatus().equals(TaskStatus.DOING)){
@ -288,7 +311,8 @@ public class TaskExecutorImpl implements TaskExecutor {
if (!task.getStatus().equals(TaskStatus.DOING)){
continue;
}
activateService.activeVirtualServer(task.getSlbVirtualServerId(),task.getVersion(),slbId);
VirtualServer vs = activatingVses.get(task.getSlbVirtualServerId());
activateService.activeVirtualServer(task.getSlbVirtualServerId(),vs,task.getVersion(),slbId);
}
for (OpsTask task : deactivateVsOps.values()){
if (!task.getStatus().equals(TaskStatus.DOING)){
@ -300,7 +324,8 @@ public class TaskExecutorImpl implements TaskExecutor {
if (!task.getStatus().equals(TaskStatus.DOING)){
continue;
}
activateService.activeGroup(task.getGroupId(), task.getVersion(),groupVs.get(task.getGroupId()),slbId);
Group group = activatingGroups.get(task.getGroupId());
activateService.activeGroup(task.getGroupId(),group,task.getVersion(),groupVs.get(task.getGroupId()),slbId);
}
for (OpsTask task :deactivateGroupOps.values()){
if (!task.getStatus().equals(TaskStatus.DOING)){
@ -326,7 +351,8 @@ public class TaskExecutorImpl implements TaskExecutor {
}
String [] ips = task.getIpList().split(";");
List<String>ipList = Arrays.asList(ips);
statusService.updateStatus(slbId,task.getGroupId(),ipList,StatusOffset.MEMBER_OPS,task.getUp());
Long vsId = groupVs.get(task.getGroupId());
statusService.updateStatus(slbId,vsId,task.getGroupId(),ipList,StatusOffset.MEMBER_OPS,task.getUp());
}
}
for (List<OpsTask> taskList :pullMemberOps.values()){
@ -336,7 +362,8 @@ public class TaskExecutorImpl implements TaskExecutor {
}
String [] ips = task.getIpList().split(";");
List<String>ipList = Arrays.asList(ips);
statusService.updateStatus(slbId,task.getGroupId(),ipList,StatusOffset.PULL_OPS,task.getUp());
Long vsId = groupVs.get(task.getGroupId());
statusService.updateStatus(slbId,vsId,task.getGroupId(),ipList,StatusOffset.PULL_OPS,task.getUp());
}
}
}catch (Exception e){
@ -470,10 +497,13 @@ public class TaskExecutorImpl implements TaskExecutor {
for (Long groupId : memberGroups){
if (!activateService.isGroupActivated(groupId,null)){
List<OpsTask> tasksList = memberOps.get(groupId);
Set<Long> vsIds = virtualServerCriteriaQuery.queryByGroupIds(new Long[]{groupId});
for(OpsTask opsTask : tasksList){
String ips = opsTask.getIpList();
String[]iplist = ips.split(";");
statusService.updateStatus(slbId , groupId, Arrays.asList(iplist),StatusOffset.MEMBER_OPS,opsTask.getUp());
for (Long vsid : vsIds){
statusService.updateStatus(slbId ,vsid, groupId, Arrays.asList(iplist),StatusOffset.MEMBER_OPS,opsTask.getUp());
}
opsTask.setStatus(TaskStatus.SUCCESS);
}
memberOps.remove(groupId);
@ -483,10 +513,13 @@ public class TaskExecutorImpl implements TaskExecutor {
for (Long groupId : pullMemberGroups){
if (!activateService.isGroupActivated(groupId,null)){
List<OpsTask> tasksList = pullMemberOps.get(groupId);
Set<Long> vsIds = virtualServerCriteriaQuery.queryByGroupIds(new Long[]{groupId});
for(OpsTask opsTask : tasksList){
String ips = opsTask.getIpList();
String[]iplist = ips.split(";");
statusService.updateStatus(slbId , groupId, Arrays.asList(iplist),StatusOffset.PULL_OPS,opsTask.getUp());
for (Long vsid : vsIds) {
statusService.updateStatus(slbId,vsid, groupId, Arrays.asList(iplist), StatusOffset.PULL_OPS, opsTask.getUp());
}
opsTask.setStatus(TaskStatus.SUCCESS);
}
pullMemberOps.remove(groupId);
@ -521,18 +554,34 @@ public class TaskExecutorImpl implements TaskExecutor {
private HashMap<Long, Group> getActivatingGroups(HashMap<Long , OpsTask> activateGroupOps) {
HashMap<Long , Group> result = new HashMap<>();
Set<Long> groupIds = activateGroupOps.keySet();
for (Long groupId : groupIds){
List<Long> gids = new ArrayList<>();
List<Integer> versions = new ArrayList<>();
for (Long groupId : groupIds) {
OpsTask task = activateGroupOps.get(groupId);
if (deactivateGroupOps.containsKey(groupId)){
setTaskFail(task,"Deactivating this group at the same time!");
if (deactivateGroupOps.containsKey(groupId)) {
setTaskFail(task, "Deactivating this group at the same time!");
continue;
}
Group group = activateService.getActivatingGroup(groupId,task.getVersion());
if (group == null){
setTaskFail(task,"Get Archive Group Fail! GroupId:"+groupId+";Version:"+task.getVersion());
}else {
result.put(groupId,group);
gids.add(groupId);
versions.add(task.getVersion());
// Group group = activateService.getActivatingGroup(groupId, task.getVersion());
// if (group == null) {
// setTaskFail(task, "Get Archive Group Fail! GroupId:" + groupId + ";Version:" + task.getVersion());
// } else {
// result.put(groupId, group);
// }
}
List<Group> groups = activateService.getActivatingGroups(gids.toArray(new Long[]{}),versions.toArray(new Integer[]{}));
for (Group g : groups){
result.put(g.getId(),g);
}
if (result.size() != gids.size()){
for (Long gid : gids){
if (!result.containsKey(gid)){
OpsTask task = activateGroupOps.get(gid);
setTaskFail(task, "Get Archive Group Fail! GroupId:" + gid + ";Version:" + task.getVersion());
}
}
}
return result;

View file

@ -29,7 +29,15 @@ public interface ActivateService extends Repository {
* @throws Exception
*/
public void activeGroup(long groupId ,int version , Long vsId , Long slbId) throws Exception;
/**
* activate group
* @param groupId the Group id
* @param group the group obj
* @param vsId the vsId
* @param slbId the slbId
* @throws Exception
*/
public void activeGroup(long groupId ,Group group ,int version, Long vsId , Long slbId) throws Exception;
/**
* activate group
* @param version the version
@ -37,7 +45,7 @@ public interface ActivateService extends Repository {
* @param slbId the slbId
* @throws Exception
*/
public void activeVirtualServer(long vsId ,int version , Long slbId) throws Exception;
public void activeVirtualServer(long vsId ,VirtualServer vs , int version , Long slbId) throws Exception;
/**
@ -104,6 +112,14 @@ public interface ActivateService extends Repository {
*/
public Group getActivatingGroup(Long groupId, int version);
/**
* get activating groups
* @param groupIds , the Group id
* @param versions , Version
* @return groups
*/
public List<Group> getActivatingGroups(Long[] groupIds, Integer[] versions);
/**
* get activating slb
* @param vsId the slb ID
@ -112,6 +128,14 @@ public interface ActivateService extends Repository {
*/
public VirtualServer getActivatingVirtualServer(Long vsId,int version);
/**
* get activating slb
* @param vsIds the slb ID
* @param versions the version
* @return vses
*/
public List<VirtualServer> getActivatingVirtualServers(Long[] vsIds,Integer[] versions);
/**
* get activating slb

View file

@ -1,6 +1,7 @@
package com.ctrip.zeus.service.activate.impl;
import com.ctrip.zeus.dal.core.*;
import com.ctrip.zeus.exceptions.ValidationException;
import com.ctrip.zeus.model.entity.*;
import com.ctrip.zeus.model.transform.DefaultSaxParser;
import com.ctrip.zeus.service.activate.ActivateService;
@ -85,11 +86,38 @@ public class ActivateServiceImpl implements ActivateService {
}
@Override
public void activeVirtualServer(long vsId, int version, Long slbId) throws Exception {
Archive archive = archiveService.getVsArchive(vsId, version);
AssertUtils.assertNotNull(archive, "[activate]get Virtual Server Archive return Null! VsId: " + vsId);
public void activeGroup(long groupId, Group group,int version, Long vsId, Long slbId) throws Exception {
//while Group updated VsId, both vsIds belong to same slb, we need to delete the old version group active conf.
ConfGroupActiveDo confGroupActiveDo = confGroupActiveDao.findByGroupIdAndVirtualServerId(groupId,vsId,ConfGroupActiveEntity.READSET_FULL);
if (confGroupActiveDo == null){
List<ConfGroupActiveDo> groups = confGroupActiveDao.findAllByGroupIds(new Long[]{groupId},ConfGroupActiveEntity.READSET_FULL);
if (groups!=null && groups.size() > 0){
List<Long> gvsIds = new ArrayList<>();
for (ConfGroupActiveDo groupActiveDo : groups){
gvsIds.add(groupActiveDo.getSlbVirtualServerId());
}
List<ConfSlbVirtualServerActiveDo> vses = confSlbVirtualServerActiveDao.findBySlbIdAndSlbVirtualServerIds(gvsIds.toArray(new Long[]{}),slbId,ConfSlbVirtualServerActiveEntity.READSET_FULL);
for (ConfSlbVirtualServerActiveDo confSlbVirtualServerActiveDo : vses){
confGroupActiveDao.deleteByGroupIdAndSlbVirtualServerId(new ConfGroupActiveDo().setGroupId(groupId).setSlbVirtualServerId(confSlbVirtualServerActiveDo.getSlbVirtualServerId()));
}
}
}
String content = String.format(Group.XML, group);
ConfGroupActiveDo c = new ConfGroupActiveDo().setCreatedTime(new Date());
c.setGroupId(groupId).setContent(content).setVersion(version).setSlbVirtualServerId(vsId).setSlbId(slbId);
confGroupActiveDao.insert(c);
logger.info("Conf Group Active Inserted: [GroupId: " + c.getId() + ",Content: " + c.getContent() + ",Version: " + c.getVersion() + "]");
}
@Override
public void activeVirtualServer(long vsId, VirtualServer vs ,int version, Long slbId) throws Exception {
if (vs == null){
throw new ValidationException("Virtual Server is Null! vsId:"+vsId);
}
ConfSlbVirtualServerActiveDo confSlbVirtualServerActiveDo = new ConfSlbVirtualServerActiveDo();
confSlbVirtualServerActiveDo.setContent(archive.getContent())
confSlbVirtualServerActiveDo.setContent(String.format(VirtualServer.XML,vs))
.setSlbId(slbId).setVersion(version)
.setSlbVirtualServerId(vsId)
.setCreatedTime(new Date());
@ -160,7 +188,7 @@ public class ActivateServiceImpl implements ActivateService {
@Override
public boolean isVsActivated(Long vsId, Long slbId) throws Exception {
List<ConfSlbVirtualServerActiveDo> c = confSlbVirtualServerActiveDao.findBySlbIdAndSlbVirtualServerIds(new Long[]{vsId},slbId,ConfSlbVirtualServerActiveEntity.READSET_FULL);
List<ConfSlbVirtualServerActiveDo> c = confSlbVirtualServerActiveDao.findBySlbIdAndSlbVirtualServerIds(new Long[]{vsId}, slbId, ConfSlbVirtualServerActiveEntity.READSET_FULL);
return !(c == null || c.size() == 0 );
}
@ -189,6 +217,28 @@ public class ActivateServiceImpl implements ActivateService {
return null;
}
@Override
public List<Group> getActivatingGroups(Long[] groupIds, Integer[] versions) {
List<Group> result = new ArrayList<>();
try {
List<Archive> list = archiveService.getGroupArchives(groupIds, versions);
if (list == null || list.size() == 0){
return result;
}
for (Archive archive : list){
String content = archive.getContent();
Group group = DefaultSaxParser.parseEntity(Group.class, content);
if (group != null){
autoFiller.autofill(group);
result.add(group);
}
}
} catch (Exception e) {
logger.warn("Archive Parser Fail ! GroupId:"+Arrays.asList(groupIds).toString()+" Version:"+Arrays.asList(versions).toString());
}
return result;
}
@Override
public VirtualServer getActivatingVirtualServer(Long vsId, int version) {
try {
@ -204,6 +254,27 @@ public class ActivateServiceImpl implements ActivateService {
return null;
}
@Override
public List<VirtualServer> getActivatingVirtualServers(Long[] vsIds, Integer[] versions) {
List<VirtualServer> result = new ArrayList<>();
try {
List<Archive> archives = archiveService.getVsArchives(vsIds, versions);
if (archives == null || archives.size() == 0){
return result;
}
for (Archive archive : archives){
String content = archive.getContent();
VirtualServer tmp = DefaultSaxParser.parseEntity(VirtualServer.class, content);
if (tmp != null){
result.add(tmp);
}
}
} catch (Exception e) {
logger.warn("[getActivatingVirtualServer] Archive Parser Fail ! VsId:"+Arrays.asList(vsIds).toString()+" Version:"+Arrays.asList(versions).toString(),e);
}
return result;
}
@Override
public Slb getActivatingSlb(Long slbId , int version) {
try {

View file

@ -52,7 +52,7 @@ public interface StatusService extends Repository {
* @param status status enable = true , disable = false
* @throws Exception
*/
void updateStatus(Long slbId ,Long groupId, List<String> ips , int offset , boolean status)throws Exception;
void updateStatus(Long slbId ,Long vsId , Long groupId, List<String> ips , int offset , boolean status)throws Exception;
/**
* get server status by server ip

View file

@ -88,41 +88,24 @@ public class StatusServiceImpl implements StatusService {
}
@Override
public void updateStatus(Long slbId, Long groupId, List<String> ips, int offset, boolean status) throws Exception {
public void updateStatus(Long slbId,Long vsId , Long groupId, List<String> ips, int offset, boolean status) throws Exception {
if (offset > 30 || offset < 0){
throw new Exception("offset of status should be [0-30]");
}
Group group;
if(activateService.isGroupActivated(groupId,slbId)){
group = activateService.getActivatedGroup(groupId,slbId);
}else {
group = groupRepository.getById(groupId);
}
if (group == null){
return;
}
List<GroupVirtualServer> groupVirtualServers = group.getGroupVirtualServers();
for (GroupVirtualServer groupVirtualServer : groupVirtualServers){
if (!groupVirtualServer.getVirtualServer().getSlbId().equals(slbId)){
for (String ip : ips) {
if (ip==null||ip.isEmpty())
{
continue;
}
for (String ip : ips) {
if (ip==null||ip.isEmpty())
{
continue;
}
StatusGroupServerDo data = new StatusGroupServerDo();
data.setSlbVirtualServerId(groupVirtualServer.getVirtualServer().getId())
.setGroupId(groupId)
.setIp(ip)
.setCreatedTime(new Date());
int reset = ~(1 << offset);
int updatestatus = (status?0:1)<<offset;
data.setReset(reset).setStatus(updatestatus);
statusGroupServerDao.updateStatus(data);
}
logger.info("[update status]: VirtualServer:"+groupVirtualServer.toString()+"ips:"+ips.toString());
StatusGroupServerDo data = new StatusGroupServerDo();
data.setSlbVirtualServerId(vsId)
.setGroupId(groupId)
.setIp(ip)
.setCreatedTime(new Date());
int reset = ~(1 << offset);
int updatestatus = (status?0:1)<<offset;
data.setReset(reset).setStatus(updatestatus);
statusGroupServerDao.updateStatus(data);
}
}