package com.sequenceiq.cloudbreak.service.rdsconfig;
import java.util.Set;
import javax.inject.Inject;
import javax.transaction.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.common.type.CbUserRole;
import com.sequenceiq.cloudbreak.common.type.ResourceStatus;
import com.sequenceiq.cloudbreak.controller.BadRequestException;
import com.sequenceiq.cloudbreak.controller.NotFoundException;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.domain.RDSConfig;
import com.sequenceiq.cloudbreak.repository.ClusterRepository;
import com.sequenceiq.cloudbreak.repository.RdsConfigRepository;
import com.sequenceiq.cloudbreak.util.NameUtil;
@Service
@Transactional
public class RdsConfigService {
private static final Logger LOGGER = LoggerFactory.getLogger(RdsConfigService.class);
@Inject
private RdsConfigRepository rdsConfigRepository;
@Inject
private ClusterRepository clusterRepository;
public Set<RDSConfig> retrievePrivateRdsConfigs(CbUser user) {
return rdsConfigRepository.findForUser(user.getUserId());
}
public RDSConfig getPrivateRdsConfig(String name, CbUser user) {
RDSConfig rdsConfig = rdsConfigRepository.findByNameInUser(name, user.getUserId());
if (rdsConfig == null) {
throw new NotFoundException(String.format("RDS configuration '%s' not found.", name));
}
return rdsConfig;
}
public RDSConfig getPublicRdsConfig(String name, CbUser user) {
RDSConfig rdsConfig = rdsConfigRepository.findOneByName(name, user.getAccount());
if (rdsConfig == null) {
throw new NotFoundException(String.format("RDS configuration '%s' not found.", name));
}
return rdsConfig;
}
public Set<RDSConfig> retrieveAccountRdsConfigs(CbUser user) {
if (user.getRoles().contains(CbUserRole.ADMIN)) {
return rdsConfigRepository.findAllInAccount(user.getAccount());
} else {
return rdsConfigRepository.findPublicInAccountForUser(user.getUserId(), user.getAccount());
}
}
@PostAuthorize("hasPermission(returnObject,'read')")
public RDSConfig get(Long id) {
RDSConfig rdsConfig = rdsConfigRepository.findById(id);
if (rdsConfig == null) {
throw new NotFoundException(String.format("RDS configuration '%s' not found.", id));
}
return rdsConfig;
}
public void delete(Long id, CbUser user) {
RDSConfig rdsConfig = rdsConfigRepository.findByIdInAccount(id, user.getAccount());
if (rdsConfig == null) {
throw new NotFoundException(String.format("RDS configuration '%s' not found.", id));
}
delete(rdsConfig, user);
}
public void delete(String name, CbUser user) {
RDSConfig rdsConfig = rdsConfigRepository.findByNameInAccount(name, user.getAccount(), user.getUserId());
if (rdsConfig == null) {
throw new NotFoundException(String.format("RDS configuration '%s' not found.", name));
}
delete(rdsConfig, user);
}
public RDSConfig create(CbUser user, RDSConfig rdsConfig) {
LOGGER.debug("Creating RDS configuration: [User: '{}', Account: '{}']", user.getUsername(), user.getAccount());
rdsConfig.setOwner(user.getUserId());
rdsConfig.setAccount(user.getAccount());
return rdsConfigRepository.save(rdsConfig);
}
private void delete(RDSConfig rdsConfig, CbUser user) {
if (clusterRepository.findAllClustersByRDSConfig(rdsConfig.getId()).isEmpty()) {
if (!user.getUserId().equals(rdsConfig.getOwner()) && !user.getRoles().contains(CbUserRole.ADMIN)) {
throw new BadRequestException("RDS configurations can only be deleted by account admins or owners.");
}
if (ResourceStatus.USER_MANAGED.equals(rdsConfig.getStatus())) {
rdsConfigRepository.delete(rdsConfig);
} else {
rdsConfig.setName(NameUtil.postfixWithTimestamp(rdsConfig.getName()));
rdsConfig.setStatus(ResourceStatus.DEFAULT_DELETED);
rdsConfigRepository.save(rdsConfig);
}
} else {
throw new BadRequestException(String.format(
"There are clusters associated with RDS config '%s'. Please remove these before deleting the RDS configuration.", rdsConfig.getId()));
}
}
}