Fix handling of Pool NS changes

Closes-Bug: #1500798

Change-Id: Ie697f35a523a63617ba386f0dcde63600ce5dac6
This commit is contained in:
Endre Karlson 2015-09-29 19:50:32 +02:00
parent 78a83cca4a
commit c034c93086
2 changed files with 61 additions and 4 deletions

View File

@ -558,13 +558,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 [r for r in rs.records if r.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(

View File

@ -2571,6 +2571,54 @@ class CentralServiceTest(CentralTestCase):
self.assertEqual(set([n.hostname for n in pool.ns_records]),
set([n.data for n in ns_recordset.records]))
def test_update_pool_add_ns_record_with_existing_ns_in_zone(self):
# Create a server pool and domain
pool = self.create_pool(fixture=0)
domain = self.create_domain(pool_id=pool.id)
records = [
objects.Record(data="ns-1.example.com."),
objects.Record(data="ns-2.example.com.")
]
recordset = objects.RecordSet(
name="nsx.%s" % domain.name,
type="NS",
records=records
)
self.central_service.create_recordset(
self.admin_context, domain.id, recordset)
ns_record_count = len(pool.ns_records)
new_ns_record = objects.PoolNsRecord(
priority=10,
hostname='ns-new.example.org.')
# Update and save the pool
pool.ns_records.append(new_ns_record)
self.central_service.update_pool(self.admin_context, pool)
# Fetch the pool
pool = self.central_service.get_pool(self.admin_context, pool.id)
# Verify that the pool was updated correctly
self.assertEqual(ns_record_count + 1, len(pool.ns_records))
self.assertIn(new_ns_record.hostname,
[n.hostname for n in pool.ns_records])
# Fetch the domains NS recordset
ns_recordsets = self.central_service.find_recordsets(
self.admin_context,
criterion={'domain_id': domain.id, 'type': "NS"})
# It should have 2
self.assertEqual(2, len(ns_recordsets))
# Verify that the doamins NS records ware updated correctly
managed = [i for i in ns_recordsets if i.managed][0]
self.assertEqual(set([n.hostname for n in pool.ns_records]),
set([n.data for n in managed.records]))
def test_update_pool_remove_ns_record(self):
# Create a server pool and domain
pool = self.create_pool(fixture=0)