package com.sobey.cmop.mvc.service.operate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Maps;
import com.sobey.cmop.mvc.comm.BaseSevcie;
import com.sobey.cmop.mvc.constant.ApplyConstant;
import com.sobey.cmop.mvc.constant.IpPoolConstant;
import com.sobey.cmop.mvc.constant.RedmineConstant;
import com.sobey.cmop.mvc.constant.ResourcesConstant;
import com.sobey.cmop.mvc.dao.RedmineIssueDao;
import com.sobey.cmop.mvc.entity.Apply;
import com.sobey.cmop.mvc.entity.Change;
import com.sobey.cmop.mvc.entity.ComputeItem;
import com.sobey.cmop.mvc.entity.CpItem;
import com.sobey.cmop.mvc.entity.HostServer;
import com.sobey.cmop.mvc.entity.IpPool;
import com.sobey.cmop.mvc.entity.Location;
import com.sobey.cmop.mvc.entity.MdnItem;
import com.sobey.cmop.mvc.entity.MonitorCompute;
import com.sobey.cmop.mvc.entity.MonitorElb;
import com.sobey.cmop.mvc.entity.NetworkDnsItem;
import com.sobey.cmop.mvc.entity.NetworkEipItem;
import com.sobey.cmop.mvc.entity.NetworkElbItem;
import com.sobey.cmop.mvc.entity.RedmineIssue;
import com.sobey.cmop.mvc.entity.Resources;
import com.sobey.cmop.mvc.entity.ServiceTag;
import com.sobey.cmop.mvc.entity.StorageItem;
import com.sobey.cmop.mvc.entity.User;
import com.sobey.cmop.mvc.entity.Vlan;
import com.sobey.cmop.mvc.service.redmine.RedmineService;
import com.sobey.framework.utils.DynamicSpecifications;
import com.sobey.framework.utils.SearchFilter;
import com.sobey.framework.utils.SearchFilter.Operator;
import com.taskadapter.redmineapi.RedmineManager;
import com.taskadapter.redmineapi.bean.Issue;
/**
* 工单RedmineIssue 相关的管理类.
*
* @author liukai
*/
@Service
@Transactional(readOnly = true)
public class OperateService extends BaseSevcie {
private static Logger logger = LoggerFactory.getLogger(OperateService.class);
@Resource
private RedmineIssueDao redmineIssueDao;
public RedmineIssue getRedmineIssue(Integer id) {
return redmineIssueDao.findOne(id);
}
/**
* 根据issueId获得工单RedmineIssue
*
* @param issueId
* @return
*/
public RedmineIssue findByIssueId(Integer issueId) {
return redmineIssueDao.findByIssueId(issueId);
}
/**
* 新增或更新工单 RedmineIssue
*
* @param redmineIssue
* @return
*/
@Transactional(readOnly = false)
public RedmineIssue saveOrUpdate(RedmineIssue redmineIssue) {
return redmineIssueDao.save(redmineIssue);
}
/**
* 获得所有的工单.
*
* @param searchParams
* 页面传递过来的参数
* @param pageNumber
* @param pageSize
* @return
*/
public Page<RedmineIssue> getReportedIssuePageable(Map<String, Object> searchParams, int pageNumber, int pageSize) {
PageRequest pageRequest = buildPageRequest(pageNumber, pageSize);
Map<String, SearchFilter> filters = SearchFilter.parse(searchParams);
Specification<RedmineIssue> spec = DynamicSpecifications.bySearchFilter(filters.values(), RedmineIssue.class);
return redmineIssueDao.findAll(spec, pageRequest);
}
/**
* 获得指派的工单.
*
* @param searchParams
* 页面传递过来的参数
* @param pageNumber
* @param pageSize
* @return
*/
public Page<RedmineIssue> getAssignedIssuePageable(Map<String, Object> searchParams, int pageNumber, int pageSize) {
PageRequest pageRequest = buildPageRequest(pageNumber, pageSize);
Map<String, SearchFilter> filters = SearchFilter.parse(searchParams);
User user = comm.accountService.getCurrentUser();
// 和redmine中的UserId关联的Id.
Integer assignee = user.getRedmineUserId();
filters.put("redmineIssue.assignee", new SearchFilter("assignee", Operator.EQ, assignee));
filters.put("redmineIssue.status",
new SearchFilter("status", Operator.NOT, RedmineConstant.Status.关闭.toInteger()));
Specification<RedmineIssue> spec = DynamicSpecifications.bySearchFilter(filters.values(), RedmineIssue.class);
return redmineIssueDao.findAll(spec, pageRequest);
}
/**
* 更新工单
*
* <pre>
* 1.更新redmine的数据.如果更新成功进行下一步操作,失败提示失败信息.
* 2.根据RedmineIssue对象中的applyId, serviceTagId, recycleId进行不同的逻辑操作.
* applyId != null 表示服务申请.
* serviceTagId != null 表示资源变更.
* resourceId != null 表示资源回收.
* 三种字段都为null 表示故障申报.
* 3.更新RedmineIssue的状态
* </pre>
*
* @param issue
* @return
*/
@Transactional(readOnly = false)
public boolean updateOperate(Issue issue, String computeIds, String storageIds, String hostNames,
String serverAlias, String osStorageAlias, String controllerAlias, String volumes, String innerIps,
String[] eipIds, String[] eipAddress, String location, String elbIds, String virtualIps) {
long start = System.currentTimeMillis();
logger.info("--->工单处理...");
try {
/* Step.1 更新redmine的数据 */
User user = comm.accountService.getCurrentUser();
RedmineManager mgr = new RedmineManager(RedmineService.HOST,
RedmineConstant.REDMINE_ASSIGNEE_KEY_MAP.get(user.getRedmineUserId()));
boolean isChanged = RedmineService.changeIssue(issue, mgr);
logger.info("---> Redmine isChanged?" + isChanged);
if (isChanged) {
// 更新写入OneCMDB时需要人工选择填入的关联项
boolean saveOk = saveNewIpVolume(computeIds, storageIds, hostNames, serverAlias, osStorageAlias,
controllerAlias, volumes, innerIps, eipIds, eipAddress, location, elbIds, virtualIps, issue);
if (!saveOk) {
return false;
}
// 设置工单的下一个接收人.
RedmineIssue redmineIssue = this.findByIssueId(issue.getId());
redmineIssue.setAssignee(issue.getAssignee().getId());
/*
* Step.2 根据RedmineIssue对象中的applyId, serviceTagId, recycleId进行不同的逻辑操作
*/
Integer applyId = redmineIssue.getApplyId();
Integer serviceTagId = redmineIssue.getServiceTagId();
String recycleId = redmineIssue.getResourceId();
logger.info("--->[applyId、serviceTagId、recycleId]:" + applyId + "、" + serviceTagId + "、" + recycleId);
if (applyId != null) {
// 服务申请
this.applyOperate(issue, comm.applyService.getApply(applyId));
} else if (serviceTagId != null && recycleId == null) {
// 资源变更
this.resourcesOperate(issue, serviceTagId);
} else if (recycleId != null) {
// 资源回收
this.recycleOperate(issue, recycleId, serviceTagId);
} else {
// 故障申报
this.failureOperate(issue);
}
/* Step.3 更新RedmineIssue状态 */
Integer status = RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio()) ? RedmineConstant.Status.关闭
.toInteger() : RedmineConstant.Status.处理中.toInteger();
redmineIssue.setStatus(status);
this.saveOrUpdate(redmineIssue);
logger.info("--->工单处理结束!");
logger.info("--->工单更新处理成功!耗时:" + (System.currentTimeMillis() - start) / 1000 + "s");
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
logger.error("--->工单更新处理失败:" + e.getMessage());
return false;
}
}
/**
* 服务申请的工单处理. 包括邮件的发送;申请单状态的更改;工单处理完成后向resources表插入数据;数据同步至OneCMDB.
*
*/
@Transactional(readOnly = false)
private void applyOperate(Issue issue, Apply apply) {
logger.info("--->服务申请处理...");
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) { // 处理完成,状态为已创建
logger.info("---> 完成度 = 100%的工单处理...");
// 更新服务申请状态
apply.setStatus(ApplyConstant.Status.已创建.toInteger());
// 向资源表 resources 写入记录,并插入oneCMDB中.
comm.resourcesService.insertResourcesAndOneCMDBAfterOperate(apply);
// 工单处理完成,给申请人发送邮件
comm.templateMailService.sendApplyOperateDoneNotificationMail(apply);
logger.info("--->工单处理完成,发送邮件通知申请人:" + apply.getUser().getName());
} else {
logger.info("---> 完成度 < 100%的工单处理...");
// 更新服务申请状态
apply.setStatus(ApplyConstant.Status.处理中.toInteger());
// 发送邮件通知下个指派人
User assigneeUser = comm.accountService.findUserByRedmineUserId(issue.getAssignee().getId());
comm.templateMailService.sendApplyOperateNotificationMail(apply, assigneeUser);
}
comm.applyService.saveOrUpateApply(apply);
}
/**
* 资源变更的工单处理. 包括邮件的发送;服务标签servicTag和资源resources状态的更改;数据同步至OneCMDB.
*
*/
/**
* @param issue
* @param serviceTagId
*/
@Transactional(readOnly = false)
private void resourcesOperate(Issue issue, Integer serviceTagId) {
logger.info("--->服务变更处理...");
ServiceTag serviceTag = comm.serviceTagService.getServiceTag(serviceTagId);
List<Resources> resourcesList = comm.resourcesService.getChangedResourcesListByServiceTagId(serviceTagId);
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) {
logger.info("---> 完成度 = 100%的工单处理...");
// 更改服务标签和资源的状态
serviceTag.setStatus(ResourcesConstant.Status.已创建.toInteger());
for (Resources resources : resourcesList) {
resources.setStatus(ResourcesConstant.Status.已创建.toInteger());
// 清除服务变更Change的内容
List<Change> changes = comm.changeServcie.getChangeListByResourcesId(resources.getId());
comm.changeServcie.deleteChange(changes);
Integer serviceType = resources.getServiceType();
Integer serviceId = resources.getServiceId();
/* resource变更审批通过时,同步数据到oneCMDB. */
if (ResourcesConstant.ServiceType.PCS.toInteger().equals(serviceType)
|| ResourcesConstant.ServiceType.ECS.toInteger().equals(serviceType)) {
ComputeItem computeItem = comm.computeService.getComputeItem(serviceId);
// PCS & ECS
comm.oneCmdbUtilService.saveComputeToOneCMDB(computeItem, serviceTag);
resources.setOldIp(resources.getIpAddress());
resources.setIpAddress(computeItem.getInnerIp());
} else if (ResourcesConstant.ServiceType.ES3.toInteger().equals(serviceType)) {
// ES3
comm.oneCmdbUtilService.saveStorageToOneCMDB(comm.es3Service.getStorageItem(serviceId), serviceTag);
} else if (ResourcesConstant.ServiceType.ELB.toInteger().equals(serviceType)) {
NetworkElbItem networkElbItem = comm.elbService.getNetworkElbItem(serviceId);
// ELB
comm.oneCmdbUtilService.saveELBToOneCMDB(networkElbItem, serviceTag);
resources.setOldIp(resources.getIpAddress());
resources.setIpAddress(networkElbItem.getVirtualIp());
} else if (ResourcesConstant.ServiceType.EIP.toInteger().equals(serviceType)) {
NetworkEipItem networkEipItem = comm.eipService.getNetworkEipItem(serviceId);
// EIP
comm.oneCmdbUtilService.saveEIPToOneCMDB(networkEipItem, serviceTag);
resources.setOldIp(resources.getIpAddress());
resources.setIpAddress(networkEipItem.getIpAddress());
} else if (ResourcesConstant.ServiceType.DNS.toInteger().equals(serviceType)) {
// DNS
comm.oneCmdbUtilService.saveDNSToOneCMDB(comm.dnsService.getNetworkDnsItem(serviceId), serviceTag);
} else if (ResourcesConstant.ServiceType.MONITOR_COMPUTE.toInteger().equals(serviceType)) {
// TODO 待完成.
// monitorCompute
MonitorCompute monitorCompute = comm.monitorComputeServcie.getMonitorCompute(serviceId);
resources.setIpAddress(monitorCompute.getIpAddress());
} else if (ResourcesConstant.ServiceType.MONITOR_ELB.toInteger().equals(serviceType)) {
// monitorElb
MonitorElb monitorElb = comm.monitorElbServcie.getMonitorElb(serviceId);
resources.setIpAddress(monitorElb.getNetworkElbItem().getVirtualIp());
} else if (ResourcesConstant.ServiceType.MDN.toInteger().equals(serviceType)) {
// MDN
} else if (ResourcesConstant.ServiceType.CP.toInteger().equals(serviceType)) {
// CP
}
comm.resourcesService.saveOrUpdate(resources);
}
// 工单处理完成,给申请人发送邮件
comm.templateMailService.sendResourcesOperateDoneNotificationMail(serviceTag);
logger.info("--->工单处理完成,发送邮件通知申请人:" + serviceTag.getUser().getName());
} else {
logger.info("---> 完成度 < 100%的工单处理...");
// 更改服务标签和资源的状态
serviceTag.setStatus(ResourcesConstant.Status.创建中.toInteger());
for (Resources resources : resourcesList) {
resources.setStatus(ResourcesConstant.Status.创建中.toInteger());
comm.resourcesService.saveOrUpdate(resources);
}
// 发送邮件通知下个指派人
User assigneeUser = comm.accountService.findUserByRedmineUserId(issue.getAssignee().getId());
comm.templateMailService.sendResourcesOperateNotificationMail(serviceTag, assigneeUser);
}
comm.serviceTagService.saveOrUpdate(serviceTag);
}
/**
* 资源回收的工单处理. 包括邮件的发送;服务标签servicTag和资源resources状态的更改;数据同步至OneCMDB.
*
*/
@Transactional(readOnly = false)
private void recycleOperate(Issue issue, String recycleId, Integer serviceTagId) {
logger.info("--->联资源回收...");
// 收件人
User sendToUser = null;
// 拼装回收的资源resource,放入List中.
List<Resources> resourcesList = new ArrayList<Resources>();
for (String resourcesId : StringUtils.split(recycleId, ",")) {
Resources resources = comm.resourcesService.getResources(Integer.valueOf(resourcesId));
resourcesList.add(resources);
sendToUser = resources.getUser();
}
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) {
logger.info("---> 完成度 = 100%的工单处理...");
// 删除资源.同时OneCMDB中的数据也删除.
for (Resources resources : resourcesList) {
Integer serviceType = resources.getServiceType();
Integer serviceId = resources.getServiceId();
if (ResourcesConstant.ServiceType.PCS.toInteger().equals(serviceType)
|| ResourcesConstant.ServiceType.ECS.toInteger().equals(serviceType)) {
ComputeItem computeItem = comm.computeService.getComputeItem(serviceId);
// 初始化IPAddress
comm.ipPoolService.initIpPool(computeItem.getInnerIp());
// PCS & ECS
comm.oneCmdbUtilService.deleteComputeItemToOneCMDB(computeItem);
comm.computeService.deleteCompute(serviceId);
} else if (ResourcesConstant.ServiceType.ES3.toInteger().equals(serviceType)) {
// ES3
comm.oneCmdbUtilService.deleteStorageItemToOneCMDB(comm.es3Service.getStorageItem(serviceId));
comm.es3Service.deleteStorageItem(serviceId);
} else if (ResourcesConstant.ServiceType.ELB.toInteger().equals(serviceType)) {
// ELB
NetworkElbItem networkElbItem = comm.elbService.getNetworkElbItem(serviceId);
// 初始化IPAddress
if (networkElbItem != null) {
comm.ipPoolService.initIpPool(networkElbItem.getVirtualIp());
}
comm.oneCmdbUtilService.deleteELBToOneCMDB(networkElbItem);
comm.elbService.deleteNetworkElbItem(serviceId);
} else if (ResourcesConstant.ServiceType.EIP.toInteger().equals(serviceType)) {
NetworkEipItem networkEipItem = comm.eipService.getNetworkEipItem(serviceId);
if (networkEipItem != null) {
// 初始化IPAddress
comm.ipPoolService.initIpPool(networkEipItem.getIpAddress());
}
// EIP
comm.oneCmdbUtilService.deleteEIPToOneCMDB(networkEipItem);
comm.eipService.deleteNetworkEipItem(serviceId);
} else if (ResourcesConstant.ServiceType.DNS.toInteger().equals(serviceType)) {
// DNS
comm.oneCmdbUtilService.deleteDNSToOneCMDB(comm.dnsService.getNetworkDnsItem(serviceId));
comm.dnsService.deleteNetworkDnsItem(serviceId);
} else if (ResourcesConstant.ServiceType.MONITOR_COMPUTE.toInteger().equals(serviceType)) {
// monitorCompute
comm.monitorComputeServcie.deleteMonitorCompute(serviceId);
} else if (ResourcesConstant.ServiceType.MONITOR_ELB.toInteger().equals(serviceType)) {
// monitorElb
comm.monitorElbServcie.deleteMonitorElb(serviceId);
} else if (ResourcesConstant.ServiceType.MDN.toInteger().equals(serviceType)) {
// MDN
comm.mdnService.deleteMdnItem(serviceId);
} else if (ResourcesConstant.ServiceType.CP.toInteger().equals(serviceType)) {
// CP
comm.cpService.delete(serviceId);
}
comm.resourcesService.deleteResources(resources.getId());
}
if (serviceTagId != null) {
// 删除服务标签
comm.serviceTagService.delete(serviceTagId);
}
// 工单处理完成,给申请人发送邮件
comm.templateMailService.sendRecycleResourcesOperateDoneNotificationMail(sendToUser);
logger.info("--->资源回收处理完成");
} else {
logger.info("---> 完成度 < 100%的工单处理...");
/* 对resource做一些封装处理 */
List<ComputeItem> computeItems = new ArrayList<ComputeItem>();
List<StorageItem> storageItems = new ArrayList<StorageItem>();
List<NetworkElbItem> elbItems = new ArrayList<NetworkElbItem>();
List<NetworkEipItem> eipItems = new ArrayList<NetworkEipItem>();
List<NetworkDnsItem> dnsItems = new ArrayList<NetworkDnsItem>();
List<MonitorCompute> monitorComputes = new ArrayList<MonitorCompute>();
List<MonitorElb> monitorElbs = new ArrayList<MonitorElb>();
List<MdnItem> mdnItems = new ArrayList<MdnItem>();
List<CpItem> cpItems = new ArrayList<CpItem>();
comm.resourcesService.wrapBasicUntilListByResources(resourcesList, computeItems, storageItems, elbItems,
eipItems, dnsItems, monitorComputes, monitorElbs, mdnItems, cpItems);
// 发送邮件通知下个指派人
User assigneeUser = comm.accountService.findUserByRedmineUserId(issue.getAssignee().getId());
comm.templateMailService.sendRecycleResourcesOperateNotificationMail(sendToUser, computeItems,
storageItems, elbItems, eipItems, dnsItems, monitorComputes, monitorElbs, mdnItems, cpItems,
assigneeUser);
}
}
/**
* 故障申报的工单处理.
*
*/
@Transactional(readOnly = false)
private void failureOperate(Issue issue) {
logger.info("--->故障申报处理...");
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) {
logger.info("---> 完成度 = 100%的工单处理...");
// 获得故障申报人的邮箱.
String loginName = issue.getSubject().substring(0, issue.getSubject().indexOf("-"));
User user = comm.accountService.findUserByLoginName(loginName);
// 工单处理完成,给申请人发送邮件
comm.simpleMailService
.sendNotificationMail(user.getEmail(), issue.getSubject() + " 故障处理流程已完成", "故障处理流程已完成");
} else {
logger.info("---> 完成度 < 100%的工单处理...");
String contentText = "你有新的故障处理工单. <a href=\"" + CONFIG_LOADER.getProperty("OPERATE_URL")
+ "\">→点击进行处理</a><br>";
User assigneeUser = comm.accountService.getUser(issue.getAssignee().getId());
// 工单处理完成,给申请人发送邮件
comm.simpleMailService.sendNotificationMail(assigneeUser.getEmail(), "故障申报工单处理邮件", contentText);
}
logger.info("--->故障申报处理结束!");
}
/**
* 根据工单获取其下关联的资源
*
* @param redmineIssue
* @return
*/
public List getComputeStorageElbEip(RedmineIssue redmineIssue) {
Integer applyId = null;
Integer serviceTagId = null;
String resourceId = null;
// 判断是服务申请、服务变更还是资源回收
boolean isApply = false;
boolean isFeature = false;
boolean isRecycle = false;
if (redmineIssue.getApplyId() != null) {
applyId = redmineIssue.getApplyId();
isApply = true;
}
if (redmineIssue.getServiceTagId() != null) {
serviceTagId = redmineIssue.getServiceTagId();
isFeature = true;
}
if (redmineIssue.getResourceId() != null) {
resourceId = redmineIssue.getResourceId();
isRecycle = true;
}
logger.info("--->isApply、isFeature、isRecycle?" + isApply + "、" + isFeature + "、" + isRecycle);
// 服务申请
List computeList = new ArrayList();
List storageList = new ArrayList();
List networkElbList = new ArrayList();
List networkEipList = new ArrayList();
if (isApply) {
computeList = comm.computeService.getComputeListByApplyId(applyId);
storageList = comm.es3Service.getStorageListByApplyId(applyId);
networkElbList = comm.elbService.getElbListByApplyId(applyId);
networkEipList = comm.eipService.getEipListByApplyId(applyId);
}
// 服务变更
if (isFeature && !isRecycle) {
ServiceTag serviceTag = comm.serviceTagService.getServiceTag(serviceTagId);
List<Resources> resourcesList = comm.resourcesService.getChangedResourcesListByServiceTagId(serviceTagId);
for (Resources resources : resourcesList) {
Integer serviceType = resources.getServiceType(); // 服务类型ID
Integer serviceId = resources.getServiceId(); // 服务ID
// 按服务类型查询
if (serviceType == 1 || serviceType == 2) {// 1-PCS、2-ECS
computeList.add(comm.computeService.getComputeItem(serviceId));
} else if (serviceType == 3) {// 3-ES3
storageList.add(comm.es3Service.getStorageItem(serviceId));
} else if (serviceType == 4) {// 4-ELB
networkElbList.add(comm.elbService.getNetworkElbItem(serviceId));
} else if (serviceType == 5) {// 5-EIP
networkEipList.add(comm.eipService.getNetworkEipItem(serviceId));
}
}
}
List list = new ArrayList();
list.add(computeList);
list.add(storageList);
list.add(networkElbList);
list.add(networkEipList);
return list;
}
/**
* 更新修改的IP和卷
*
* @param computeIds
* @param storageIds
* @param hostNames
* @param serverAlias
* @param osStorageAlias
* @param controllerAlias
* @param volumes
* @param innerIps
* @param eipIds
* @param eipAddress
* @param location
* @param elbIds
* @param virtualIps
* @param issue
* @return
*/
@Transactional(readOnly = false)
public boolean saveNewIpVolume(String computeIds, String storageIds, String hostNames, String serverAlias,
String osStorageAlias, String controllerAlias, String volumes, String innerIps, String[] eipIds,
String[] eipAddress, String location, String elbIds, String virtualIps, Issue issue) {
try {
String sep = ",";
if (computeIds.length() > 0) {
String[] compute = computeIds.split(sep);
String[] hostName = hostNames.split(sep);
String[] server = serverAlias.split(sep);
String[] osStorage = osStorageAlias.split(sep);
String[] innerIp = innerIps.split(sep);
logger.info("--->更新写入OneCMDB关联项(计算资源)..." + compute.length);
IpPool ipPool;
ComputeItem computeItem;
for (int i = 0; i < compute.length; i++) {
if (innerIp[i].equals(IpPoolConstant.DEFAULT_IPADDRESS)) {
continue;
}
computeItem = comm.computeService.getComputeItem(Integer.parseInt(compute[i]));
// 释放原来的IP
// TODO 此处要根据选择的IDC来更新具体的IP,临时这样处理,目前只有192.168.0重复。。
if (!computeItem.getInnerIp().equals(IpPoolConstant.DEFAULT_IPADDRESS)) {
ipPool = comm.ipPoolService.findIpPoolByIpAddress(computeItem.getInnerIp());
ipPool.setStatus(IpPoolConstant.IpStatus.未使用.toInteger());
ipPool.setHostServer(null);
comm.ipPoolService.saveIpPool(ipPool);
}
// 更新新的IP
ipPool = comm.ipPoolService.findIpPoolByIpAddress(innerIp[i]);
ipPool.setStatus(IpPoolConstant.IpStatus.已使用.toInteger());
ipPool.setHostServer(comm.hostServerService.findByAlias(server[i]));
comm.ipPoolService.saveIpPool(ipPool);
computeItem.setHostName(hostName[i].trim());
if (computeItem.getComputeType() == 1) {
// 如果是物理机,先判断其原值是否关联,如果已关联,则忽略新值,因为一个物理机只能被一个PCS关联
String alias = computeItem.getServerAlias();
HostServer host = comm.hostServerService.findByAlias(alias);
if (StringUtils.isEmpty(alias) || (host != null && host.getIpPools().size() <= 0)) {
computeItem.setServerAlias(server[i]);
}
} else {
computeItem.setHostServerAlias(server[i]);
computeItem.setOsStorageAlias(osStorage[i]);
}
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) {
computeItem.setOldIp(computeItem.getInnerIp());
}
computeItem.setInnerIp(innerIp[i]);
comm.computeService.saveOrUpdate(computeItem);
}
}
if (storageIds.length() > 0) {
String[] storage = storageIds.split(sep);
String[] controller = controllerAlias.split(sep);
String[] volume = volumes.split(sep);
logger.info("--->更新写入OneCMDB关联项(存储资源)..." + storage.length);
for (int i = 0; i < storage.length; i++) {
StorageItem storageItem = comm.es3Service.getStorageItem(Integer.parseInt(storage[i]));
storageItem.setControllerAlias(controller[i]);
storageItem.setVolume(volume[i].trim());
comm.es3Service.saveOrUpdate(storageItem);
}
}
if (eipIds != null && eipIds.length > 0) {
logger.info("--->更新写入OneCMDB关联项(EIP)..." + eipIds.length);
NetworkEipItem eipItem;
for (int i = 0; i < eipIds.length; i++) {
if (eipIds[i] == null || eipIds[i].equals("") || eipIds[i].equals("null")) {
continue;
}
eipItem = comm.eipService.getNetworkEipItem(Integer.parseInt(eipIds[i]));
// 释放原来的IP
comm.ipPoolService.updateIpPoolByIpAddress(eipItem.getIpAddress(),
IpPoolConstant.IpStatus.未使用.toInteger());
// 更新新的IP
if (eipAddress != null && eipAddress.length > 0) {
comm.ipPoolService.updateIpPoolByIpAddress(eipAddress[i],
IpPoolConstant.IpStatus.已使用.toInteger());
eipItem.setIpAddress(eipAddress[i]);
}
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) {
eipItem.setOldIp(eipItem.getIpAddress());
}
comm.eipService.saveOrUpdate(eipItem);
}
}
if (elbIds.length() > 0) {
String[] elbId = elbIds.split(sep);
String[] virtualIp = virtualIps.split(sep);
logger.info("--->更新写入OneCMDB关联项(ELB)..." + elbId.length);
NetworkElbItem elbItem;
for (int i = 0; i < elbId.length; i++) {
elbItem = comm.elbService.getNetworkElbItem(Integer.parseInt(elbId[i]));
// 释放原来的IP
comm.ipPoolService.updateIpPoolByIpAddress(elbItem.getVirtualIp(),
IpPoolConstant.IpStatus.未使用.toInteger());
// 更新新的IP
comm.ipPoolService.updateIpPoolByIpAddress(virtualIp[i], IpPoolConstant.IpStatus.已使用.toInteger());
if (RedmineConstant.MAX_DONERATIO.equals(issue.getDoneRatio())) {
elbItem.setOldIp(elbItem.getVirtualIp());
}
elbItem.setVirtualIp(virtualIp[i]);
comm.elbService.saveOrUpdate(elbItem);
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
logger.error("--->更新写入OneCMDB关联出错:", e);
return false;
}
}
/**
* 根据服务器类型查询Host
*
* @return
*/
public Map<String, String> findHostMapByServerType(int serverType) {
List<HostServer> list = comm.hostServerService.findByServerType(serverType);
Map<String, String> map = Maps.newHashMap();
for (HostServer hostServer : list) {
int size = hostServer.getIpPools().size();
// 过滤掉已经关联的物理机
// if (serverType==2 && size>0) {
// continue;
// }
map.put(hostServer.getAlias(), hostServer.getDisplayName() + "(" + size + ")" + hostServer.getIpAddress()); // (size
// ==
// 0
// ?
// size
// :
// size
// -
// 1)
}
return map;
}
/**
* 查询OneCMDB中的Location
*
* @return
*/
public Map<String, String> getLocationFromOnecmdb() {
List<Location> list = comm.locationService.getLocationList();
Map<String, String> map = Maps.newHashMap();
for (Location location : list) {
map.put(location.getAlias(), location.getName());
}
return map;
}
/**
* 查询OneCMDB中的Location
*
* @return
*/
public Map<String, String> getVlanFromOnecmdb() {
List<Vlan> list = comm.vlanService.getVlanList();
Map<String, String> map = Maps.newHashMap();
for (Vlan vlan : list) {
map.put(vlan.getAlias(), "Vlan" + vlan.getName() + "(" + vlan.getDescription() + ")");
}
return map;
}
}