Merge "Fix bug in recordset status"

This commit is contained in:
Zuul 2019-09-09 12:38:33 +00:00 committed by Gerrit Code Review
commit 9fb598b7d1
3 changed files with 77 additions and 10 deletions

View File

@ -69,14 +69,18 @@ class RecordSet(base.DesignateObject, base.DictObjectMixin,
@property @property
def status(self): def status(self):
# Return the worst status in order of ERROR, PENDING, ACTIVE # Return the worst status in order of ERROR, PENDING, ACTIVE, DELETED.
status = 'ACTIVE' status = None
statuses = {
'ERROR': 0,
'PENDING': 1,
'ACTIVE': 2,
'DELETED': 3,
}
for record in self.records: for record in self.records:
if (record.status == 'ERROR') or \ if not status or statuses[record.status] < statuses[status]:
(record.status == 'PENDING' and status != 'ERROR') or \
(status != 'PENDING'):
status = record.status status = record.status
return status return status or 'ACTIVE'
fields = { fields = {
'shard': fields.IntegerFields(nullable=True, minimum=0, maximum=4095), 'shard': fields.IntegerFields(nullable=True, minimum=0, maximum=4095),

View File

@ -14,7 +14,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import itertools import itertools
import unittest
import mock import mock
import oslotest.base import oslotest.base
@ -111,16 +110,16 @@ class RecordSetTest(oslotest.base.BaseTestCase):
) )
self.assertEqual('DELETE', record_set.action) self.assertEqual('DELETE', record_set.action)
@unittest.expectedFailure # bug
def test_status_error(self): def test_status_error(self):
statuses = ('ERROR', 'PENDING', 'ACTIVE') statuses = ('ERROR', 'PENDING', 'ACTIVE', 'DELETED')
for s1, s2, s3 in itertools.permutations(statuses): for s1, s2, s3, s4 in itertools.permutations(statuses):
record_set = objects.RecordSet( record_set = objects.RecordSet(
name='www.example.org.', type='A', name='www.example.org.', type='A',
records=objects.RecordList(objects=[ records=objects.RecordList(objects=[
objects.Record(data='192.0.2.1', status=s1), objects.Record(data='192.0.2.1', status=s1),
objects.Record(data='192.0.2.2', status=s2), objects.Record(data='192.0.2.2', status=s2),
objects.Record(data='192.0.2.3', status=s3), objects.Record(data='192.0.2.3', status=s3),
objects.Record(data='192.0.2.4', status=s4),
]) ])
) )
self.assertEqual(record_set.status, 'ERROR') self.assertEqual(record_set.status, 'ERROR')
@ -163,6 +162,57 @@ class RecordSetTest(oslotest.base.BaseTestCase):
) )
self.assertEqual('DELETED', record_set.status) self.assertEqual('DELETED', record_set.status)
def test_status_many_expect_error(self):
rs = objects.RecordSet(
name='www.example.org.', type='A',
records=objects.RecordList(objects=[
objects.Record(data='192.0.2.2', status='ACTIVE'),
objects.Record(data='192.0.2.3', status='DELETED'),
objects.Record(data='192.0.2.4', status='DELETED'),
objects.Record(data='192.0.2.5', status='DELETED'),
objects.Record(data='192.0.2.6', status='ACTIVE'),
objects.Record(data='192.0.2.7', status='ACTIVE'),
objects.Record(data='192.0.2.8', status='ERROR'),
objects.Record(data='192.0.2.9', status='ACTIVE'),
objects.Record(data='192.0.2.10', status='ACTIVE'),
])
)
self.assertEqual('ERROR', rs.status)
def test_status_many_expect_pending(self):
rs = objects.RecordSet(
name='www.example.org.', type='A',
records=objects.RecordList(objects=[
objects.Record(data='192.0.2.2', status='ACTIVE'),
objects.Record(data='192.0.2.3', status='DELETED'),
objects.Record(data='192.0.2.4', status='PENDING'),
objects.Record(data='192.0.2.5', status='DELETED'),
objects.Record(data='192.0.2.6', status='PENDING'),
objects.Record(data='192.0.2.7', status='ACTIVE'),
objects.Record(data='192.0.2.8', status='DELETED'),
objects.Record(data='192.0.2.9', status='PENDING'),
objects.Record(data='192.0.2.10', status='ACTIVE'),
])
)
self.assertEqual('PENDING', rs.status)
def test_status_many_expect_active(self):
rs = objects.RecordSet(
name='www.example.org.', type='A',
records=objects.RecordList(objects=[
objects.Record(data='192.0.2.2', status='ACTIVE'),
objects.Record(data='192.0.2.3', status='DELETED'),
objects.Record(data='192.0.2.4', status='DELETED'),
objects.Record(data='192.0.2.5', status='DELETED'),
objects.Record(data='192.0.2.6', status='ACTIVE'),
objects.Record(data='192.0.2.7', status='ACTIVE'),
objects.Record(data='192.0.2.8', status='DELETED'),
objects.Record(data='192.0.2.9', status='ACTIVE'),
objects.Record(data='192.0.2.10', status='ACTIVE'),
])
)
self.assertEqual('ACTIVE', rs.status)
def test_validate(self): def test_validate(self):
record_set = create_test_recordset() record_set = create_test_recordset()
record_set.validate() record_set.validate()

View File

@ -0,0 +1,13 @@
---
fixes:
- |
Fixed a bug with the recordset status implementation to make it report
its status more accurately.
A recordset will now always report its highest priority state when it
contains multiple records. The order of priority is,
`ERROR`, `PENDING`, `ACTIVE` and `DELETED`.
See `bug 1842994`_ for more information.
.. _bug 1842994: https://bugs.launchpad.net/designate/+bug/1842994