Fix issues with byte encoded strings
If byte encoded strings are passed to the ovirt SDK. We get the error outlined here: https://bugzilla.redhat.com/show_bug.cgi?id=1924928 This change leaves the string validation in place, but passes while raising a warning. Ultimately, non-encoded strings are provided to ovirt SDK to prevent the mentioned issue. Change-Id: I8e62a650ebae974017e17342ec17aa61ba67eed9
This commit is contained in:
parent
34f96a4a53
commit
4c8d3162f2
@ -133,20 +133,21 @@ def _getvm(driver_info):
|
|||||||
password = driver_info['ovirt_password']
|
password = driver_info['ovirt_password']
|
||||||
insecure = driver_info['ovirt_insecure']
|
insecure = driver_info['ovirt_insecure']
|
||||||
ca_file = driver_info['ovirt_ca_file']
|
ca_file = driver_info['ovirt_ca_file']
|
||||||
name = str.encode(
|
name = driver_info['ovirt_vm_name']
|
||||||
driver_info['ovirt_vm_name'], encoding='ascii', errors='ignore')
|
|
||||||
url = "https://%s/ovirt-engine/api" % address
|
url = "https://%s/ovirt-engine/api" % address
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# pycurl.Curl.setopt doesn't support unicode strings,
|
# pycurl.Curl.setopt doesn't support unicode strings,
|
||||||
# attempt to turn `url` into an all-ASCII string;
|
# attempt to turn variables into an all-ASCII string;
|
||||||
# in Python 3.x setopt accepts bytes as it should.
|
# in Python 3.x setopt accepts bytes as it should.
|
||||||
url = str.encode(url, encoding='ascii', errors='strict')
|
str.encode(url, encoding='ascii', errors='strict')
|
||||||
|
|
||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
LOG.warning("oVirt URL '%(url)s' contains non-ascii characters, "
|
LOG.exception("oVirt SDK does not accept non-ascii "
|
||||||
"that might cause pycurl to explode "
|
"characters. A non-ascii character has "
|
||||||
"momentarily", {'url': url})
|
"been provided for: {}".format(url))
|
||||||
|
raise staging_exception.OVirtError("Unicode values "
|
||||||
|
"are not valid")
|
||||||
try:
|
try:
|
||||||
connection = sdk.Connection(url=url, username=username,
|
connection = sdk.Connection(url=url, username=username,
|
||||||
password=password, insecure=insecure,
|
password=password, insecure=insecure,
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
"""Test class for oVirt driver module."""
|
"""Test class for oVirt driver module."""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
import testtools
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
from ironic.common import boot_devices
|
from ironic.common import boot_devices
|
||||||
@ -23,6 +24,7 @@ from ironic.tests.unit.db import base as db_base
|
|||||||
from ironic.tests.unit.objects import utils as obj_utils
|
from ironic.tests.unit.objects import utils as obj_utils
|
||||||
|
|
||||||
from ironic_staging_drivers.ovirt import ovirt as ovirt_power
|
from ironic_staging_drivers.ovirt import ovirt as ovirt_power
|
||||||
|
from ironic_staging_drivers.common import exception as staging_exception
|
||||||
|
|
||||||
|
|
||||||
def _ovirt_info():
|
def _ovirt_info():
|
||||||
@ -64,11 +66,11 @@ class OVirtDriverTestCase(db_base.DbTestCase):
|
|||||||
with ovirt_power._getvm(driver_info):
|
with ovirt_power._getvm(driver_info):
|
||||||
ovirt_power.sdk.Connection.assert_called_with(
|
ovirt_power.sdk.Connection.assert_called_with(
|
||||||
ca_file=None, insecure='False', password='changeme',
|
ca_file=None, insecure='False', password='changeme',
|
||||||
url=b'https://127.0.0.1/ovirt-engine/api',
|
url='https://127.0.0.1/ovirt-engine/api',
|
||||||
username='jhendrix@internal'
|
username='jhendrix@internal'
|
||||||
)
|
)
|
||||||
url = ovirt_power.sdk.Connection.mock_calls[0][-1]['url']
|
url = ovirt_power.sdk.Connection.mock_calls[0][-1]['url']
|
||||||
self.assertIsInstance(url, bytes)
|
self.assertIsInstance(url, str)
|
||||||
|
|
||||||
ovirt_power.sdk.Connection.return_value.close.assert_called()
|
ovirt_power.sdk.Connection.return_value.close.assert_called()
|
||||||
|
|
||||||
@ -77,15 +79,10 @@ class OVirtDriverTestCase(db_base.DbTestCase):
|
|||||||
self.node['driver_info']['ovirt_address'] = u'host\u20141'
|
self.node['driver_info']['ovirt_address'] = u'host\u20141'
|
||||||
driver_info = ovirt_power._parse_driver_info(self.node)
|
driver_info = ovirt_power._parse_driver_info(self.node)
|
||||||
|
|
||||||
with ovirt_power._getvm(driver_info):
|
with testtools.ExpectedException(staging_exception.OVirtError):
|
||||||
ovirt_power.sdk.Connection.assert_called_with(
|
with ovirt_power._getvm(driver_info):
|
||||||
ca_file=None, insecure='False', password='changeme',
|
pass
|
||||||
url=u'https://host\u20141/ovirt-engine/api',
|
ovirt_power.sdk.Connection.call_count = 0
|
||||||
username='jhendrix@internal'
|
|
||||||
)
|
|
||||||
url = ovirt_power.sdk.Connection.mock_calls[0][-1]['url']
|
|
||||||
self.assertIsInstance(url, str)
|
|
||||||
ovirt_power.sdk.Connection.return_value.close.assert_called()
|
|
||||||
|
|
||||||
def test_get_properties(self):
|
def test_get_properties(self):
|
||||||
expected = list(ovirt_power.PROPERTIES.keys())
|
expected = list(ovirt_power.PROPERTIES.keys())
|
||||||
|
Loading…
Reference in New Issue
Block a user