Quellcode durchsuchen

Improved handling of dns array records

Nuwan Goonasekera vor 6 Jahren
Ursprung
Commit
aaf31e16e2

+ 2 - 2
cloudbridge/providers/aws/resources.py

@@ -1188,8 +1188,8 @@ class AWSDnsRecord(BaseDnsRecord):
 
     @property
     def data(self):
-        # We support only one value per record type
-        return self._dns_rec.get('ResourceRecords')[0].get('Value')
+        return [rec.get('Value') for rec in
+                self._dns_rec.get('ResourceRecords')]
 
     @property
     def ttl(self):

+ 11 - 8
cloudbridge/providers/aws/services.py

@@ -1393,8 +1393,7 @@ class AWSDnsRecordService(BaseDnsRecordService):
                 response = self.provider.dns.client.list_resource_record_sets(
                     HostedZoneId=dns_zone.id,
                     StartRecordName=rec_name,
-                    StartRecordType=rec_type,
-                    MaxItems='1')
+                    StartRecordType=rec_type)
                 return AWSDnsRecord(self.provider, dns_zone,
                                     response.get('ResourceRecordSets')[0])
             else:
@@ -1429,6 +1428,13 @@ class AWSDnsRecordService(BaseDnsRecordService):
         return ClientPagedResultList(self.provider, list(matches),
                                      limit=None, marker=None)
 
+    def _to_resource_records(self, data):
+        if isinstance(data, list):
+            records = data
+        else:
+            records = [data]
+        return [{'Value': r} for r in records]
+
     def create(self, dns_zone, name, type, data, ttl=None):
         AWSDnsRecord.assert_valid_resource_name(name)
 
@@ -1441,9 +1447,7 @@ class AWSDnsRecordService(BaseDnsRecordService):
                         'Name': name,
                         'Type': type,
                         'TTL': ttl or 300,
-                        'ResourceRecords': [{
-                            'Value': data
-                        }]
+                        'ResourceRecords': self._to_resource_records(data)
                     })
                 }]
             }
@@ -1466,9 +1470,8 @@ class AWSDnsRecordService(BaseDnsRecordService):
                         'Name': rec_name,
                         'Type': rec_type,
                         'TTL': record.ttl,
-                        'ResourceRecords': [{
-                            'Value': record.data
-                        }]
+                        'ResourceRecords': self._to_resource_records(
+                            record.data)
                     }
                 }]
             })

+ 1 - 2
cloudbridge/providers/gcp/resources.py

@@ -2074,8 +2074,7 @@ class GCPDnsRecord(BaseDnsRecord):
 
     @property
     def data(self):
-        # We support only one value per record type
-        return self._dns_rec.get('rrdatas')[0]
+        return self._dns_rec.get('rrdatas')
 
     @property
     def ttl(self):

+ 12 - 8
cloudbridge/providers/gcp/services.py

@@ -1719,12 +1719,19 @@ class GCPDnsRecordService(BaseDnsRecordService):
         return name + '.' if not name.endswith('.') else name
 
     def _standardize_record(self, value, type):
+        return (self._get_fully_qualified_dns(value)
+                if type in (DnsRecordType.CNAME, DnsRecordType.MX) else value)
+
+    def _to_resource_records(self, data, rec_type):
         """
         Converts a record to what GCP expects. For example, GCP
         expects a fully qualified name for all CNAME records.
         """
-        return (self._get_fully_qualified_dns(value)
-                if type == DnsRecordType.CNAME else value)
+        if isinstance(data, list):
+            records = data
+        else:
+            records = [data]
+        return [self._standardize_record(r, rec_type) for r in records]
 
     def get(self, dns_zone, rec_id):
         if rec_id and ":" in rec_id:
@@ -1782,9 +1789,7 @@ class GCPDnsRecordService(BaseDnsRecordService):
                     'name': self._get_fully_qualified_dns(name),
                     'type': type,
                     'ttl': ttl,
-                    'rrdatas': [
-                        self._standardize_record(data, type)
-                    ]
+                    'rrdatas': self._to_resource_records(data, type)
                 }
             ]
         }
@@ -1810,9 +1815,8 @@ class GCPDnsRecordService(BaseDnsRecordService):
                         'name': self._get_fully_qualified_dns(rec.name),
                         'type': rec.type,
                         'ttl': rec.ttl,
-                        'rrdatas': [
-                            self._standardize_record(rec.data, rec.type)
-                        ]
+                        'rrdatas': self._to_resource_records(
+                            rec.data, rec.type)
                     }
                 ]
             }

+ 12 - 1
tests/test_dns_service.py

@@ -66,5 +66,16 @@ class CloudDnsServiceTestCase(ProviderTestBase):
                     zone_name, DnsRecordType.CNAME, data='hello.com.', ttl=500)
                 self.assertEqual(test_rec.zone_id, test_zone.id)
                 self.assertEqual(test_rec.type, DnsRecordType.CNAME)
-                self.assertEqual(test_rec.data, 'hello.com.')
+                self.assertEqual(test_rec.data, ['hello.com.'])
                 self.assertEqual(test_rec.ttl, 500)
+
+            # Check setting data array
+            test_rec2 = None
+            with cb_helpers.cleanup_action(lambda: test_rec2.delete()):
+                MX_DATA = ['10 mx1.hello.com.', '20 mx2.hello.com.']
+                test_rec2 = test_zone.records.create(
+                    zone_name, DnsRecordType.MX, data=MX_DATA, ttl=300)
+                self.assertEqual(test_rec2.zone_id, test_zone.id)
+                self.assertEqual(test_rec2.type, DnsRecordType.MX)
+                self.assertSetEqual(set(test_rec2.data), set(MX_DATA))
+                self.assertEqual(test_rec2.ttl, 300)