diff --git a/plugin/plugin.go b/plugin/plugin.go index 1c897e8..f484c8e 100644 --- a/plugin/plugin.go +++ b/plugin/plugin.go @@ -543,16 +543,22 @@ func awsInstanceToHost(instance *ec2.Instance) (*pb.ListHostsResponseHost, error // External ID is the instance ID. result.ExternalId = aws.StringValue(instance.InstanceId) - // First IP address is always the private IP address field if it's - // populated + // First IP address/dns name are always the private fields if they + // are populated if aws.StringValue(instance.PrivateIpAddress) != "" { result.IpAddresses = append(result.IpAddresses, aws.StringValue(instance.PrivateIpAddress)) } + if aws.StringValue(instance.PrivateDnsName) != "" { + result.DnsNames = append(result.DnsNames, aws.StringValue(instance.PrivateDnsName)) + } - // Public IP address is next. + // Public IP address/dns names are next if aws.StringValue(instance.PublicIpAddress) != "" { result.IpAddresses = append(result.IpAddresses, aws.StringValue(instance.PublicIpAddress)) } + if aws.StringValue(instance.PublicDnsName) != "" { + result.DnsNames = append(result.DnsNames, aws.StringValue(instance.PublicDnsName)) + } // Now go through all of the interfaces and log the IP address of // every interface. @@ -562,6 +568,15 @@ func awsInstanceToHost(instance *ec2.Instance) (*pb.ListHostsResponseHost, error return nil, errors.New("response integrity error: interface entry is nil") } + // Populate default IP addresses/DNS name similar to how we do + // for the entire instance. + if aws.StringValue(iface.PrivateIpAddress) != "" && !stringInSlice(result.IpAddresses, aws.StringValue(iface.PrivateIpAddress)) { + result.IpAddresses = append(result.IpAddresses, aws.StringValue(iface.PrivateIpAddress)) + } + if aws.StringValue(iface.PrivateDnsName) != "" && !stringInSlice(result.DnsNames, aws.StringValue(iface.PrivateDnsName)) { + result.DnsNames = append(result.DnsNames, aws.StringValue(iface.PrivateDnsName)) + } + // Iterate through the private IP addresses and log the // information. for _, addr := range iface.PrivateIpAddresses { @@ -569,21 +584,20 @@ func awsInstanceToHost(instance *ec2.Instance) (*pb.ListHostsResponseHost, error return nil, errors.New("response integrity error: interface address entry is nil") } - // Check to see if the PrivateIpAddress matches the one - // reported at the top-level of the instance (let's call it the - // "default address"). If it doesn't, add it. - if aws.StringValue(addr.PrivateIpAddress) != "" { - if aws.StringValue(instance.PrivateIpAddress) != aws.StringValue(addr.PrivateIpAddress) { - result.IpAddresses = append(result.IpAddresses, aws.StringValue(addr.PrivateIpAddress)) - } + // Add private address/dns name if they have not been added yet + if aws.StringValue(addr.PrivateIpAddress) != "" && !stringInSlice(result.IpAddresses, aws.StringValue(addr.PrivateIpAddress)) { + result.IpAddresses = append(result.IpAddresses, aws.StringValue(addr.PrivateIpAddress)) + } + if aws.StringValue(addr.PrivateDnsName) != "" && !stringInSlice(result.DnsNames, aws.StringValue(addr.PrivateDnsName)) { + result.DnsNames = append(result.DnsNames, aws.StringValue(addr.PrivateDnsName)) } - // Do the same for the default public IP address and the - // public association on the interface. - if addr.Association != nil && addr.Association.PublicIp != nil && aws.StringValue(addr.Association.PublicIp) != "" { - if instance.PublicIpAddress != nil && aws.StringValue(instance.PublicIpAddress) != aws.StringValue(addr.Association.PublicIp) { - result.IpAddresses = append(result.IpAddresses, aws.StringValue(addr.Association.PublicIp)) - } + // Add public address/dns name if they have not been added yet + if addr.Association != nil && aws.StringValue(addr.Association.PublicIp) != "" && !stringInSlice(result.IpAddresses, aws.StringValue(addr.Association.PublicIp)) { + result.IpAddresses = append(result.IpAddresses, aws.StringValue(addr.Association.PublicIp)) + } + if addr.Association != nil && aws.StringValue(addr.Association.PublicDnsName) != "" && !stringInSlice(result.DnsNames, aws.StringValue(addr.Association.PublicDnsName)) { + result.DnsNames = append(result.DnsNames, aws.StringValue(addr.Association.PublicDnsName)) } } @@ -602,3 +616,13 @@ func awsInstanceToHost(instance *ec2.Instance) (*pb.ListHostsResponseHost, error // Done return result, nil } + +func stringInSlice(s []string, x string) bool { + for _, y := range s { + if x == y { + return true + } + } + + return false +} diff --git a/plugin/plugin_test.go b/plugin/plugin_test.go index 961aa8d..8fee701 100644 --- a/plugin/plugin_test.go +++ b/plugin/plugin_test.go @@ -1380,15 +1380,21 @@ func TestAwsInstanceToHost(t *testing.T) { instance: &ec2.Instance{ InstanceId: aws.String("foobar"), PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PublicIpAddress: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), NetworkInterfaces: []*ec2.InstanceNetworkInterface{ &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ Association: &ec2.InstanceNetworkInterfaceAssociation{ - PublicIp: aws.String("1.1.1.1"), + PublicIp: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), }, PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), }, }, }, @@ -1397,6 +1403,7 @@ func TestAwsInstanceToHost(t *testing.T) { expected: &pb.ListHostsResponseHost{ ExternalId: "foobar", IpAddresses: []string{"10.0.0.1", "1.1.1.1"}, + DnsNames: []string{"test.example.internal", "test.example.com"}, }, }, { @@ -1404,11 +1411,15 @@ func TestAwsInstanceToHost(t *testing.T) { instance: &ec2.Instance{ InstanceId: aws.String("foobar"), PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), NetworkInterfaces: []*ec2.InstanceNetworkInterface{ &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), }, }, }, @@ -1417,6 +1428,7 @@ func TestAwsInstanceToHost(t *testing.T) { expected: &pb.ListHostsResponseHost{ ExternalId: "foobar", IpAddresses: []string{"10.0.0.1"}, + DnsNames: []string{"test.example.internal"}, }, }, { @@ -1424,22 +1436,31 @@ func TestAwsInstanceToHost(t *testing.T) { instance: &ec2.Instance{ InstanceId: aws.String("foobar"), PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PublicIpAddress: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), NetworkInterfaces: []*ec2.InstanceNetworkInterface{ &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.2"), + PrivateDnsName: aws.String("test2.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ PrivateIpAddress: aws.String("10.0.0.2"), + PrivateDnsName: aws.String("test2.example.internal"), }, }, }, &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ Association: &ec2.InstanceNetworkInterfaceAssociation{ - PublicIp: aws.String("1.1.1.1"), + PublicIp: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), }, PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), }, }, }, @@ -1448,6 +1469,7 @@ func TestAwsInstanceToHost(t *testing.T) { expected: &pb.ListHostsResponseHost{ ExternalId: "foobar", IpAddresses: []string{"10.0.0.1", "1.1.1.1", "10.0.0.2"}, + DnsNames: []string{"test.example.internal", "test.example.com", "test2.example.internal"}, }, }, { @@ -1455,25 +1477,35 @@ func TestAwsInstanceToHost(t *testing.T) { instance: &ec2.Instance{ InstanceId: aws.String("foobar"), PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PublicIpAddress: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), NetworkInterfaces: []*ec2.InstanceNetworkInterface{ &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.2"), + PrivateDnsName: aws.String("test2.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ Association: &ec2.InstanceNetworkInterfaceAssociation{ - PublicIp: aws.String("1.1.1.2"), + PublicIp: aws.String("1.1.1.2"), + PublicDnsName: aws.String("test2.example.com"), }, PrivateIpAddress: aws.String("10.0.0.2"), + PrivateDnsName: aws.String("test2.example.internal"), }, }, }, &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ Association: &ec2.InstanceNetworkInterfaceAssociation{ - PublicIp: aws.String("1.1.1.1"), + PublicIp: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), }, PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), }, }, }, @@ -1482,6 +1514,7 @@ func TestAwsInstanceToHost(t *testing.T) { expected: &pb.ListHostsResponseHost{ ExternalId: "foobar", IpAddresses: []string{"10.0.0.1", "1.1.1.1", "10.0.0.2", "1.1.1.2"}, + DnsNames: []string{"test.example.internal", "test.example.com", "test2.example.internal", "test2.example.com"}, }, }, { @@ -1489,18 +1522,25 @@ func TestAwsInstanceToHost(t *testing.T) { instance: &ec2.Instance{ InstanceId: aws.String("foobar"), PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PublicIpAddress: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), NetworkInterfaces: []*ec2.InstanceNetworkInterface{ &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ Association: &ec2.InstanceNetworkInterfaceAssociation{ - PublicIp: aws.String("1.1.1.1"), + PublicIp: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), }, PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), }, &ec2.InstancePrivateIpAddress{ PrivateIpAddress: aws.String("10.0.0.2"), + PrivateDnsName: aws.String("test2.example.internal"), }, }, }, @@ -1509,6 +1549,7 @@ func TestAwsInstanceToHost(t *testing.T) { expected: &pb.ListHostsResponseHost{ ExternalId: "foobar", IpAddresses: []string{"10.0.0.1", "1.1.1.1", "10.0.0.2"}, + DnsNames: []string{"test.example.internal", "test.example.com", "test2.example.internal"}, }, }, { @@ -1516,9 +1557,12 @@ func TestAwsInstanceToHost(t *testing.T) { instance: &ec2.Instance{ InstanceId: aws.String("foobar"), PrivateIpAddress: aws.String("10.0.0.1"), + PrivateDnsName: aws.String("test.example.internal"), PublicIpAddress: aws.String("1.1.1.1"), + PublicDnsName: aws.String("test.example.com"), NetworkInterfaces: []*ec2.InstanceNetworkInterface{ &ec2.InstanceNetworkInterface{ + PrivateIpAddress: aws.String("10.0.0.1"), PrivateIpAddresses: []*ec2.InstancePrivateIpAddress{ &ec2.InstancePrivateIpAddress{ Association: &ec2.InstanceNetworkInterfaceAssociation{ @@ -1537,6 +1581,7 @@ func TestAwsInstanceToHost(t *testing.T) { expected: &pb.ListHostsResponseHost{ ExternalId: "foobar", IpAddresses: []string{"10.0.0.1", "1.1.1.1", "some::fake::address"}, + DnsNames: []string{"test.example.internal", "test.example.com"}, }, }, }