Type conflict in trusted_filter.py using attestation_port default value

When trusted filter (nova/nova/scheduler/filters/trusted_filter.py)
in nova scheduler is running with default value of attestation_port:

default='8443'

method _do_request() in AttestationService class has this line:

action_url = "https://%s:%d%s/%s" % (self.host,
self.port, self.api_url, action_url)

It is easy to see that default type of attestation_port is string.
But in action_url self.port is required as integer (%d).
It leads to conflict.

This change provides more tests than is required only to cover this bug
fix. This cases are testing AttestationService _do_request() method
using different status_codes and different texts returned by mocked
request method.

Change-Id: I1ad57b5bd1986360416948fd00dec22456dc29a7
Closes-Bug: #1381468
This commit is contained in:
Bartosz Fic
2014-11-17 12:04:59 +01:00
parent 2efc2a174b
commit fdcf358eae
2 changed files with 68 additions and 2 deletions

View File

@@ -105,7 +105,7 @@ class AttestationService(object):
# :returns: result data
# :raises: IOError if the request fails
action_url = "https://%s:%d%s/%s" % (self.host, self.port,
action_url = "https://%s:%s%s/%s" % (self.host, self.port,
self.api_url, action_url)
try:
res = requests.request(method, action_url, data=body,
@@ -119,7 +119,7 @@ class AttestationService(object):
requests.codes.NO_CONTENT):
try:
return requests.codes.OK, jsonutils.loads(res.text)
except ValueError:
except (TypeError, ValueError):
return requests.codes.OK, res.text
return status_code, None

View File

@@ -12,6 +12,7 @@
import mock
from oslo.config import cfg
from oslo.serialization import jsonutils
from oslo.utils import timeutils
import requests
@@ -22,6 +23,71 @@ from nova.tests.unit.scheduler import fakes
CONF = cfg.CONF
class AttestationServiceTestCase(test.NoDBTestCase):
def setUp(self):
super(AttestationServiceTestCase, self).setUp()
self.api_url = '/OpenAttestationWebServices/V1.0'
self.host = 'localhost'
self.port = '8443'
self.statuses = (requests.codes.OK, requests.codes.CREATED,
requests.codes.ACCEPTED, requests.codes.NO_CONTENT)
@mock.patch.object(requests, 'request')
def test_do_request_possible_statuses(self, request_mock):
"""This test case checks if '_do_request()' method returns
appropriate status_code (200) and result (text converted to json),
while status_code returned by request is in one of fourth eligible
statuses
"""
for status_code in self.statuses:
request_mock.return_value.status_code = status_code
request_mock.return_value.text = '{"test": "test"}'
attestation_service = trusted_filter.AttestationService()
status, result = attestation_service._do_request(
'POST', 'PollHosts', {}, {})
self.assertEqual(requests.codes.OK, status)
self.assertEqual(jsonutils.loads(request_mock.return_value.text),
result)
@mock.patch.object(requests, 'request')
def test_do_request_other_status(self, request_mock):
"""This test case checks if '_do_request()' method returns
appropriate status (this returned by request method) and result
(None), while status_code returned by request is not in one of fourth
eligible statuses
"""
request_mock.return_value.status_code = requests.codes.NOT_FOUND
request_mock.return_value.text = '{"test": "test"}'
attestation_service = trusted_filter.AttestationService()
status, result = attestation_service._do_request(
'POST', 'PollHosts', {}, {})
self.assertEqual(requests.codes.NOT_FOUND, status)
self.assertIsNone(result)
@mock.patch.object(requests, 'request')
def test_do_request_unconvertible_text(self, request_mock):
for status_code in self.statuses:
# this unconvertible_texts leads to TypeError and ValueError
# in jsonutils.loads(res.text) in _do_request() method
for unconvertible_text in ({"test": "test"}, '{}{}'):
request_mock.return_value.status_code = status_code
request_mock.return_value.text = unconvertible_text
attestation_service = trusted_filter.AttestationService()
status, result = attestation_service._do_request(
'POST', 'PollHosts', {}, {})
self.assertEqual(requests.codes.OK, status)
self.assertEqual(unconvertible_text, result)
@mock.patch.object(trusted_filter.AttestationService, '_request')
class TestTrustedFilter(test.NoDBTestCase):