diff --git a/nova/api/metadata/vendordata_dynamic.py b/nova/api/metadata/vendordata_dynamic.py index db481225badf..7044caab1095 100644 --- a/nova/api/metadata/vendordata_dynamic.py +++ b/nova/api/metadata/vendordata_dynamic.py @@ -96,7 +96,7 @@ class DynamicVendorData(vendordata.VendorDataDriver): res = self.session.request(url, 'POST', data=jsonutils.dumps(body), verify=verify, headers=headers, timeout=timeout) - if res: + if res and res.text: # TODO(mikal): Use the Cache-Control response header to do some # sensible form of caching here. return jsonutils.loads(res.text) diff --git a/nova/tests/unit/test_identity.py b/nova/tests/unit/test_identity.py index ad75d86049f3..e2c12832cc6b 100644 --- a/nova/tests/unit/test_identity.py +++ b/nova/tests/unit/test_identity.py @@ -39,7 +39,11 @@ class FakeResponse(object): def __nonzero__(self): # python 2 - return self.status_code == 200 + return self.status_code < 400 + + @property + def text(self): + return self.content class IdentityValidationTest(test.NoDBTestCase): diff --git a/nova/tests/unit/test_metadata.py b/nova/tests/unit/test_metadata.py index f3f9a7f00587..a43c03c27205 100644 --- a/nova/tests/unit/test_metadata.py +++ b/nova/tests/unit/test_metadata.py @@ -54,6 +54,7 @@ from nova import test from nova.tests.unit.api.openstack import fakes from nova.tests.unit import fake_block_device from nova.tests.unit import fake_network +from nova.tests.unit import test_identity from nova.tests import uuidsentinel as uuids from nova import utils from nova.virt import netutils @@ -845,9 +846,10 @@ class OpenStackMetadataTestCase(test.TestCase): def _test_vendordata2_response_inner(self, request_mock, response_code, include_rest_result=True): - request_mock.return_value.status_code = response_code + fake_response = test_identity.FakeResponse(response_code) if include_rest_result: - request_mock.return_value.text = '{"color": "blue"}' + fake_response.content = '{"color": "blue"}' + request_mock.return_value = fake_response with utils.tempdir() as tmpdir: jsonfile = os.path.join(tmpdir, 'test.json') @@ -905,6 +907,8 @@ class OpenStackMetadataTestCase(test.TestCase): @mock.patch.object(session.Session, 'request') def test_vendor_data_response_vendordata2_no_content(self, request_mock): + # Make it a failure if no content was returned and we don't handle it. + self.flags(vendordata_dynamic_failure_fatal=True, group='api') self._test_vendordata2_response_inner(request_mock, requests.codes.NO_CONTENT, include_rest_result=False)