package com.clouck.mq;
import java.util.List;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.clouck.application.Ec2Constants;
import com.clouck.model.Account;
import com.clouck.model.Region;
import com.clouck.model.ResourceType;
import com.clouck.model.ScanConfig;
import com.clouck.model.aws.AbstractResource;
import com.clouck.repository.AccountDao;
import com.clouck.repository.AwsRepository;
import com.clouck.repository.BaseRepository;
import com.clouck.service.ConfService;
import com.clouck.service.ResourceService;
import com.clouck.validator.Ec2ResourceValidator;
import com.clouck.wrapper.aws.AsWrapper;
import com.clouck.wrapper.aws.Ec2Wrapper;
import com.clouck.wrapper.aws.IamWrapper;
import com.google.common.base.Optional;
@Component
public class ScanResourceWorker {
private static final Logger log = LoggerFactory.getLogger(ScanResourceWorker.class);
@Autowired
private Ec2Wrapper ec2;
@Autowired
private BaseRepository baseDao;
@Autowired
private AccountDao accountDao;
@Autowired
private AwsRepository awsDao;
@Autowired
private AsWrapper as;
@Autowired
private IamWrapper iam;
@Autowired
private Ec2ResourceValidator validator;
@Autowired
private AmqpTemplate template;
@Autowired
private ResourceService resourceService;
@Autowired
private ConfService confService;
public void receive(ScanResourceMessage message) {
String accountId = message.getAccountId();
Account account = accountDao.findOne(accountId);
ResourceType resourceType = message.getResourceType();
Region region = message.getRegion();
//prevent receiving too many "same" messages at the same time in case of worker failure.
DateTime now = DateTime.now();
Optional<ScanConfig> oScanConf = confService.findScanConf(accountId, resourceType, region);
if (oScanConf.isPresent()) {
ScanConfig sc = oScanConf.get();
DateTime dateTime = new DateTime(oScanConf.get().getLastScanTime());
if (dateTime.plusSeconds(Ec2Constants.Resource_Scaning_Mininum_Waiting_Seconds).isAfter(now)) {
return;
} else {
sc.setLastScanTime(now.toDate());
confService.save(sc);
}
} else {
confService.createNewScanConf(accountId, resourceType, region);
}
//TODO: put this line into resource service
List<AbstractResource<?>> newResources = resourceService.findNewResources(account, region, resourceType, now);
resourceService.addNewResources(account, region, resourceType, newResources, now);
}
}