Skip to content

Commit

Permalink
Add AWS_INSTANCE_IPV6 support to the AWS-SD provider
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Shen <[email protected]>
  • Loading branch information
mjlshen committed Sep 4, 2024
1 parent 53e0675 commit d0b0767
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 5 deletions.
17 changes: 13 additions & 4 deletions provider/awssd/aws_sd.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const (
sdNamespaceTypePrivate = "private"

sdInstanceAttrIPV4 = "AWS_INSTANCE_IPV4"
sdInstanceAttrIPV6 = "AWS_INSTANCE_IPV6"
sdInstanceAttrCname = "AWS_INSTANCE_CNAME"
sdInstanceAttrAlias = "AWS_ALIAS_DNS_NAME"
)
Expand Down Expand Up @@ -174,10 +175,15 @@ func (p *AWSSDProvider) instancesToEndpoint(ns *sd.NamespaceSummary, srv *sd.Ser
newEndpoint.RecordType = endpoint.RecordTypeCNAME
newEndpoint.Targets = append(newEndpoint.Targets, aws.StringValue(inst.Attributes[sdInstanceAttrAlias]))

// IP-based target
// IPv4-based target
} else if inst.Attributes[sdInstanceAttrIPV4] != nil {
newEndpoint.RecordType = endpoint.RecordTypeA
newEndpoint.Targets = append(newEndpoint.Targets, aws.StringValue(inst.Attributes[sdInstanceAttrIPV4]))

// IPv6-based target
} else if inst.Attributes[sdInstanceAttrIPV6] != nil {
newEndpoint.RecordType = endpoint.RecordTypeAAAA
newEndpoint.Targets = append(newEndpoint.Targets, aws.StringValue(inst.Attributes[sdInstanceAttrIPV6]))
} else {
log.Warnf("Invalid instance \"%v\" found in service \"%v\"", inst, srv.Name)
}
Expand Down Expand Up @@ -474,15 +480,18 @@ func (p *AWSSDProvider) RegisterInstance(service *sd.Service, ep *endpoint.Endpo

attr := make(map[string]*string)

if ep.RecordType == endpoint.RecordTypeCNAME {
switch ep.RecordType {
case endpoint.RecordTypeCNAME:
if p.isAWSLoadBalancer(target) {
attr[sdInstanceAttrAlias] = aws.String(target)
} else {
attr[sdInstanceAttrCname] = aws.String(target)
}
} else if ep.RecordType == endpoint.RecordTypeA {
case endpoint.RecordTypeA:
attr[sdInstanceAttrIPV4] = aws.String(target)
} else {
case endpoint.RecordTypeAAAA:
attr[sdInstanceAttrIPV6] = aws.String(target)
default:
return fmt.Errorf("invalid endpoint type (%v)", ep)
}

Expand Down
51 changes: 50 additions & 1 deletion provider/awssd/aws_sd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,19 @@ func TestAWSSDProvider_Records(t *testing.T) {
}},
},
},
"aaaa-srv": {
Id: aws.String("aaaa-srv"),
Name: aws.String("service4"),
Description: aws.String("owner-id"),
DnsConfig: &sd.DnsConfig{
NamespaceId: aws.String("private"),
RoutingPolicy: aws.String(sd.RoutingPolicyWeighted),
DnsRecords: []*sd.DnsRecord{{
Type: aws.String(sd.RecordTypeAaaa),
TTL: aws.Int64(100),
}},
},
},
},
}

Expand Down Expand Up @@ -318,12 +331,21 @@ func TestAWSSDProvider_Records(t *testing.T) {
},
},
},
"aaaa-srv": {
"0000:0000:0000:0000:abcd:abcd:abcd:abcd": {
Id: aws.String("0000:0000:0000:0000:abcd:abcd:abcd:abcd"),
Attributes: map[string]*string{
sdInstanceAttrIPV6: aws.String("0000:0000:0000:0000:abcd:abcd:abcd:abcd"),
},
},
},
}

expectedEndpoints := []*endpoint.Endpoint{
{DNSName: "service1.private.com", Targets: endpoint.Targets{"1.2.3.4", "1.2.3.5"}, RecordType: endpoint.RecordTypeA, RecordTTL: 100, Labels: map[string]string{endpoint.AWSSDDescriptionLabel: "owner-id"}},
{DNSName: "service2.private.com", Targets: endpoint.Targets{"load-balancer.us-east-1.elb.amazonaws.com"}, RecordType: endpoint.RecordTypeCNAME, RecordTTL: 100, Labels: map[string]string{endpoint.AWSSDDescriptionLabel: "owner-id"}},
{DNSName: "service3.private.com", Targets: endpoint.Targets{"cname.target.com"}, RecordType: endpoint.RecordTypeCNAME, RecordTTL: 80, Labels: map[string]string{endpoint.AWSSDDescriptionLabel: "owner-id"}},
{DNSName: "service4.private.com", Targets: endpoint.Targets{"0000:0000:0000:0000:abcd:abcd:abcd:abcd"}, RecordType: endpoint.RecordTypeAAAA, RecordTTL: 100, Labels: map[string]string{endpoint.AWSSDDescriptionLabel: "owner-id"}},
}

api := &AWSSDClientStub{
Expand Down Expand Up @@ -733,6 +755,19 @@ func TestAWSSDProvider_RegisterInstance(t *testing.T) {
}},
},
},
"aaaa-srv": {
Id: aws.String("aaaa-srv"),
Name: aws.String("service4"),
Description: aws.String("owner-id"),
DnsConfig: &sd.DnsConfig{
NamespaceId: aws.String("private"),
RoutingPolicy: aws.String(sd.RoutingPolicyWeighted),
DnsRecords: []*sd.DnsRecord{{
Type: aws.String(sd.RecordTypeAaaa),
TTL: aws.Int64(100),
}},
},
},
},
}

Expand All @@ -746,7 +781,7 @@ func TestAWSSDProvider_RegisterInstance(t *testing.T) {

expectedInstances := make(map[string]*sd.Instance)

// IP-based instance
// IPv4-based instance
provider.RegisterInstance(services["private"]["a-srv"], &endpoint.Endpoint{
RecordType: endpoint.RecordTypeA,
DNSName: "service1.private.com.",
Expand Down Expand Up @@ -814,6 +849,20 @@ func TestAWSSDProvider_RegisterInstance(t *testing.T) {
},
}

// IPv6-based instance
provider.RegisterInstance(services["private"]["aaaa-srv"], &endpoint.Endpoint{
RecordType: endpoint.RecordTypeAAAA,
DNSName: "service4.private.com.",
RecordTTL: 300,
Targets: endpoint.Targets{"0000:0000:0000:0000:abcd:abcd:abcd:abcd"},
})
expectedInstances["0000:0000:0000:0000:abcd:abcd:abcd:abcd"] = &sd.Instance{
Id: aws.String("0000:0000:0000:0000:abcd:abcd:abcd:abcd"),
Attributes: map[string]*string{
sdInstanceAttrIPV6: aws.String("0000:0000:0000:0000:abcd:abcd:abcd:abcd"),
},
}

// validate instances
for _, srvInst := range api.instances {
for id, inst := range srvInst {
Expand Down

0 comments on commit d0b0767

Please sign in to comment.