From 9362cbcbc29531d35fba6ecd9d03154eae9c2620 Mon Sep 17 00:00:00 2001 From: Frank Schroeder Date: Mon, 25 Sep 2017 03:12:30 +0200 Subject: [PATCH] Add support to discover public v4 and v6 addresses on AWS (#3471) Update github.com/hashicorp/go-discover/provider/aws to support the 'addr_type' option which allows detection of private_v4, public_v4 and public_v6 addresses. Fixes #3471 --- .../go-discover/provider/aws/aws_discover.go | 60 ++++++++++++++++--- vendor/vendor.json | 2 +- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/vendor/github.com/hashicorp/go-discover/provider/aws/aws_discover.go b/vendor/github.com/hashicorp/go-discover/provider/aws/aws_discover.go index 8e9e7d5261..c6c469e92d 100644 --- a/vendor/github.com/hashicorp/go-discover/provider/aws/aws_discover.go +++ b/vendor/github.com/hashicorp/go-discover/provider/aws/aws_discover.go @@ -23,6 +23,7 @@ func (p *Provider) Help() string { region: The AWS region. Default to region of instance. tag_key: The tag key to filter on tag_value: The tag value to filter on + addr_type: "private_v4", "public_v4" or "public_v6". Defaults to "private_v4". access_key_id: The AWS access key to use secret_access_key: The AWS secret access key to use @@ -43,10 +44,21 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error region := args["region"] tagKey := args["tag_key"] tagValue := args["tag_value"] + addrType := args["addr_type"] accessKey := args["access_key_id"] secretKey := args["secret_access_key"] - log.Printf("[DEBUG] discover-aws: Using region=%s tag_key=%s tag_value=%s", region, tagKey, tagValue) + if addrType != "private_v4" && addrType != "public_v4" && addrType != "public_v6" { + l.Printf("[INFO] discover-aws: Address type %s is not supported. Valid values are {private_v4,public_v4,public_v6}. Falling back to 'private_v4'", addrType) + addrType = "private_v4" + } + + if addrType == "" { + l.Printf("[DEBUG] discover-aws: Address type not provided. Using 'private_v4'") + addrType = "private_v4" + } + + log.Printf("[DEBUG] discover-aws: Using region=%s tag_key=%s tag_value=%s addr_type=%s", region, tagKey, tagValue, addrType) if accessKey == "" && secretKey == "" { log.Printf("[DEBUG] discover-aws: No static credentials") log.Printf("[DEBUG] discover-aws: Using environment variables, shared credentials or instance role") @@ -89,6 +101,10 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error Name: aws.String("tag:" + tagKey), Values: []*string{aws.String(tagValue)}, }, + &ec2.Filter{ + Name: aws.String("instance-state-name"), + Values: []*string{aws.String("running")}, + }, }, }) if err != nil { @@ -103,14 +119,42 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error id := *inst.InstanceId l.Printf("[DEBUG] discover-aws: Found instance %s", id) - // Terminated instances don't have the PrivateIpAddress field - if inst.PrivateIpAddress == nil { - l.Printf("[DEBUG] discover-aws: Instance %s has no private ip", id) - continue - } + switch addrType { + case "public_v6": + l.Printf("[DEBUG] discover-aws: Instance %s has %d network interfaces", id, len(inst.NetworkInterfaces)) - l.Printf("[INFO] discover-aws: Instance %s has private ip %s", id, *inst.PrivateIpAddress) - addrs = append(addrs, *inst.PrivateIpAddress) + for _, networkinterface := range inst.NetworkInterfaces { + l.Printf("[DEBUG] discover-aws: Checking NetworInterfaceId %s on Instance %s", *networkinterface.NetworkInterfaceId, id) + // Check if instance got any ipv6 + if networkinterface.Ipv6Addresses == nil { + l.Printf("[DEBUG] discover-aws: Instance %s has no IPv6 on NetworkInterfaceId %s", id, *networkinterface.NetworkInterfaceId) + continue + } + for _, ipv6address := range networkinterface.Ipv6Addresses { + l.Printf("[INFO] discover-aws: Instance %s has IPv6 %s on NetworkInterfaceId %s", id, *ipv6address.Ipv6Address, *networkinterface.NetworkInterfaceId) + addrs = append(addrs, *ipv6address.Ipv6Address) + } + } + + case "public_v4": + if inst.PublicIpAddress == nil { + l.Printf("[DEBUG] discover-aws: Instance %s has no public IPv4", id) + continue + } + + l.Printf("[INFO] discover-aws: Instance %s has public ip %s", id, *inst.PublicIpAddress) + addrs = append(addrs, *inst.PublicIpAddress) + + default: + // EC2-Classic don't have the PrivateIpAddress field + if inst.PrivateIpAddress == nil { + l.Printf("[DEBUG] discover-aws: Instance %s has no private ip", id) + continue + } + + l.Printf("[INFO] discover-aws: Instance %s has private ip %s", id, *inst.PrivateIpAddress) + addrs = append(addrs, *inst.PrivateIpAddress) + } } } diff --git a/vendor/vendor.json b/vendor/vendor.json index a998281ca9..856aee35ba 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -26,7 +26,7 @@ {"path":"github.com/hashicorp/go-checkpoint","checksumSHA1":"nd3S1qkFv7zZxA9be0bw4nT0pe0=","revision":"e4b2dc34c0f698ee04750bf2035d8b9384233e1b","revisionTime":"2015-10-22T18:15:14Z"}, {"path":"github.com/hashicorp/go-cleanhttp","checksumSHA1":"b8F628srIitj5p7Y130xc9k0QWs=","revision":"3573b8b52aa7b37b9358d966a898feb387f62437","revisionTime":"2017-02-11T01:34:15Z"}, {"path":"github.com/hashicorp/go-discover","checksumSHA1":"uNoQWG5h2hzWHjaLi376ZXVaCr4=","revision":"21b26b722865b64ae5809a532d2c18f3a3800129","revisionTime":"2017-08-16T16:53:52Z"}, - {"path":"github.com/hashicorp/go-discover/provider/aws","checksumSHA1":"6wdwVsYyTqW4ReHsWs4mEwoz1FI=","revision":"21b26b722865b64ae5809a532d2c18f3a3800129","revisionTime":"2017-08-16T16:53:52Z","tree":true}, + {"path":"github.com/hashicorp/go-discover/provider/aws","checksumSHA1":"lyPRg8aZKgGiNkMILk/VKwOqMy4=","revision":"25e4565347de14cea0a0e0730374c9fcffa7bab0","revisionTime":"2017-09-25T01:06:15Z","tree":true}, {"path":"github.com/hashicorp/go-discover/provider/azure","checksumSHA1":"r97P32e+VmNMh2vwLkZa1zPEDQU=","revision":"b518491d039b6782035b8881502b4f5e9fcc887b","revisionTime":"2017-08-01T15:32:04Z","tree":true}, {"path":"github.com/hashicorp/go-discover/provider/gce","checksumSHA1":"KC/MepQsQF17904UShiM61jmaEs=","revision":"b518491d039b6782035b8881502b4f5e9fcc887b","revisionTime":"2017-08-01T15:32:04Z","tree":true}, {"path":"github.com/hashicorp/go-discover/provider/softlayer","checksumSHA1":"SIyZ44AHIUTBfI336ACpCeybsLg=","revision":"b518491d039b6782035b8881502b4f5e9fcc887b","revisionTime":"2017-08-01T15:32:04Z","tree":true},