diff --git a/designate/central/service.py b/designate/central/service.py index 7c0412c59..c0cde389a 100644 --- a/designate/central/service.py +++ b/designate/central/service.py @@ -609,13 +609,22 @@ class Service(service.RPCService, service.Service): def _add_ns(self, context, zone, ns_record): # Get NS recordset # If the zone doesn't have an NS recordset yet, create one - try: - ns_recordset = self.find_recordset( - context, criterion={'domain_id': zone['id'], 'type': "NS"}) + recordsets = self.find_recordsets( + context, criterion={'domain_id': zone['id'], 'type': "NS"} + ) - except exceptions.RecordSetNotFound: + managed = [] + for rs in recordsets: + if rs.managed: + managed.append(rs) + + if len(managed) == 0: self._create_ns(context, zone, [ns_record]) return + elif len(managed) != 1: + raise exceptions.RecordSetNotFound("No valid recordset found") + + ns_recordset = managed[0] # Add new record to recordset based on the new nameserver ns_recordset.records.append( diff --git a/designate/tests/unit/test_central/test_basic.py b/designate/tests/unit/test_central/test_basic.py index 42c90b904..a67638617 100644 --- a/designate/tests/unit/test_central/test_basic.py +++ b/designate/tests/unit/test_central/test_basic.py @@ -677,9 +677,11 @@ class CentralDomainTestCase(CentralBasic): def test__add_ns_creation(self): self.service._create_ns = Mock() - self.service.find_recordset = Mock( - side_effect=exceptions.RecordSetNotFound + + self.service.find_recordsets = Mock( + return_value=[] ) + self.service._add_ns( self.context, RoObject(id='1'), @@ -690,9 +692,37 @@ class CentralDomainTestCase(CentralBasic): def test__add_ns(self): self.service._update_recordset_in_storage = Mock() - self.service.find_recordset = Mock( - return_value=RoObject(records=[]) + + recordsets = [ + RoObject(records=[], managed=True) + ] + self.service.find_recordsets = Mock( + return_value=recordsets ) + + self.service._add_ns( + self.context, + RoObject(id='1'), + RoObject(name='bar') + ) + ctx, zone, rset = \ + self.service._update_recordset_in_storage.call_args[0] + self.assertEqual(len(rset.records), 1) + self.assertTrue(rset.records[0].managed) + self.assertEqual(rset.records[0].data.name, 'bar') + + def test__add_ns_with_other_ns_rs(self): + self.service._update_recordset_in_storage = Mock() + + recordsets = [ + RoObject(records=[], managed=True), + RoObject(records=[], managed=False) + ] + + self.service.find_recordsets = Mock( + return_value=recordsets + ) + self.service._add_ns( self.context, RoObject(id='1'),