package com.clouck.validator;
import java.util.Collection;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.Validate;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.clouck.model.Account;
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.service.AwsService;
import com.google.common.base.Optional;
@Component
public class Ec2ResourceValidator {
@Autowired
private AwsService awsService;
public <R extends AbstractResource<?>> void validate(Collection<R> existingResources, Collection<R> newResources) {
notNullAndSameAccountIdAndRegion(existingResources);
notNullAndSameAccountIdAndRegion(newResources);
sameAccountIdAndRegionAcrossTwoLists(existingResources, newResources);
}
public <R extends AbstractResource<?>> void notNullAndSameAccountIdAndRegion(Collection<R> resources) {
Validate.notNull(resources);
String preAccountId = null;
Region preRegion = null;
for (R resource : resources) {
String accountId = resource.getAccountId();
Region region = resource.getRegion();
Validate.notNull(accountId);
ResourceType rt = ResourceType.find(resource);
if (rt.isMultiRegion()) {
Validate.notNull(region);
}
if (preAccountId == null) {
preAccountId = accountId;
}
if (preRegion == null) {
preRegion = region;
}
Validate.isTrue(ObjectUtils.equals(accountId, preAccountId));
Validate.isTrue(ObjectUtils.equals(region, preRegion));
}
}
public <R extends AbstractResource<?>> void sameAccountIdAndRegionAcrossTwoLists(Collection<R> existingResources, Collection<R> newResources) {
Validate.noNullElements(new Object[]{existingResources, newResources});
R tmp = null;
for (R resource : existingResources) {
tmp = resource;
break;
}
if (tmp == null) {
return;
}
for (R resource : newResources) {
Validate.isTrue(tmp.getClass().equals(resource.getClass()));
break;
}
}
public void validate(Ec2Version oldVersion, Ec2Version newVersion) {
Validate.noNullElements(new Object[]{oldVersion, newVersion});
Validate.isTrue(oldVersion.getAccountId().equals(newVersion.getAccountId()));
Validate.isTrue(oldVersion.getRegion().equals(newVersion.getRegion()));
Validate.isTrue(oldVersion.getResourceType().equals(newVersion.getResourceType()));
}
public <R extends AbstractResource<?>> void isSameTime(Collection<R> newResources, DateTime dt) {
Validate.noNullElements(new Object[]{newResources, dt});
for (R resource : newResources) {
Validate.isTrue(dt.toInstant().getMillis() == resource.getTimeDetected().getTime());
}
}
public void isLatestTime(Account account, Region region, ResourceType resourceType, DateTime dt) {
Validate.noNullElements(new Object[]{account, region, resourceType, dt});
Optional<Ec2Version> oEc2Version = awsService.findLatestEc2Version(account.getId(), resourceType, region);
if (oEc2Version.isPresent()) {
Ec2Version ec2Version = oEc2Version.get();
if (ec2Version.getTimeDetected().after(dt.toDate())) {
throw new IllegalArgumentException(String.format("latest ec2version is:%s which is later than datetime:%s",
ec2Version.getTimeDetected(), dt.toDate()));
}
}
}
}