package com.clouck.service; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.lang3.Validate; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.clouck.model.Region; import com.clouck.model.ResourceType; import com.clouck.model.aws.AbstractResource; import com.clouck.model.aws.ec2.Ec2Version; import com.clouck.model.aws.ec2.Ec2VersionMeta; import com.clouck.repository.AwsRepository; import com.clouck.repository.Ec2VersionRepository; import com.clouck.wrapper.aws.IamWrapper; import com.google.common.base.Optional; @Service public class AwsServiceImpl implements AwsService { private static final Logger log = LoggerFactory.getLogger(AwsServiceImpl.class); @Autowired private IamWrapper iam; @Autowired private AwsRepository awsDao; @Autowired private Ec2VersionRepository ec2VersionDao; @Override public long findLatestResourceSizes(String accountId, ResourceType resourceType, Region region) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); long total = 0; if (region.equals(Region.All)) { if (resourceType.isMultiRegion()) { for (Region r : Region.findAvailableRegions(resourceType)) { Optional<Ec2Version> oEc2Version = awsDao.findEc2VersionUpto(accountId, resourceType, r, DateTime.now(), true, false); if (oEc2Version.isPresent()) { total += oEc2Version.get().getResourceIds().size(); } } } else { Optional<Ec2Version> oEc2Version = awsDao.findEc2VersionUpto(accountId, resourceType, null, DateTime.now(), true, false); if (oEc2Version.isPresent()) { total += oEc2Version.get().getResourceIds().size(); } } } else { Optional<Ec2Version> oEc2Version = awsDao.findEc2VersionUpto(accountId, resourceType, region, DateTime.now(), true, false); if (oEc2Version.isPresent()) { total = oEc2Version.get().getResourceIds().size(); } } return total; } @Override public Collection<AbstractResource<?>> findResources(String ec2VersionId) { Collection<AbstractResource<?>> result = new ArrayList<>(); Optional<Ec2Version> oEc2Version = findEc2Version(ec2VersionId); if (oEc2Version.isPresent()) { Ec2Version ec2Version = oEc2Version.get(); Collection<AbstractResource<?>> resources = findResources(ec2Version.getResourceIds(), ec2Version.getResourceType()); result.addAll(resources); } return result; } @Override public List<AbstractResource<?>> findResources(Collection<String> ids, ResourceType resourceType) { return awsDao.findResources(ids, resourceType); } @Override @SuppressWarnings("rawtypes") public Optional<AbstractResource> findResource(String resourceId, ResourceType resourceType) { return awsDao.findResource(resourceId, resourceType); } @Override public List<? extends AbstractResource<?>> findResources(ResourceType resourceType, String accountId, String uniqueId) { return awsDao.findResource(resourceType, accountId, uniqueId); } @Override public List<AbstractResource<?>> findResourcesAt(String accountId, ResourceType resourceType, Region region, DateTime dateTime) { Validate.noNullElements(new Object[]{accountId, resourceType, region, dateTime}); List<AbstractResource<?>> result = new ArrayList<>(); if (region.equals(Region.All)) { for (Region r : Region.findAvailableRegions(resourceType)) { Optional<Ec2Version> oEc2Version = awsDao.findEc2VersionUpto(accountId, resourceType, r, dateTime, true, false); if (oEc2Version.isPresent()) { Collection<AbstractResource<?>> resources = awsDao.findResources(oEc2Version.get().getResourceIds(), resourceType); result.addAll(resources); } } } else { Optional<Ec2Version> oEc2Version = awsDao.findEc2VersionUpto(accountId, resourceType, region, dateTime, true, false); if (oEc2Version.isPresent()) { Collection<AbstractResource<?>> resources = awsDao.findResources(oEc2Version.get().getResourceIds(), resourceType); result.addAll(resources); } } return result; } @Override public List<Ec2Version> findEc2VersionsFromIncludeOrderByTimeDetected(String accountId, ResourceType resourceType, Region region, DateTime dateTime) { Validate.noNullElements(new Object[]{accountId, resourceType, region, dateTime}); return awsDao.findEc2VersionsFrom(accountId, resourceType, region, dateTime, true, true); } @Override public List<Ec2Version> findEc2VersionsFromExcludeOrderByTimeDetected(String accountId, ResourceType resourceType, Region region, DateTime dateTime) { Validate.noNullElements(new Object[]{accountId, resourceType, region, dateTime}); return awsDao.findEc2VersionsFrom(accountId, resourceType, region, dateTime, false, true); } public Optional<Ec2Version> findEc2VersionAt(String accountId, ResourceType resourceType, DateTime dateTime) { return awsDao.findEc2VersionAt(accountId, resourceType, dateTime); } @Override public List<Ec2Version> findEc2VersionsOrderByTimeDetectedAsc(String accountId, ResourceType resourceType, Region region) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); return awsDao.findEc2VersionsUpto(accountId, resourceType, region, null, null, true); } @Override public List<Ec2Version> findEc2VersionsOrderByTimeDetectedDesc(String accountId, ResourceType resourceType, Region region) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); return awsDao.findEc2VersionsUpto(accountId, resourceType, region, null, null, false); } @Override public long countEc2VersionsUpto(String accountId, ResourceType resourceType, Region region, DateTime dt, Boolean isIncludeTime) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); return awsDao.countEc2VersionsUpto(accountId, resourceType, region, dt, isIncludeTime); } @Override public long countEc2Versions(String accountId, ResourceType resourceType, Region region) { return awsDao.countEc2VersionsUpto(accountId, resourceType, region, null, null); } @Override public Optional<Ec2Version> findEc2Version(String ec2VersionId) { Ec2Version ec2Version = ec2VersionDao.findOne(ec2VersionId); if (ec2Version == null) { return Optional.absent(); } else { return Optional.of(ec2Version); } } @Override public Optional<Ec2Version> findLatestEc2VersionUptoInclude(String accountId, Region region, ResourceType resourceType, DateTime dt) { Validate.noNullElements(new Object[]{accountId, region, resourceType, dt}); return awsDao.findEc2VersionUpto(accountId, resourceType, region, dt, true, false); } @Override public Optional<Ec2Version> findFirstEc2Version(String accountId, Region region, ResourceType resourceType) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); return awsDao.findEc2VersionUpto(accountId, resourceType, region, null, null, true); } @Override public Optional<Ec2Version> findLatestEc2Version(String accountId, ResourceType resourceType, Region region) { Validate.noNullElements(new Object[]{accountId, region, resourceType}); return awsDao.findEc2VersionUpto(accountId, resourceType, region, null, null, false); } @Override public List<Ec2VersionMeta> findEc2VersionMetasOrderByTimeDetectedDesc(String accountId, ResourceType resourceType, Region region, Pageable pageable) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); Region r = region.equals(Region.All) ? null : region; return awsDao.findEc2VersionMetasUpto(accountId, resourceType, r, null, null, false, pageable, null); } @Override public List<Ec2VersionMeta> findEc2VersionMetasOrderByTimeDetectedDesc(String accountId, Region region, Pageable pageable) { Validate.noNullElements(new Object[]{accountId, region}); Region r = region.equals(Region.All) ? null : region; return awsDao.findEc2VersionMetasUpto(accountId, null, r, null, null, false, pageable, null); } @Override public List<Ec2VersionMeta> findEc2VersionMetasOrderByTimeDetectedDesc(String accountId, ResourceType resourceType, Region region, Pageable pageable, DateTime dt, Boolean isIncludeTime, String uniqueId) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); Region r = region.equals(Region.All) ? null : region; return awsDao.findEc2VersionMetasUpto(accountId, resourceType, r, dt, isIncludeTime, false, pageable, uniqueId); } @Override public long countEc2VersionMetas(String accountId, ResourceType resourceType, Region region, DateTime dt, Boolean isIncludeTime, String uniqueId) { Validate.noNullElements(new Object[]{accountId, resourceType, region, dt, isIncludeTime}); Region r = region.equals(Region.All) ? null : region; return awsDao.countEc2VersionMetasUpto(accountId, resourceType, r, dt, isIncludeTime, uniqueId); } @Override public long countEc2VersionMetas(String accountId, ResourceType resourceType, Region region) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); Region r = region.equals(Region.All) ? null : region; return awsDao.countEc2VersionMetasUpto(accountId, resourceType, r, null, null, null); } @Override public long countEc2VersionMetas(String accountId, ResourceType resourceType) { Validate.noNullElements(new Object[]{accountId, resourceType}); return awsDao.countEc2VersionMetasUpto(accountId, resourceType, null, null, null, null); } @Override public Optional<Ec2VersionMeta> findLatestEc2VersionMeta(String accountId, ResourceType resourceType, Region region) { Validate.noNullElements(new Object[]{accountId, resourceType, region}); Region r = region.equals(Region.All) ? null : region; return awsDao.findEc2VersionMetaUpto(accountId, resourceType, r, null, null, false); } // @Override // public Collection<AbstractResource<?>> findResources(String accountId, ResourceType resourceType, DateTime dateTime) { // Collection<AbstractResource<?>> result = new ArrayList<>(); // for (Region region : Region.findAvailableRegions(resourceType)) { // result.addAll(findResources(accountId, resourceType, region, dateTime)); // } // return result; // } @Override public String findUserId(String accessKeyId, String secretAccessKey) { return iam.findUserId(accessKeyId, secretAccessKey); } @Override public long countEc2VersionMetas(String accountId, ResourceType rt, Region region, String uniqueId) { Validate.noNullElements(new Object[]{accountId, rt, region}); Region r = region.equals(Region.All) ? null : region; return awsDao.countEc2VersionMetasUpto(accountId, rt, r, null, null, uniqueId); } @Override public List<Ec2VersionMeta> findEc2VersionMetasOrderByTimeDetectedDesc(String accountId, Region region, ResourceType rt, String uniqueId) { Validate.noNullElements(new Object[]{accountId, rt, region, uniqueId}); Region r = region.equals(Region.All) ? null : region; return awsDao.findEc2VersionMetasOrderByTimeDetectedDesc(accountId, rt, r, uniqueId); } }