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:
@@ -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
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user