package com.sobey.cmop.mvc.service.iaas;
import java.util.ArrayList;
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.NetworkConstant;
import com.sobey.cmop.mvc.constant.ResourcesConstant;
import com.sobey.cmop.mvc.dao.NetworkDnsItemDao;
import com.sobey.cmop.mvc.entity.Apply;
import com.sobey.cmop.mvc.entity.Change;
import com.sobey.cmop.mvc.entity.NetworkDnsItem;
import com.sobey.cmop.mvc.entity.NetworkEipItem;
import com.sobey.cmop.mvc.entity.Resources;
import com.sobey.cmop.mvc.entity.ServiceTag;
/**
* DNS NetworkDnsItem 的管理类.
*
* @author liukai
*/
@Service
@Transactional(readOnly = true)
public class DnsService extends BaseSevcie {
private static Logger logger = LoggerFactory.getLogger(DnsService.class);
@Resource
private NetworkDnsItemDao networkDnsItemDao;
public NetworkDnsItem getNetworkDnsItem(Integer id) {
return networkDnsItemDao.findOne(id);
}
@Transactional(readOnly = false)
public NetworkDnsItem saveOrUpdate(NetworkDnsItem networkDnsItem) {
return networkDnsItemDao.save(networkDnsItem);
}
@Transactional(readOnly = false)
public void deleteNetworkDnsItem(Integer id) {
networkDnsItemDao.delete(id);
}
/**
* 保存DNS的服务申请.(在服务申请时调用)
*
* @param applyId
* 服务申请单ID
* @param domainNames
* 域名数组
* @param domainTypes
* 域名类型数组
* @param eipIds
* 关联EIP数组
*/
@Transactional(readOnly = false)
public void saveDNSToApply(Integer applyId, String[] domainNames, String[] domainTypes, String[] eipIds) {
Apply apply = comm.applyService.getApply(applyId);
for (int i = 0; i < domainNames.length; i++) {
NetworkDnsItem networkDnsItem = new NetworkDnsItem();
String identifier = comm.applyService.generateIdentifier(ResourcesConstant.ServiceType.DNS.toInteger());
Integer domainType = Integer.valueOf(domainTypes[i]);
// 区分域名类型. GSLB,A 类型插入 DNS和EIP的中间表. CNAME类型插入文本.
if (eipIds != null && eipIds.length > 0) {
if (NetworkConstant.DomainType.CNAME.toInteger().equals(domainType)) {
networkDnsItem.setCnameDomain(eipIds[i]);
} else {
String[] eipIdArray = StringUtils.split(eipIds[i], "-");
List<NetworkEipItem> networkEipItemList = new ArrayList<NetworkEipItem>();
for (int j = 0; j < eipIdArray.length; j++) {
networkEipItemList.add(comm.eipService.getNetworkEipItem(Integer.valueOf(eipIdArray[j])));
}
networkDnsItem.setNetworkEipItemList(networkEipItemList);
}
}
networkDnsItem.setIdentifier(identifier);
networkDnsItem.setApply(apply);
networkDnsItem.setDomainName(domainNames[i]);
networkDnsItem.setDomainType(domainType);
this.saveOrUpdate(networkDnsItem);
}
}
/**
* 更新DNS(服务申请)
*
* @param networkDnsItem
* DNS对象
* @param domainName
* 域名
* @param domainType
* 域名类型
* @param cnameDomain
* CNAME域名
* @param eipIds
* 目标IP数组
*/
@Transactional(readOnly = false)
public void updateDNSToApply(NetworkDnsItem networkDnsItem, String domainName, Integer domainType,
String cnameDomain, String[] eipIds) {
networkDnsItem.setDomainType(domainType);
networkDnsItem.setDomainName(domainName);
List<NetworkEipItem> networkEipItemList = new ArrayList<NetworkEipItem>();
if (NetworkConstant.DomainType.CNAME.toInteger().equals(domainType)) {
networkDnsItem.setNetworkEipItemList(networkEipItemList);
networkDnsItem.setCnameDomain(cnameDomain);
} else {
if (eipIds != null) {
for (int i = 0; i < eipIds.length; i++) {
networkEipItemList.add(comm.eipService.getNetworkEipItem(Integer.valueOf(eipIds[i])));
}
}
networkDnsItem.setNetworkEipItemList(networkEipItemList);
networkDnsItem.setCnameDomain(cnameDomain);
}
this.saveOrUpdate(networkDnsItem);
}
/**
* 变更DNS
*
* @param resources
* 资源
* @param serviceTagId
* 服务标签ID
* @param domainName
* 域名
* @param domainType
* 域名类型
* @param cnameDomain
* CNAME域名
* @param eipIds
* 关联EIPId
* @param changeDescription
* 变更说明
*/
@Transactional(readOnly = false)
public void saveResourcesByDns(Resources resources, Integer serviceTagId, String domainName, Integer domainType,
String cnameDomain, String[] eipIds, String changeDescription) {
/* 新增或更新资源Resources的服务变更Change. */
Change change = comm.changeServcie.saveOrUpdateChangeByResources(resources, changeDescription);
NetworkDnsItem networkDnsItem = this.getNetworkDnsItem(resources.getServiceId());
/* 比较资源变更前和变更后的值. */
boolean isChange = comm.compareResourcesService.compareDns(resources, change, networkDnsItem, domainName,
domainType, cnameDomain, eipIds);
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);
// 判断关联类型,根据关联类型和关联ID获得对象后封装至NetworkEipItem.
networkDnsItem.setDomainType(domainType);
networkDnsItem.setDomainName(domainName);
List<NetworkEipItem> networkEipItemList = new ArrayList<NetworkEipItem>();
if (NetworkConstant.DomainType.CNAME.toInteger().equals(domainType)) {
networkDnsItem.setNetworkEipItemList(networkEipItemList);
networkDnsItem.setCnameDomain(cnameDomain);
} else {
if (eipIds != null) {
for (int i = 0; i < eipIds.length; i++) {
networkEipItemList.add(comm.eipService.getNetworkEipItem(Integer.valueOf(eipIds[i])));
}
}
networkDnsItem.setNetworkEipItemList(networkEipItemList);
networkDnsItem.setCnameDomain(cnameDomain);
}
this.saveOrUpdate(networkDnsItem);
// 更新resources
comm.resourcesService.saveOrUpdate(resources);
}
}