package com.clouck.comparator;
import static com.clouck.util.ResourceUtil.notEqualCollection;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.amazonaws.services.ec2.model.BlockDeviceMapping;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.ec2.model.LaunchPermission;
import com.clouck.model.Event;
import com.clouck.model.EventType;
import com.clouck.model.aws.ec2.Ec2Ami;
@Component
public class Ec2AmiComparator extends AbstractEc2Comparator<Ec2Ami> {
private static final Logger log = LoggerFactory.getLogger(Ec2AmiComparator.class);
@Override
public Event firstScan() {
return createFirstScanEvent(EventType.Ec2_AMI_First_Scan);
}
@Override
public Event initialise(Ec2Ami newResource) {
return createEvent(null, newResource, EventType.Ec2_AMI_Found);
}
@Override
public Event add(Ec2Ami newResource) {
Image image = newResource.getResource();
String state = image.getState();
switch (state) {
case "available":
return createEvent(null, newResource, EventType.Ec2_AMI_Registered);
case "deregistered":
return createEvent(null, newResource, EventType.Ec2_AMI_Deregistered);
case "pending":
return createEvent(null, newResource, EventType.Ec2_AMI_Pending);
default:
log.error("not handled instance state:{}", state);
return createEvent(null, newResource, EventType.Unknown);
}
}
@Override
public Event delete(Ec2Ami oldResource) {
return createEvent(oldResource, null, EventType.Ec2_AMI_Deregistered);
}
@Override
protected void update(List<Event> result, Ec2Ami oldResource, Ec2Ami newResource) {
Image oldImage = oldResource.getResource();
Image newImage = newResource.getResource();
if (notEqual(oldImage.isPublic(), newImage.isPublic())) {
result.add(createEvent(oldResource, newResource, newImage.isPublic() ? EventType.Ec2_AMI_Permission_Visibility_Public : EventType.Ec2_AMI_Permission_Visibility_Private));
}
if (notEqual(oldImage.getDescription(), newImage.getDescription())) {
result.add(createEvent(oldResource, newResource, EventType.Ec2_AMI_Description_Changed, oldImage.getDescription(), newImage.getDescription()));
}
if (notEqual(oldImage.getState(), newImage.getState())) {
switch (newImage.getState()) {
case "available":
result.add(createEvent(oldResource, newResource, EventType.Ec2_AMI_Registered));
break;
default:
log.error("not handled instance state:{}", newImage.getState());
result.add(createEvent(oldResource, newResource, EventType.Unknown));
}
}
if (notEqualCollection(oldImage.getBlockDeviceMappings(), newImage.getBlockDeviceMappings())) {
}
compareBlockDeviceMapping(result, oldImage.getBlockDeviceMappings(), newImage.getBlockDeviceMappings(), oldResource, newResource);
compareLaunchPermission(result, oldResource.getLaunchPermissions(), newResource.getLaunchPermissions(), oldResource, newResource);
compareTags(result, oldImage.getTags(), newImage.getTags(), oldResource, newResource);
}
private void compareBlockDeviceMapping(Collection<Event> result, List<BlockDeviceMapping> oldBlockDeviceMappings, List<BlockDeviceMapping> newBlockDeviceMappings,
Ec2Ami oldResource, Ec2Ami newResource) {
CompareResult<BlockDeviceMapping> compareResult = resourceUtil.compareBlockDeviceMappings(oldBlockDeviceMappings, newBlockDeviceMappings);
for (BlockDeviceMapping bm : compareResult.getAdd()) {
log.error("not handled case");
result.add(createEvent(oldResource, newResource, EventType.Unknown));
}
for (BlockDeviceMapping bm : compareResult.getDelete()) {
log.error("not handled case");
result.add(createEvent(oldResource, newResource, EventType.Unknown));
}
for (Pair<BlockDeviceMapping, BlockDeviceMapping> pair : compareResult.getUpdate()) {
String oldSnapshotId = pair.getLeft().getEbs().getSnapshotId();
String newSnapshotId = pair.getRight().getEbs().getSnapshotId();
if (notEqual(oldSnapshotId, newSnapshotId)) {
if (oldSnapshotId == null && newSnapshotId != null) {
result.add(createEvent(oldResource, newResource, EventType.Ec2_AMI_Snapshot_Completed, newSnapshotId));
}
} else {
log.error("not handled case");
result.add(createEvent(oldResource, newResource, EventType.Unknown));
}
}
}
private void compareLaunchPermission(Collection<Event> result, List<LaunchPermission> oldPermissions, List<LaunchPermission> newPermissions,
Ec2Ami oldResource, Ec2Ami newResource) {
CompareResult<LaunchPermission> compareResult = resourceUtil.compare(oldPermissions, newPermissions);
for (LaunchPermission lp : compareResult.getAdd()) {
result.add(createEvent(oldResource, newResource, EventType.Ec2_AMI_Permission_Account_Added, lp.getUserId()));
}
for (LaunchPermission lp : compareResult.getDelete()) {
result.add(createEvent(oldResource, newResource, EventType.Ec2_AMI_Permission_Account_Removed, lp.getUserId()));
}
for (Pair<LaunchPermission, LaunchPermission> pair : compareResult.getUpdate()) {
log.error("not handled case");
result.add(createEvent(oldResource, newResource, EventType.Unknown));
}
}
}