Port designate code to Python 3

* Replace map() with list-comprehension to get a list on Python 3.
* Unicode dance: encode text to UTF-8 for MD5, decode Base32 from
  ASCII to get text.
* tox.ini: test_designate_driver and test_datastore_versions to
  Python 3.4

Partially implements: blueprint trove-python3
Change-Id: I1aa5387908b3f108487ed731cee5f7d9bbfd7d69
This commit is contained in:
Victor Stinner 2016-05-02 21:17:17 +02:00
parent 79f350852e
commit bdf664bbdf
4 changed files with 21 additions and 5 deletions

View File

@ -40,7 +40,10 @@ commands =
trove/tests/unittests/common/test_stream_codecs.py \ trove/tests/unittests/common/test_stream_codecs.py \
trove/tests/unittests/common/test_template.py \ trove/tests/unittests/common/test_template.py \
trove/tests/unittests/common/test_utils.py \ trove/tests/unittests/common/test_utils.py \
trove/tests/unittests/common/test_wsgi.py trove/tests/unittests/common/test_wsgi.py \
trove/tests/unittests/datastore/test_datastore_versions.py \
trove/tests/unittests/dns/test_designate_driver.py
[testenv:debug] [testenv:debug]
commands = oslo_debug_helper {posargs} commands = oslo_debug_helper {posargs}

View File

@ -131,7 +131,7 @@ class Capabilities(object):
# right back. # right back.
return cap return cap
self.capabilities = map(override, capability_defaults) self.capabilities = [override(obj) for obj in capability_defaults]
LOG.debug('Capabilities for datastore %(ds_id)s: %(capabilities)s' % LOG.debug('Capabilities for datastore %(ds_id)s: %(capabilities)s' %
{'ds_id': self.datastore_version_id, {'ds_id': self.datastore_version_id,

View File

@ -23,6 +23,8 @@ import hashlib
from designateclient.v1 import Client from designateclient.v1 import Client
from designateclient.v1.records import Record from designateclient.v1.records import Record
from oslo_log import log as logging from oslo_log import log as logging
from oslo_utils import encodeutils
import six
from trove.common import cfg from trove.common import cfg
from trove.common import exception from trove.common import exception
@ -142,7 +144,11 @@ class DesignateInstanceEntryFactory(driver.DnsInstanceEntryFactory):
def create_entry(self, instance_id): def create_entry(self, instance_id):
zone = DesignateDnsZone(id=DNS_DOMAIN_ID, name=DNS_DOMAIN_NAME) zone = DesignateDnsZone(id=DNS_DOMAIN_ID, name=DNS_DOMAIN_NAME)
# Constructing the hostname by hashing the instance ID. # Constructing the hostname by hashing the instance ID.
name = base64.b32encode(hashlib.md5(instance_id).digest())[:11].lower() name = encodeutils.to_utf8(instance_id)
name = hashlib.md5(name).digest()
name = base64.b32encode(name)[:11].lower()
if six.PY3:
name = name.decode('ascii')
hostname = ("%s.%s" % (name, zone.name)) hostname = ("%s.%s" % (name, zone.name))
# Removing the leading dot if present # Removing the leading dot if present
if hostname.endswith('.'): if hostname.endswith('.'):

View File

@ -18,6 +18,7 @@ from designateclient.v1.domains import Domain
from designateclient.v1.records import Record from designateclient.v1.records import Record
from mock import MagicMock from mock import MagicMock
from mock import patch from mock import patch
import six
from trove.dns.designate import driver from trove.dns.designate import driver
from trove.tests.unittests import trove_testtools from trove.tests.unittests import trove_testtools
@ -185,7 +186,10 @@ class DesignateInstanceEntryFactoryTest(trove_testtools.TestCase):
driver.DNS_DOMAIN_ID = '00000000-0000-0000-0000-000000000000' driver.DNS_DOMAIN_ID = '00000000-0000-0000-0000-000000000000'
driver.DNS_DOMAIN_NAME = 'trove.com' driver.DNS_DOMAIN_NAME = 'trove.com'
driver.DNS_TTL = 3600 driver.DNS_TTL = 3600
hashed_id = base64.b32encode(hashlib.md5(instance_id).digest()) hashed_id = hashlib.md5(instance_id.encode()).digest()
hashed_id = base64.b32encode(hashed_id)
if six.PY3:
hashed_id = hashed_id.decode('ascii')
hashed_id_concat = hashed_id[:11].lower() hashed_id_concat = hashed_id[:11].lower()
exp_hostname = ("%s.%s" % (hashed_id_concat, driver.DNS_DOMAIN_NAME)) exp_hostname = ("%s.%s" % (hashed_id_concat, driver.DNS_DOMAIN_NAME))
factory = driver.DesignateInstanceEntryFactory() factory = driver.DesignateInstanceEntryFactory()
@ -202,7 +206,10 @@ class DesignateInstanceEntryFactoryTest(trove_testtools.TestCase):
driver.DNS_DOMAIN_ID = '00000000-0000-0000-0000-000000000000' driver.DNS_DOMAIN_ID = '00000000-0000-0000-0000-000000000000'
driver.DNS_DOMAIN_NAME = 'trove.com.' driver.DNS_DOMAIN_NAME = 'trove.com.'
driver.DNS_TTL = 3600 driver.DNS_TTL = 3600
hashed_id = base64.b32encode(hashlib.md5(instance_id).digest()) hashed_id = hashlib.md5(instance_id.encode()).digest()
hashed_id = base64.b32encode(hashed_id)
if six.PY3:
hashed_id = hashed_id.decode('ascii')
hashed_id_concat = hashed_id[:11].lower() hashed_id_concat = hashed_id[:11].lower()
exp_hostname = ("%s.%s" % exp_hostname = ("%s.%s" %
(hashed_id_concat, driver.DNS_DOMAIN_NAME))[:-1] (hashed_id_concat, driver.DNS_DOMAIN_NAME))[:-1]