Repository: getmoto/moto

Issue:
Route 53 - support for Failover and Geolocation in ResourceRecordSets
The [RecordSet](https://github.com/spulec/moto/blob/master/moto/route53/models.py#L78) model for Route 53 does not currently support `GeoLocation` or `Failover`, as described here:

https://docs.aws.amazon.com/Route53/latest/APIReference/API_ResourceRecordSet.html


Discussion:

Resolving patch:
diff --git a/moto/route53/models.py b/moto/route53/models.py
--- a/moto/route53/models.py
+++ b/moto/route53/models.py
@@ -88,6 +88,8 @@ def __init__(self, kwargs):
         self.hosted_zone_name = kwargs.get("HostedZoneName")
         self.hosted_zone_id = kwargs.get("HostedZoneId")
         self.alias_target = kwargs.get("AliasTarget")
+        self.failover = kwargs.get("Failover")
+        self.geo_location = kwargs.get("GeoLocation")
 
     @classmethod
     def create_from_cloudformation_json(
@@ -154,6 +156,16 @@ def to_xml(self):
                 {% if record_set.ttl %}
                     <TTL>{{ record_set.ttl }}</TTL>
                 {% endif %}
+                {% if record_set.failover %}
+                    <Failover>{{ record_set.failover }}</Failover>
+                {% endif %}
+                {% if record_set.geo_location %}
+                <GeoLocation>
+                {% for geo_key in ['ContinentCode','CountryCode','SubdivisionCode'] %}
+                  {% if record_set.geo_location[geo_key] %}<{{ geo_key }}>{{ record_set.geo_location[geo_key] }}</{{ geo_key }}>{% endif %}
+                {% endfor %}
+                </GeoLocation>
+                {% endif %}
                 {% if record_set.alias_target %}
                 <AliasTarget>
                     <HostedZoneId>{{ record_set.alias_target['HostedZoneId'] }}</HostedZoneId>


Test patch:
diff --git a/tests/test_route53/test_route53.py b/tests/test_route53/test_route53.py
--- a/tests/test_route53/test_route53.py
+++ b/tests/test_route53/test_route53.py
@@ -753,6 +753,79 @@ def test_change_weighted_resource_record_sets():
             record["Weight"].should.equal(10)
 
 
+@mock_route53
+def test_failover_record_sets():
+    conn = boto3.client("route53", region_name="us-east-2")
+    conn.create_hosted_zone(Name="test.zone.", CallerReference=str(hash("test")))
+    zones = conn.list_hosted_zones_by_name(DNSName="test.zone.")
+    hosted_zone_id = zones["HostedZones"][0]["Id"]
+
+    # Create geolocation record
+    conn.change_resource_record_sets(
+        HostedZoneId=hosted_zone_id,
+        ChangeBatch={
+            "Changes": [
+                {
+                    "Action": "CREATE",
+                    "ResourceRecordSet": {
+                        "Name": "failover.test.zone.",
+                        "Type": "A",
+                        "TTL": 10,
+                        "ResourceRecords": [{"Value": "127.0.0.1"}],
+                        "Failover": "PRIMARY",
+                    },
+                }
+            ]
+        },
+    )
+
+    response = conn.list_resource_record_sets(HostedZoneId=hosted_zone_id)
+    record = response["ResourceRecordSets"][0]
+    record["Failover"].should.equal("PRIMARY")
+
+
+@mock_route53
+def test_geolocation_record_sets():
+    conn = boto3.client("route53", region_name="us-east-2")
+    conn.create_hosted_zone(Name="test.zone.", CallerReference=str(hash("test")))
+    zones = conn.list_hosted_zones_by_name(DNSName="test.zone.")
+    hosted_zone_id = zones["HostedZones"][0]["Id"]
+
+    # Create geolocation record
+    conn.change_resource_record_sets(
+        HostedZoneId=hosted_zone_id,
+        ChangeBatch={
+            "Changes": [
+                {
+                    "Action": "CREATE",
+                    "ResourceRecordSet": {
+                        "Name": "georecord1.test.zone.",
+                        "Type": "A",
+                        "TTL": 10,
+                        "ResourceRecords": [{"Value": "127.0.0.1"}],
+                        "GeoLocation": {"ContinentCode": "EU"},
+                    },
+                },
+                {
+                    "Action": "CREATE",
+                    "ResourceRecordSet": {
+                        "Name": "georecord2.test.zone.",
+                        "Type": "A",
+                        "TTL": 10,
+                        "ResourceRecords": [{"Value": "127.0.0.2"}],
+                        "GeoLocation": {"CountryCode": "US", "SubdivisionCode": "NY"},
+                    },
+                },
+            ]
+        },
+    )
+
+    response = conn.list_resource_record_sets(HostedZoneId=hosted_zone_id)
+    rrs = response["ResourceRecordSets"]
+    rrs[0]["GeoLocation"].should.equal({"ContinentCode": "EU"})
+    rrs[1]["GeoLocation"].should.equal({"CountryCode": "US", "SubdivisionCode": "NY"})
+
+
 @mock_route53
 def test_change_resource_record_invalid():
     conn = boto3.client("route53", region_name="us-east-1")