package com.sobey.cmop.mvc.service.basicdata;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
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.sobey.cmop.mvc.comm.BaseSevcie;
import com.sobey.cmop.mvc.constant.IpPoolConstant;
import com.sobey.cmop.mvc.dao.IpPoolDao;
import com.sobey.cmop.mvc.dao.custom.IpPoolDaoCustom;
import com.sobey.cmop.mvc.entity.HostServer;
import com.sobey.cmop.mvc.entity.IpPool;
import com.sobey.cmop.mvc.entity.Vlan;
import com.sobey.framework.utils.DynamicSpecifications;
import com.sobey.framework.utils.SearchFilter;
@Service
@Transactional(readOnly = true)
public class IpPoolService extends BaseSevcie {
private static Logger logger = LoggerFactory.getLogger(IpPoolService.class);
@Resource
private IpPoolDao ipPoolDao;
@Resource
private IpPoolDaoCustom customDao;
public IpPool getIpPool(Integer id) {
return ipPoolDao.findOne(id);
}
/**
* 新增,更新IpPool
*
* @param ipPool
* @return
*/
@Transactional(readOnly = false)
public IpPool saveOrUpdate(IpPool ipPool) {
return ipPoolDao.save(ipPool);
}
/**
* IP分页查询,值显示当前用户创建的EIP.
*
* @param page
* @param size
* @return
*/
public Page<IpPool> getIpPoolPageable(Map<String, Object> searchParams, int pageNumber, int pageSize) {
PageRequest pageRequest = buildPageRequest(pageNumber, pageSize);
Map<String, SearchFilter> filters = SearchFilter.parse(searchParams);
Specification<IpPool> spec = DynamicSpecifications.bySearchFilter(filters.values(), IpPool.class);
return ipPoolDao.findAll(spec, pageRequest);
}
/**
* 保存IP(录入时使用).根据成功录入的ip数量返回message.
*
* @param ipAddress
* @param poolType
* @param vlan
* @return
*/
@Transactional(readOnly = false)
public String saveIpPool(String ipAddress, Integer poolType, Vlan vlan) {
String message = "";
List<String> ipAddressList = this.getInsertIpAddressList(ipAddress);
// 插入ip数量
int insertCount = ipAddressList.size();
List<String> allIpAddressList = this.getAllIpAddress();
/* 排除重复IP */
ipAddressList.removeAll(allIpAddressList);
// 成功插入IP的数量
int insertSuccessCount = ipAddressList.size();
if (insertSuccessCount == 0) {
message = "创建IP已存在";
} else {
message = "插入IP " + insertCount + " 条,成功创建IP " + insertSuccessCount + " 条";
}
this.saveIpPool(ipAddressList, poolType, IpPoolConstant.IpStatus.未使用.toInteger(), vlan);
return message;
}
/**
* 返回类型为String的所有IpAddress List
*
* @return
*/
private List<String> getAllIpAddress() {
List<IpPool> ipPools = (List<IpPool>) ipPoolDao.findAll();
List<String> list = new ArrayList<String>();
for (IpPool ipPool : ipPools) {
list.add(ipPool.getIpAddress());
}
return list;
}
/**
* 保存IP(可以单个,也可以多条),并将IP同步至oneCMDB
*
* @param ipAddressList
* ip列表
* @param poolType
* IP所属IP池
* @param ipStatus
* IP状态
*/
@Transactional(readOnly = false)
private boolean saveIpPool(List<String> ipAddressList, Integer poolType, Integer ipStatus, Vlan vlan) {
List<IpPool> ipPoolList = new ArrayList<IpPool>();
for (String ipAddress : ipAddressList) {
IpPool ipPool = new IpPool(poolType, vlan, ipAddress, ipStatus, new Date());
ipPoolList.add(ipPool);
}
ipPoolDao.save(ipPoolList);
// 同步至oneCMDB
comm.oneCmdbUtilService.saveIpPoolToOneCMDB(ipPoolList, poolType);
return true;
}
/**
* 保存单个IP
*
* @param ipAddress
* @param poolType
* @param ipStatus
* @param vlan
* @param hostServer
* @return
*/
@Transactional(readOnly = false)
public boolean saveIpPool(String ipAddress, Integer poolType, Integer ipStatus, Vlan vlan, HostServer hostServer) {
// TODO 待优化,最终目标是删除此方法.
IpPool ipPool = new IpPool(poolType, vlan, ipAddress, ipStatus, new Date());
ipPool.setHostServer(hostServer);
this.saveOrUpdate(ipPool);
return true;
}
@Transactional(readOnly = false)
public boolean saveIpPool(String ipAddress, Integer poolType, Integer ipStatus, Vlan vlan) {
// TODO 待优化,最终目标是删除此方法.
return this.saveIpPool(ipAddress, poolType, ipStatus, vlan, null);
}
/**
* 保存IP
*
* @param ipPool
*/
@Transactional(readOnly = false)
public void saveIpPool(IpPool ipPool) {
// 同步至oneCMDB
List<IpPool> ipPools = new ArrayList<IpPool>();
ipPools.add(ipPool);
comm.oneCmdbUtilService.saveIpPoolToOneCMDB(ipPools, ipPool.getPoolType());
ipPoolDao.save(ipPool);
}
/**
* 删除IP(同时删除oneCMDB下的ip)
*
* @param id
* @return
*/
@Transactional(readOnly = false)
public void deleteIpPool(Integer id) {
// 删除oneCMDB下的ip
comm.oneCmdbUtilService.deleteIpPoolToOneCMDB(this.getIpPool(id));
ipPoolDao.delete(id);
}
/**
* 对页面获得的ipAddress进行分拆,获得单个或多个IP装入一个list中.
*
* @param ipAddress
* 包含的格式有 三种: 127.0.0.1 & 127.0.0.1,127.0.0.2 & 127.0.0.1/20
* @return
*/
private List<String> getInsertIpAddressList(String ipAddress) {
List<String> list = new ArrayList<String>();
// 不包含"/"和"," 表示是一个单独的IP
if (ipAddress.indexOf("/") == -1 && ipAddress.indexOf(",") == -1) {
list.add(ipAddress);
} else if (ipAddress.indexOf("/") == -1 && ipAddress.indexOf(",") != -1) {
// 不包含"/" 但包含"," 表示是多个IP.
String[] ipArray = ipAddress.split(",");
for (String ip : ipArray) {
list.add(ip);
}
} else {
// 表示IP段.eg: 192.168.0.2/200
String[] parts = ipAddress.split("(?<=\\.)(?!.*\\.)"); // 以最后一个"."进行切割.
String startParts = parts[0];// parts[0] = 192.168.0.
String endParts = parts[1];// parts[1] = 2/200
String[] ends = endParts.split("/"); // 对IP段进行切割
int first = Integer.parseInt(ends[0]); // 起始IP :2
int last = Integer.parseInt(ends[1]); // 结束IP :200
for (int i = first; i <= last; i++) {
list.add(startParts + i);
}
}
return list;
}
/**
* TODO 此处要根据选择的IDC来更新具体的IP
*
* @param ipPool
* @param status
*/
@Transactional(readOnly = false)
public void updateIpPoolByIpAddress(String ipAddress, Integer status) {
// TODO 待优化,最终目标是删除此方法.
IpPool ipPool = ipPoolDao.findByIpAddress(ipAddress);
if (ipPool != null) {
ipPool.setStatus(status);
ipPoolDao.save(ipPool);
}
}
@Transactional(readOnly = false)
public void updateIpPoolByIpAddress(String ipAddress, Integer status, HostServer hostServer) {
// TODO 待优化,最终目标是删除此方法.
IpPool ipPool = ipPoolDao.findByIpAddress(ipAddress);
if (ipPool != null) {
ipPool.setStatus(status);
ipPool.setHostServer(hostServer);
ipPoolDao.save(ipPool);
}
}
/**
* 初始化IP,将IP的状态设置为未使用状态,关联的HostServer设置为null. 如果IP不存在数据库中,则返回null值.
*
* @param ipAddress
* @return
*/
public IpPool initIpPool(String ipAddress) {
IpPool ipPool = ipPoolDao.findByIpAddress(ipAddress);
if (ipPool != null) {
ipPool.setStatus(IpPoolConstant.IpStatus.未使用.toInteger());
ipPool.setHostServer(null);
return this.saveOrUpdate(ipPool);
}
return null;
}
/**
* 根据ipAddress获得指定的IpPool .
*
* @param ipAddress
* @return
*/
public IpPool findIpPoolByIpAddress(String ipAddress) {
return ipPoolDao.findByIpAddress(ipAddress);
}
/**
* 根据IP池类型和ip状态获得ip列表
*
* @param poolType
* @return
*/
public List<IpPool> getIpPoolByPoolTypeAndStatus(Integer poolType, Integer status) {
return ipPoolDao.findByPoolTypeAndStatus(poolType, status);
}
/**
* 根据VLAN查询其下所有IP
*
* @param vlan
* @return
*/
public List<IpPool> findIpPoolByVlan(String vlanAlias) {
return ipPoolDao.findByVlanAliasAndStatus(vlanAlias, 1);
}
}