Skip to content

Commit 301d338

Browse files
authored
Merge pull request #35836 from hashicorp/pr35565
r/aws_route53_record: Add `geoproximity_routing_policy` configuration block
2 parents d61833e + 051cca9 commit 301d338

File tree

4 files changed

+411
-1
lines changed

4 files changed

+411
-1
lines changed

.changelog/35565.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/aws_route53_record: Add `geoproximity_routing_policy` configuration block to support [geoproximity routing](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-geoproximity.html)
3+
```

internal/service/route53/record.go

+128
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ func ResourceRecord() *schema.Resource {
117117
ConflictsWith: []string{
118118
"failover_routing_policy",
119119
"geolocation_routing_policy",
120+
"geoproximity_routing_policy",
120121
"latency_routing_policy",
121122
"multivalue_answer_routing_policy",
122123
"weighted_routing_policy",
@@ -139,6 +140,7 @@ func ResourceRecord() *schema.Resource {
139140
ConflictsWith: []string{
140141
"cidr_routing_policy",
141142
"geolocation_routing_policy",
143+
"geoproximity_routing_policy",
142144
"latency_routing_policy",
143145
"multivalue_answer_routing_policy",
144146
"weighted_routing_policy",
@@ -172,6 +174,54 @@ func ResourceRecord() *schema.Resource {
172174
ConflictsWith: []string{
173175
"cidr_routing_policy",
174176
"failover_routing_policy",
177+
"geoproximity_routing_policy",
178+
"latency_routing_policy",
179+
"multivalue_answer_routing_policy",
180+
"weighted_routing_policy",
181+
},
182+
RequiredWith: []string{"set_identifier"},
183+
},
184+
"geoproximity_routing_policy": {
185+
Type: schema.TypeList,
186+
MaxItems: 1,
187+
Optional: true,
188+
Elem: &schema.Resource{
189+
Schema: map[string]*schema.Schema{
190+
"aws_region": {
191+
Type: schema.TypeString,
192+
Optional: true,
193+
},
194+
"bias": {
195+
Type: schema.TypeInt,
196+
Optional: true,
197+
ValidateFunc: validation.IntBetween(-99, 99),
198+
},
199+
"coordinates": {
200+
Type: schema.TypeSet,
201+
Elem: &schema.Resource{
202+
Schema: map[string]*schema.Schema{
203+
"latitude": {
204+
Type: schema.TypeString,
205+
Required: true,
206+
},
207+
"longitude": {
208+
Type: schema.TypeString,
209+
Required: true,
210+
},
211+
},
212+
},
213+
Optional: true,
214+
},
215+
"local_zone_group": {
216+
Type: schema.TypeString,
217+
Optional: true,
218+
},
219+
},
220+
},
221+
ConflictsWith: []string{
222+
"cidr_routing_policy",
223+
"failover_routing_policy",
224+
"geolocation_routing_policy",
175225
"latency_routing_policy",
176226
"multivalue_answer_routing_policy",
177227
"weighted_routing_policy",
@@ -198,6 +248,7 @@ func ResourceRecord() *schema.Resource {
198248
"cidr_routing_policy",
199249
"failover_routing_policy",
200250
"geolocation_routing_policy",
251+
"geoproximity_routing_policy",
201252
"multivalue_answer_routing_policy",
202253
"weighted_routing_policy",
203254
},
@@ -210,6 +261,7 @@ func ResourceRecord() *schema.Resource {
210261
"cidr_routing_policy",
211262
"failover_routing_policy",
212263
"geolocation_routing_policy",
264+
"geoproximity_routing_policy",
213265
"latency_routing_policy",
214266
"weighted_routing_policy",
215267
},
@@ -264,6 +316,7 @@ func ResourceRecord() *schema.Resource {
264316
"cidr_routing_policy",
265317
"failover_routing_policy",
266318
"geolocation_routing_policy",
319+
"geoproximity_routing_policy",
267320
"latency_routing_policy",
268321
"multivalue_answer_routing_policy",
269322
},
@@ -411,6 +464,18 @@ func resourceRecordRead(ctx context.Context, d *schema.ResourceData, meta interf
411464
}
412465
}
413466

467+
if record.GeoProximityLocation != nil {
468+
v := []map[string]interface{}{{
469+
"aws_region": aws.StringValue(record.GeoProximityLocation.AWSRegion),
470+
"bias": aws.Int64Value((record.GeoProximityLocation.Bias)),
471+
"coordinates": flattenCoordinate(record.GeoProximityLocation.Coordinates),
472+
"local_zone_group": aws.StringValue(record.GeoProximityLocation.LocalZoneGroup),
473+
}}
474+
if err := d.Set("geoproximity_routing_policy", v); err != nil {
475+
return sdkdiag.AppendErrorf(diags, "setting geoproximity_routing_policy: %s", err)
476+
}
477+
}
478+
414479
if record.Region != nil {
415480
v := []map[string]interface{}{{
416481
"region": aws.StringValue(record.Region),
@@ -518,6 +583,21 @@ func resourceRecordUpdate(ctx context.Context, d *schema.ResourceData, meta inte
518583
}
519584
}
520585

586+
if v, _ := d.GetChange("geoproximity_routing_policy"); v != nil {
587+
if o, ok := v.([]interface{}); ok {
588+
if len(o) == 1 {
589+
if v, ok := o[0].(map[string]interface{}); ok {
590+
oldRec.GeoProximityLocation = &route53.GeoProximityLocation{
591+
AWSRegion: nilString(v["aws_region"].(string)),
592+
Bias: aws.Int64(int64(v["bias"].(int))),
593+
Coordinates: ExpandCoordinatesValue(v["coordinates"].(*schema.Set).List()),
594+
LocalZoneGroup: nilString(v["local_zone_group"].(string)),
595+
}
596+
}
597+
}
598+
}
599+
}
600+
521601
if v, _ := d.GetChange("latency_routing_policy"); v != nil {
522602
if o, ok := v.([]interface{}); ok {
523603
if len(o) == 1 {
@@ -852,6 +932,18 @@ func expandResourceRecordSet(d *schema.ResourceData, zoneName string) *route53.R
852932
}
853933
}
854934

935+
if v, ok := d.GetOk("geoproximity_routing_policy"); ok {
936+
geoproximityvalues := v.([]interface{})
937+
geoproximity := geoproximityvalues[0].(map[string]interface{})
938+
939+
rec.GeoProximityLocation = &route53.GeoProximityLocation{
940+
AWSRegion: nilString(geoproximity["aws_region"].(string)),
941+
Bias: aws.Int64(int64(geoproximity["bias"].(int))),
942+
Coordinates: ExpandCoordinatesValue(geoproximity["coordinates"].(*schema.Set).List()),
943+
LocalZoneGroup: nilString(geoproximity["local_zone_group"].(string)),
944+
}
945+
}
946+
855947
if v, ok := d.GetOk("health_check_id"); ok {
856948
rec.HealthCheckId = aws.String(v.(string))
857949
}
@@ -918,6 +1010,22 @@ func ExpandRecordName(name, zone string) string {
9181010
return rn
9191011
}
9201012

1013+
func ExpandCoordinatesValue(tfList []interface{}) *route53.Coordinates {
1014+
if len(tfList) == 0 {
1015+
return nil
1016+
}
1017+
coordinatesvalue := &route53.Coordinates{}
1018+
for _, tfMapRaw := range tfList {
1019+
tfMap, ok := tfMapRaw.(map[string]interface{})
1020+
if !ok {
1021+
continue
1022+
}
1023+
coordinatesvalue.Latitude = aws.String(tfMap["latitude"].(string))
1024+
coordinatesvalue.Longitude = aws.String(tfMap["longitude"].(string))
1025+
}
1026+
return coordinatesvalue
1027+
}
1028+
9211029
// nilString takes a string as an argument and returns a string
9221030
// pointer. The returned pointer is nil if the string argument is
9231031
// empty. Otherwise, it is a pointer to a copy of the string.
@@ -957,6 +1065,26 @@ func ParseRecordID(id string) [4]string {
9571065
return [4]string{recZone, recName, recType, recSet}
9581066
}
9591067

1068+
func flattenCoordinate(coordinates *route53.Coordinates) []interface{} {
1069+
if coordinates == nil {
1070+
return nil
1071+
}
1072+
var tfList []interface{}
1073+
tfMap := map[string]interface{}{}
1074+
1075+
if v := coordinates.Latitude; v != nil {
1076+
tfMap["latitude"] = aws.StringValue(v)
1077+
}
1078+
1079+
if v := coordinates.Longitude; v != nil {
1080+
tfMap["longitude"] = aws.StringValue(v)
1081+
}
1082+
1083+
tfList = append(tfList, tfMap)
1084+
1085+
return tfList
1086+
}
1087+
9601088
func validRecordType(s string) bool {
9611089
for _, v := range route53.RRType_Values() {
9621090
if v == s {

0 commit comments

Comments
 (0)