From bb5748ae9fecb9c826e023abb08c451423f1752c Mon Sep 17 00:00:00 2001 From: Kiall Mac Innes Date: Thu, 7 May 2015 17:02:17 +0100 Subject: [PATCH] Ensure Sink Handlers encode UTF8 names Change-Id: I17084a38e5b71414aa8d84c1f98bc246d5cc8690 --- designate/notification_handler/base.py | 2 + .../test_notification_handler/test_nova.py | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/designate/notification_handler/base.py b/designate/notification_handler/base.py index 185b5a65e..f43985aad 100644 --- a/designate/notification_handler/base.py +++ b/designate/notification_handler/base.py @@ -66,6 +66,8 @@ class NotificationHandler(ExtensionPlugin): def _find_or_create_recordset(self, context, domain_id, name, type, ttl=None): + name = name.encode('idna') + try: recordset = self.central_api.find_recordset(context, { 'domain_id': domain_id, diff --git a/designate/tests/test_notification_handler/test_nova.py b/designate/tests/test_notification_handler/test_nova.py index f8c978081..0f444ce68 100644 --- a/designate/tests/test_notification_handler/test_nova.py +++ b/designate/tests/test_notification_handler/test_nova.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # Copyright 2012 Managed I.T. # # Author: Kiall Mac Innes @@ -59,6 +60,44 @@ class NovaFixedHandlerTest(TestCase, NotificationHandlerMixin): self.assertEqual(3, len(records)) + def test_instance_create_end_utf8(self): + self.config(format='%(display_name)s.%(domain)s', + group='handler:nova_fixed') + + event_type = 'compute.instance.create.end' + fixture = self.get_notification_fixture('nova', event_type) + + # Set the instance display_name to a string containing UTF8. + fixture['payload']['display_name'] = u'Test↟Instance' + + self.assertIn(event_type, self.plugin.get_event_types()) + + criterion = {'domain_id': self.domain_id} + + # Ensure we start with 2 records + recordsets = self.central_service.find_recordsets( + self.admin_context, criterion) + + # Should only be SOA and NS recordsets + self.assertEqual(2, len(recordsets)) + + self.plugin.process_notification( + self.admin_context, event_type, fixture['payload']) + + # Ensure we now have exactly 1 more recordset + recordsets = self.central_service.find_recordsets( + self.admin_context, criterion) + + self.assertEqual(3, len(recordsets)) + + # Ensure the created record was correctly converted per IDN rules. + criterion['type'] = 'A' + recordsets = self.central_service.find_recordsets( + self.admin_context, criterion) + + self.assertEqual('xn--testinstance-q83g.example.com.', + recordsets[0].name) + def test_instance_delete_start(self): # Prepare for the test start_event_type = 'compute.instance.create.end'