From 7d435707417a795e4e02460c35948876ee23e4f0 Mon Sep 17 00:00:00 2001 From: Tim Simmons Date: Fri, 13 May 2016 16:25:01 +0100 Subject: [PATCH] Type checking in pool manager target sync When this was originally written, zone.created_at was a string as a result of some oslo.messaging logic, at some time this has changed to a proper datetime object. This handles both situations. Change-Id: I561a21f5b9ffb22cb7ab84297d1029ea8505cda1 --- designate/pool_manager/service.py | 15 ++++++++--- .../unit/test_pool_manager/test_service.py | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/designate/pool_manager/service.py b/designate/pool_manager/service.py index 00d121422..4f77189ed 100644 --- a/designate/pool_manager/service.py +++ b/designate/pool_manager/service.py @@ -343,6 +343,15 @@ class Service(service.RPCService, coordination.CoordinationMixin, timestamp_dt = datetime.fromtimestamp(timestamp) for zone in zones: + if isinstance(zone.created_at, datetime): + zone_created_at = zone.created_at + elif isinstance(zone.created_at, str): + zone_created_at = datetime.strptime(zone.created_at, + "%Y-%m-%dT%H:%M:%S.%f") + else: + raise Exception("zone.created_at is of type %s" % + str(type(zone.created_at))) + if zone.status == 'DELETED': # Remove any other ops for this zone for zone_op in zone_ops: @@ -350,11 +359,9 @@ class Service(service.RPCService, coordination.CoordinationMixin, zone_ops.remove(zone_op) # If the zone was created before the timestamp delete it, # otherwise, it will just never be created - if (datetime.strptime(zone.created_at, "%Y-%m-%dT%H:%M:%S.%f") - <= timestamp_dt): + if (zone_created_at <= timestamp_dt): zone_ops.append((zone, 'DELETE')) - elif (datetime.strptime(zone.created_at, "%Y-%m-%dT%H:%M:%S.%f") > - timestamp_dt): + elif (zone_created_at > timestamp_dt): # If the zone was created after the timestamp for zone_op in zone_ops: if ( diff --git a/designate/tests/unit/test_pool_manager/test_service.py b/designate/tests/unit/test_pool_manager/test_service.py index 36e280875..d51a1fdae 100644 --- a/designate/tests/unit/test_pool_manager/test_service.py +++ b/designate/tests/unit/test_pool_manager/test_service.py @@ -18,6 +18,7 @@ Unit tests """ import unittest +from datetime import datetime from mock import call from mock import Mock @@ -233,6 +234,32 @@ class PoolManagerTest(test.BaseTestCase): self.assertEqual(3, self.pm.update_zone.call_count) + @patch.object(pm_module.DesignateContext, 'get_admin_context') + def test_target_sync(self, mock_get_ctx, *mocks): + mock_ctx = mock_get_ctx.return_value + date = 1463154200 + older_date = datetime.fromtimestamp(1463154000) + newer_date = datetime.fromtimestamp(1463154300) + + zones = [ + RwObject(name='a_zone', status='ACTIVE', created_at=older_date), + RwObject(name='b_zone', status='ACTIVE', created_at=newer_date), + RwObject(name='c_zone', status='DELETED', created_at=older_date, + serial=1), + ] + + self.pm._delete_zone_on_target = Mock() + self.pm._create_zone_on_target = Mock() + self.pm._update_zone_on_target = Mock() + self.pm.mdns_api.poll_for_serial_number = Mock() + target = Mock() + + self.pm._target_sync(mock_ctx, zones, target, date) + + self.assertEqual(1, self.pm._delete_zone_on_target.call_count) + self.assertEqual(1, self.pm._create_zone_on_target.call_count) + self.assertEqual(1, self.pm._update_zone_on_target.call_count) + @patch.object(pm_module.DesignateContext, 'get_admin_context') def test_create_zone(self, mock_get_ctx, *mocks): z = RwObject(name='a_zone', serial=1)