package com.hubspot.baragon.models;
import java.util.List;
import com.amazonaws.util.EC2MetadataUtils;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Optional;
@JsonIgnoreProperties( ignoreUnknown = true )
public class BaragonAgentEc2Metadata {
private final Optional<String> instanceId;
private final Optional<String> availabilityZone;
private final Optional<String> subnetId;
private final Optional<String> vpcId;
@JsonCreator
public BaragonAgentEc2Metadata(@JsonProperty("instanceId") Optional<String> instanceId,
@JsonProperty("availabilityZone") Optional<String> availabilityZone,
@JsonProperty("subnetId") Optional<String> subnetId,
@JsonProperty("vpcId") Optional<String> vpcId) {
this.instanceId = instanceId;
this.availabilityZone = availabilityZone;
this.subnetId = subnetId;
this.vpcId = vpcId;
}
public static BaragonAgentEc2Metadata fromEnvironment() {
return new BaragonAgentEc2Metadata(
findInstanceId(),
findAvailabilityZone(),
findSubnet(),
findVpc());
}
public static Optional<String> findInstanceId() {
try {
return Optional.fromNullable(EC2MetadataUtils.getInstanceId());
} catch (Exception e) {
return Optional.absent();
}
}
public static Optional<String> findAvailabilityZone() {
try {
return Optional.fromNullable(EC2MetadataUtils.getAvailabilityZone());
} catch (Exception e) {
return Optional.absent();
}
}
private static Optional<String> findSubnet() {
try {
List<EC2MetadataUtils.NetworkInterface> networkInterfaces = EC2MetadataUtils.getNetworkInterfaces();
if (EC2MetadataUtils.getNetworkInterfaces().isEmpty()) {
return Optional.absent();
} else {
return Optional.fromNullable(networkInterfaces.get(0).getSubnetId());
}
} catch (Exception e) {
return Optional.absent();
}
}
private static Optional<String> findVpc() {
try {
List<EC2MetadataUtils.NetworkInterface> networkInterfaces = EC2MetadataUtils.getNetworkInterfaces();
if (EC2MetadataUtils.getNetworkInterfaces().isEmpty()) {
return Optional.absent();
} else {
return Optional.fromNullable(networkInterfaces.get(0).getVpcId());
}
} catch (Exception e) {
return Optional.absent();
}
}
public Optional<String> getInstanceId() {
return instanceId;
}
public Optional<String> getAvailabilityZone() {
return availabilityZone;
}
public Optional<String> getSubnetId() {
return subnetId;
}
public Optional<String> getVpcId() {
return vpcId;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BaragonAgentEc2Metadata that = (BaragonAgentEc2Metadata) o;
if (instanceId != null ? !instanceId.equals(that.instanceId) : that.instanceId != null) {
return false;
}
if (availabilityZone != null ? !availabilityZone.equals(that.availabilityZone) : that.availabilityZone != null) {
return false;
}
if (subnetId != null ? !subnetId.equals(that.subnetId) : that.subnetId != null) {
return false;
}
return vpcId != null ? vpcId.equals(that.vpcId) : that.vpcId == null;
}
@Override
public int hashCode() {
int result = instanceId != null ? instanceId.hashCode() : 0;
result = 31 * result + (availabilityZone != null ? availabilityZone.hashCode() : 0);
result = 31 * result + (subnetId != null ? subnetId.hashCode() : 0);
result = 31 * result + (vpcId != null ? vpcId.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "BaragonAgentEc2Metadata{" +
"instanceId=" + instanceId +
", availabilityZone=" + availabilityZone +
", subnetId=" + subnetId +
", vpcId=" + vpcId +
'}';
}
}