package org.openstack.atlas.service.domain.services.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openstack.atlas.service.domain.entities.*;
import org.openstack.atlas.service.domain.events.repository.AlertRepository;
import org.openstack.atlas.service.domain.events.repository.LoadBalancerEventRepository;
import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException;
import org.openstack.atlas.service.domain.exceptions.ImmutableEntityException;
import org.openstack.atlas.service.domain.exceptions.UnprocessableEntityException;
import org.openstack.atlas.service.domain.repository.*;
import org.openstack.atlas.service.domain.repository.UsageRepository;
import org.openstack.atlas.service.domain.services.helpers.StringHelper;
import org.openstack.atlas.service.domain.usage.repository.*;
import org.openstack.atlas.service.domain.util.Constants;
import org.openstack.atlas.util.ip.IPv4Cidr;
import org.openstack.atlas.util.ip.IPv4Cidrs;
import org.openstack.atlas.util.ip.IPv6Cidr;
import org.openstack.atlas.util.ip.IPv6Cidrs;
import org.openstack.atlas.util.ip.exception.IPStringConversionException;
import org.openstack.atlas.util.ip.exception.IpTypeMissMatchException;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;
import static org.openstack.atlas.service.domain.entities.LoadBalancerStatus.ACTIVE;
import static org.openstack.atlas.service.domain.entities.LoadBalancerStatus.DELETED;
public class BaseService {
protected final Log LOG = LogFactory.getLog(BaseService.class);
@Autowired
protected LoadBalancerRepository loadBalancerRepository;
@Autowired
protected AccountLimitRepository accountLimitRepository;
@Autowired
protected VirtualIpRepository virtualIpRepository;
@Autowired
protected VirtualIpv6Repository virtualIpv6Repository;
@Autowired
protected BlacklistRepository blacklistRepository;
@Autowired
protected HostRepository hostRepository;
@Autowired
protected LoadBalancerEventRepository loadBalancerEventRepository;
@Autowired
protected AlertRepository alertRepository;
@Autowired
protected GroupRepository groupRepository;
@Autowired
protected ClusterRepository clusterRepository;
@Autowired
protected LoadbalancerMetadataRepository loadbalancerMetadataRepository;
@Autowired
protected NodeMetadataRepository nodeMetadataRepository;
@Autowired
protected NodeRepository nodeRepository;
@Autowired
protected RateLimitRepository rateLimitRepository;
@Autowired
protected JobStateRepository jobStateRepository;
@Autowired
protected SslTerminationRepository sslTerminationRepository;
@Autowired
protected UsageRepository usageRepository;
@Autowired
protected HostUsageRepository hostUsageRepository;
@Autowired
protected AllowedDomainsRepository allowedDomainsRepository;
@Autowired
protected LoadBalancerStatusHistoryRepository loadBalancerStatusHistoryRepository;
@Autowired
protected LoadBalancerMergedHostUsageRepository loadBalancerMergedHostUsageRepository;
@Autowired
protected HostUsageRefactorRepository hostUsageRefactorRepository;
@Autowired
protected CertificateMappingRepository certificateMappingRepository;
static {
org.openstack.atlas.util.ca.primitives.RsaConst.init();
}
public void setLoadBalancerRepository(LoadBalancerRepository loadBalancerRepository) {
this.loadBalancerRepository = loadBalancerRepository;
}
public void setAccountLimitRepository(AccountLimitRepository accountLimitRepository) {
this.accountLimitRepository = accountLimitRepository;
}
public void setVirtualIpRepository(VirtualIpRepository virtualIpRepository) {
this.virtualIpRepository = virtualIpRepository;
}
public void setVirtualIpv6Repository(VirtualIpv6Repository virtualIpv6Repository) {
this.virtualIpv6Repository = virtualIpv6Repository;
}
public void setBlacklistRepository(BlacklistRepository blacklistRepository) {
this.blacklistRepository = blacklistRepository;
}
public void setHostRepository(HostRepository hostRepository) {
this.hostRepository = hostRepository;
}
public void setLoadBalancerEventRepository(LoadBalancerEventRepository loadBalancerEventRepository) {
this.loadBalancerEventRepository = loadBalancerEventRepository;
}
public void setAlertRepository(AlertRepository alertRepository) {
this.alertRepository = alertRepository;
}
public void setGroupRepository(GroupRepository groupRepository) {
this.groupRepository = groupRepository;
}
public void setClusterRepository(ClusterRepository clusterRepository) {
this.clusterRepository = clusterRepository;
}
public void setLoadbalancerMetadataRepository(LoadbalancerMetadataRepository loadbalancerMetadataRepository) {
this.loadbalancerMetadataRepository = loadbalancerMetadataRepository;
}
public void setNodeMetadataRepository(NodeMetadataRepository nodeMetadataRepository) {
this.nodeMetadataRepository = nodeMetadataRepository;
}
public void setNodeRepository(NodeRepository nodeRepository) {
this.nodeRepository = nodeRepository;
}
public void setRateLimitRepository(RateLimitRepository rateLimitRepository) {
this.rateLimitRepository = rateLimitRepository;
}
public void setJobStateRepository(JobStateRepository jobStateRepository) {
this.jobStateRepository = jobStateRepository;
}
public void setSslTerminationRepository(SslTerminationRepository sslTerminationRepository) {
this.sslTerminationRepository = sslTerminationRepository;
}
public void setUsageRepository(UsageRepository usageRepository) {
this.usageRepository = usageRepository;
}
public void setHostUsageRepository(HostUsageRepository hostUsageRepository) {
this.hostUsageRepository = hostUsageRepository;
}
public void setAllowedDomainsRepository(AllowedDomainsRepository allowedDomainsRepository) {
this.allowedDomainsRepository = allowedDomainsRepository;
}
public void setLoadBalancerStatusHistoryRepository(LoadBalancerStatusHistoryRepository loadBalancerStatusHistoryRepository) {
this.loadBalancerStatusHistoryRepository = loadBalancerStatusHistoryRepository;
}
public void setLoadBalancerMergedHostUsageRepository(LoadBalancerMergedHostUsageRepository loadBalancerMergedHostUsageRepository) {
this.loadBalancerMergedHostUsageRepository = loadBalancerMergedHostUsageRepository;
}
public void setHostUsageRefactorRepository(HostUsageRefactorRepository hostUsageRefactorRepository) {
this.hostUsageRefactorRepository = hostUsageRefactorRepository;
}
public void setCertificateMappingRepository(CertificateMappingRepository certificateMappingRepository) {
this.certificateMappingRepository = certificateMappingRepository;
}
public void isLbActive(LoadBalancer dbLoadBalancer) throws UnprocessableEntityException, ImmutableEntityException {
if (dbLoadBalancer.getStatus().equals(DELETED)) {
throw new UnprocessableEntityException(Constants.LoadBalancerDeleted);
}
if (!dbLoadBalancer.getStatus().equals(ACTIVE)) {
String message = StringHelper.immutableLoadBalancer(dbLoadBalancer);
LOG.warn(message);
throw new ImmutableEntityException(message);
}
}
public boolean verifyForOp(LoadBalancer dbLoadBalancer) throws UnprocessableEntityException, ImmutableEntityException, EntityNotFoundException {
return loadBalancerRepository.getByIdForOp(dbLoadBalancer.getId());
}
protected boolean isActiveLoadBalancer(LoadBalancer rLb, boolean refetch) throws EntityNotFoundException {
boolean out;
LoadBalancer testLb;
if (refetch) {
testLb = loadBalancerRepository.getByIdAndAccountId(rLb.getId(), rLb.getAccountId());
} else {
testLb = rLb;
}
out = testLb.getStatus().equals(LoadBalancerStatus.ACTIVE);
return out;
}
protected Node blackListedItemNode(Set<Node> nodes) throws IPStringConversionException, IpTypeMissMatchException {
IPv4Cidrs ip4Cidr = new IPv4Cidrs();
IPv6Cidrs ip6Cidr = new IPv6Cidrs();
Node badNode = new Node();
List<BlacklistItem> blackItems = blacklistRepository.getAllBlacklistItems();
for (Node testMe : nodes) {
for (BlacklistItem bli : blackItems) {
if (bli.getBlacklistType() == null || bli.getBlacklistType().equals(BlacklistType.NODE)) {
if (bli.getIpVersion().equals(IpVersion.IPV4)) {
ip4Cidr.getCidrs().add(new IPv4Cidr(bli.getCidrBlock()));
badNode.setIpAddress(testMe.getIpAddress());
if (ip4Cidr.contains(testMe.getIpAddress())) {
return badNode;
}
} else if (bli.getIpVersion().equals(IpVersion.IPV6)) {
ip6Cidr.getCidrs().add(new IPv6Cidr(bli.getCidrBlock()));
badNode.setIpAddress(testMe.getIpAddress());
if (ip6Cidr.contains(testMe.getIpAddress())) {
return badNode;
}
}
}
}
}
return null;
}
protected AccessList blackListedItemAccessList(Set<AccessList> accessLists) throws IPStringConversionException, IpTypeMissMatchException {
IPv4Cidrs ip4Cidr = new IPv4Cidrs();
IPv6Cidrs ip6Cidr = new IPv6Cidrs();
AccessList badAccessListItem = new AccessList();
List<BlacklistItem> blackItems = blacklistRepository.getAllBlacklistItems();
for (AccessList testMe : accessLists) {
for (BlacklistItem bli : blackItems) {
if (bli.getBlacklistType() == null || bli.getBlacklistType().equals(BlacklistType.ACCESSLIST)) {
if (bli.getIpVersion().equals(IpVersion.IPV4)) {
ip4Cidr.getCidrs().add(new IPv4Cidr(bli.getCidrBlock()));
badAccessListItem.setIpAddress(testMe.getIpAddress());
if (ip4Cidr.contains(testMe.getIpAddress())) {
return badAccessListItem;
}
} else if (bli.getIpVersion().equals(IpVersion.IPV6)) {
ip6Cidr.getCidrs().add(new IPv6Cidr(bli.getCidrBlock()));
badAccessListItem.setIpAddress(testMe.getIpAddress());
if (ip6Cidr.contains(testMe.getIpAddress())) {
return badAccessListItem;
}
}
}
}
}
return null;
}
}