package com.clouck.model.aws.ec2;
import static com.clouck.util.ResourceUtil.notEqual;
import static com.clouck.util.ResourceUtil.notEqualCollection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceNetworkInterface;
import com.amazonaws.services.ec2.model.Reservation;
import com.clouck.model.aws.AbstractResource;
import com.clouck.model.aws.comparator.GroupIdentifierComparator;
import com.clouck.model.aws.comparator.InstanceBlockDeviceMappingComparator;
import com.clouck.model.aws.comparator.InstanceNetworkInterfaceComparator;
import com.clouck.model.aws.comparator.InstancePrivateIpAddressComparator;
import com.clouck.model.aws.comparator.ProductCodeComparator;
import com.clouck.model.aws.comparator.TagComparator;
@Document(collection = "ec2_reservation")
@TypeAlias(value = "ec2_reservation")
@SuppressWarnings("serial")
public class Ec2Reservation extends AbstractResource<Reservation> {
private Map<String, Ec2InstanceAttribute> instanceId2Attributes = new HashMap<>();
public Map<String, Ec2InstanceAttribute> getInstanceId2Attributes() {
return instanceId2Attributes;
}
public void setInstanceId2Attributes(Map<String, Ec2InstanceAttribute> instanceId2Attributes) {
this.instanceId2Attributes = instanceId2Attributes;
}
@Override
@SuppressWarnings("rawtypes")
protected boolean isEqual(AbstractResource newResource) {
Reservation oldReservation = this.getResource();
Ec2Reservation newEc2Reservation = (Ec2Reservation) newResource;
Reservation newReservation = newEc2Reservation.getResource();
if (notEqual(oldReservation.getRequesterId(), newReservation.getRequesterId())) return false;
if (notEqual(oldReservation.getOwnerId(), newReservation.getOwnerId())) return false;
if (notEqual(oldReservation.getRequesterId(), newReservation.getRequesterId())) return false;
if (notEqualCollection(oldReservation.getGroups(), newReservation.getGroups())) return false;
if (notEqualCollection(oldReservation.getGroupNames(), newReservation.getGroupNames())) return false;
if (notEqualInstancess(oldReservation.getInstances(), newReservation.getInstances())) return false;
if (notEqual(this.getInstanceId2Attributes(), newEc2Reservation.getInstanceId2Attributes())) return false;
return true;
}
private boolean notEqualInstancess(List<Instance> l1, List<Instance> l2) {
for (Instance i1 : l1) {
Collections.sort(i1.getProductCodes(), new ProductCodeComparator());
Collections.sort(i1.getBlockDeviceMappings(), new InstanceBlockDeviceMappingComparator());
Collections.sort(i1.getTags(), new TagComparator());
Collections.sort(i1.getSecurityGroups(), new GroupIdentifierComparator());
Collections.sort(i1.getNetworkInterfaces(), new InstanceNetworkInterfaceComparator());
for (InstanceNetworkInterface ini1 : i1.getNetworkInterfaces()) {
Collections.sort(ini1.getGroups(), new GroupIdentifierComparator());
Collections.sort(ini1.getPrivateIpAddresses(), new InstancePrivateIpAddressComparator());
}
}
for (Instance i2 : l2) {
Collections.sort(i2.getProductCodes(), new ProductCodeComparator());
Collections.sort(i2.getBlockDeviceMappings(), new InstanceBlockDeviceMappingComparator());
Collections.sort(i2.getTags(), new TagComparator());
Collections.sort(i2.getSecurityGroups(), new GroupIdentifierComparator());
Collections.sort(i2.getNetworkInterfaces(), new InstanceNetworkInterfaceComparator());
for (InstanceNetworkInterface ini2 : i2.getNetworkInterfaces()) {
Collections.sort(ini2.getGroups(), new GroupIdentifierComparator());
Collections.sort(ini2.getPrivateIpAddresses(), new InstancePrivateIpAddressComparator());
}
}
return notEqualCollection(l1, l2);
}
}