package com.sobey.cmop.mvc.service.iaas;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sobey.cmop.mvc.comm.BaseSevcie;
import com.sobey.cmop.mvc.constant.IpPoolConstant;
import com.sobey.cmop.mvc.constant.NetworkConstant;
import com.sobey.cmop.mvc.constant.ResourcesConstant;
import com.sobey.cmop.mvc.dao.ElbPortItemDao;
import com.sobey.cmop.mvc.dao.NetworkElbItemDao;
import com.sobey.cmop.mvc.dao.custom.BasicUnitDaoCustom;
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.ElbPortItem;
import com.sobey.cmop.mvc.entity.NetworkElbItem;
import com.sobey.cmop.mvc.entity.Resources;
import com.sobey.cmop.mvc.entity.ServiceTag;
/**
* 负载均衡器NetworkElbItem相关的管理类.
*
* @author liukai
*/
@Service
@Transactional(readOnly = true)
public class ElbService extends BaseSevcie {
private static Logger logger = LoggerFactory.getLogger(ElbService.class);
@Resource
private NetworkElbItemDao networkElbItemDao;
@Resource
private ElbPortItemDao elbPortItemDao;
@Resource
private BasicUnitDaoCustom basicUnitDao;
// ========= ElbPortItem ==========//
/**
* 新增,保存ELB映射端口.
*
* @param elbPortItem
* @return
*/
@Transactional(readOnly = false)
public ElbPortItem saveOrUpdateElbPortItem(ElbPortItem elbPortItem) {
return elbPortItemDao.save(elbPortItem);
}
/**
* 获得指定NetworkElbItem下的所有端口ElbPortItem
*
* @param computeItemId
* @return
*/
public List<ElbPortItem> getElbPortItemListByElbId(Integer elbId) {
return elbPortItemDao.findByNetworkElbItemId(elbId);
}
/**
* 删除端口信息
*
* @param eipPortItems
*/
@Transactional(readOnly = false)
public void deleteElbPortItem(Collection<ElbPortItem> elbPortItems) {
elbPortItemDao.delete(elbPortItems);
}
// ========= NetworkElbItem ==========//
public NetworkElbItem getNetworkElbItem(Integer id) {
return networkElbItemDao.findOne(id);
}
/**
* 新增,保存ELB
*
* @param networkElbItem
* @return
*/
@Transactional(readOnly = false)
public NetworkElbItem saveOrUpdate(NetworkElbItem networkElbItem) {
return networkElbItemDao.save(networkElbItem);
}
/**
* 删除ELB
*
* @param id
*/
@Transactional(readOnly = false)
public void deleteNetworkElbItem(Integer id) {
networkElbItemDao.delete(id);
}
/**
* 保存ELB的服务申请.(在服务申请时调用)
*
* @param applyId
* 服务申请单ID
*/
@Transactional(readOnly = false)
public void saveELBToApply(Integer applyId, String[] keepSessions, String[] protocols, String[] sourcePorts,
String[] targetPorts, String[] computeIds) {
Apply apply = comm.applyService.getApply(applyId);
for (int i = 0; i < keepSessions.length; i++) {
String identifier = comm.applyService.generateIdentifier(ResourcesConstant.ServiceType.ELB.toInteger());
NetworkElbItem networkElbItem = new NetworkElbItem();
networkElbItem.setApply(apply);
networkElbItem.setIdentifier(identifier);
networkElbItem.setVirtualIp(IpPoolConstant.DEFAULT_IPADDRESS);
networkElbItem.setOldIp(IpPoolConstant.DEFAULT_IPADDRESS);
networkElbItem.setKeepSession(NetworkConstant.KeepSession.保持.toString().equals(keepSessions[i]) ? true
: false);
// 关联实例
if (computeIds != null && computeIds.length > 0) {
List<ComputeItem> computeItemList = new ArrayList<ComputeItem>();
// 解决select2框架中,多重数组的重复问题.
if (keepSessions.length == 1) {
// 通过"-"获得存储空间挂载的实例ID
for (String computeId : computeIds) {
computeItemList.add(comm.computeService.getComputeItem(Integer.valueOf(computeId)));
}
} else if (keepSessions.length > 1) {
// 通过"-"获得存储空间挂载的实例ID
String[] computeIdArray = StringUtils.split(computeIds[i], ",");
for (String computeId : computeIdArray) {
computeItemList.add(comm.computeService.getComputeItem(Integer.valueOf(computeId)));
}
}
networkElbItem.setComputeItemList(computeItemList);
}
this.saveOrUpdate(networkElbItem);
// ELB的端口映射
if (sourcePorts != null && sourcePorts.length > 0) {
String[] protocolArray = StringUtils.split(protocols[i], NetworkConstant.SEPARATE_PORT_SYMBOL);
String[] sourcePortArray = StringUtils.split(sourcePorts[i], NetworkConstant.SEPARATE_PORT_SYMBOL);
String[] targetPortArray = StringUtils.split(targetPorts[i], NetworkConstant.SEPARATE_PORT_SYMBOL);
for (int j = 0; j < protocolArray.length; j++) {
ElbPortItem elbPortItem = new ElbPortItem(networkElbItem, protocolArray[j], sourcePortArray[j],
targetPortArray[j]);
this.saveOrUpdateElbPortItem(elbPortItem);
}
}
}
}
/**
* 修改ELB的服务申请.(在服务申请时调用)
*
* <pre>
* 1.先将ELB下的所有映射信息删除.
* 2.关联实例的更新.
* 3.保存ELB和端口映射.
* </pre>
*
* @param networkElbItem
* ELB对象
* @param protocols
* 协议数组
* @param sourcePorts
* 源端口数组
* @param targetPorts
* 目标端口数组
* @param computeIds
* 关联实例ID数组
*/
@Transactional(readOnly = false)
public void updateELBToApply(NetworkElbItem networkElbItem, String[] protocols, String[] sourcePorts,
String[] targetPorts, String[] computeIds) {
// Step.1 将ELB下的所有映射信息删除.
this.deleteElbPortItem(this.getElbPortItemListByElbId(networkElbItem.getId()));
// Step.2 关联实例
List<ComputeItem> computeItemList = new ArrayList<ComputeItem>();
if (computeIds != null) {
for (String computeId : computeIds) {
computeItemList.add(comm.computeService.getComputeItem(Integer.valueOf(computeId)));
}
}
networkElbItem.setComputeItemList(computeItemList);
this.saveOrUpdate(networkElbItem);
// Step.3 ELB的端口映射
if (sourcePorts != null && sourcePorts.length > 0) {
for (int i = 0; i < protocols.length; i++) {
ElbPortItem elbPortItem = new ElbPortItem(networkElbItem, protocols[i], sourcePorts[i], targetPorts[i]);
this.saveOrUpdateElbPortItem(elbPortItem);
}
}
}
/**
* 变更变更负载均衡器ELB
*
* @param resources
* 资源对象
* @param serviceTagId
* 服务标签ID
* @param keepSession
* 是否保持会话
* @param protocols
* 协议数组
* @param sourcePorts
* 源端口数组
* @param targetPorts
* 目标端口数组
* @param computeIds
* 关联实例ID数组
* @param changeDescription
* 变更说明
*/
@Transactional(readOnly = false)
public void saveResourcesByElb(Resources resources, Integer serviceTagId, String keepSession, String[] protocols,
String[] sourcePorts, String[] targetPorts, String[] computeIds, String changeDescription) {
/* 新增或更新资源Resources的服务变更Change. */
Change change = comm.changeServcie.saveOrUpdateChangeByResources(resources, changeDescription);
NetworkElbItem networkElbItem = this.getNetworkElbItem(resources.getServiceId());
List<ElbPortItem> elbPortItems = this.getElbPortItemListByElbId(networkElbItem.getId());
/* 比较资源变更前和变更后的值. */
boolean isChange = comm.compareResourcesService.compareElb(resources, change, networkElbItem, elbPortItems,
keepSession, protocols, sourcePorts, targetPorts, computeIds);
// 删除变更前的端口映射
this.deleteElbPortItem(elbPortItems);
ServiceTag serviceTag = comm.serviceTagService.getServiceTag(serviceTagId);
// 当资源有更改的时候,更改状态.如果和资源不相关的如:服务标签,指派人等变更,则不变更资源的状态.
if (isChange) {
serviceTag.setStatus(ResourcesConstant.Status.已变更.toInteger());
resources.setStatus(ResourcesConstant.Status.已变更.toInteger());
}
resources.setServiceTag(serviceTag);
comm.serviceTagService.saveOrUpdate(serviceTag);
networkElbItem.setKeepSession(NetworkConstant.KeepSession.保持.toString().equals(keepSession) ? true : false);
// 关联实例
List<ComputeItem> computeItemList = new ArrayList<ComputeItem>();
if (computeIds != null) {
for (int i = 0; i < computeIds.length; i++) {
ComputeItem computeItem = comm.computeService.getComputeItem(Integer.valueOf(computeIds[i]));
computeItemList.add(computeItem);
}
}
networkElbItem.setComputeItemList(computeItemList);
this.saveOrUpdate(networkElbItem);
// ELB的端口映射
if (sourcePorts != null && sourcePorts.length > 0) {
for (int i = 0; i < protocols.length; i++) {
ElbPortItem elbPortItem = new ElbPortItem(networkElbItem, protocols[i], sourcePorts[i], targetPorts[i]);
this.saveOrUpdateElbPortItem(elbPortItem);
}
}
// 更新resources
comm.resourcesService.saveOrUpdate(resources);
}
/**
* 获得指定用户的所有负载均衡器ELB
*
* @return
*/
public List<NetworkElbItem> getNetworkElbItemListByUserId(Integer userId) {
return networkElbItemDao.findByApplyUserId(userId);
}
public List<NetworkElbItem> getElbListByApplyId(Integer applyId) {
return networkElbItemDao.findByApplyId(applyId);
}
}