diff --git a/osc_placement/tests/functional/base.py b/osc_placement/tests/functional/base.py index 49ebc4d..a40c291 100644 --- a/osc_placement/tests/functional/base.py +++ b/osc_placement/tests/functional/base.py @@ -80,7 +80,8 @@ class BaseTestCase(base.BaseTestCase): for name in RESET_LOGGING: logging.getLogger(name).setLevel(logging.WARNING) - def openstack(self, cmd, may_fail=False, use_json=False): + def openstack(self, cmd, may_fail=False, use_json=False, + may_print_to_stderr=False): to_exec = [] # Make all requests as a noauth admin user. to_exec += [ @@ -110,17 +111,30 @@ class BaseTestCase(base.BaseTestCase): except SystemExit as exc: return_code = exc.code + # We may have error/warning messages in stderr, so treat it + # separately from the stdout. + output = self.output.getvalue() + error = self.error.getvalue() + if return_code: - msg = 'Command: "%s"\noutput: %s' % (' '.join(to_exec), - self.error.getvalue()) + msg = 'Command: "%s"\noutput: %s' % (' '.join(to_exec), error) if not may_fail: raise CommandException(msg, cmd=' '.join(to_exec)) - output = self.output.getvalue() + self.error.getvalue() if use_json and output: - return json.loads(output) - else: - return output + output = json.loads(output) + + if may_print_to_stderr: + return output, error + + if error: + msg = ('Test code error - The command did not fail but it ' + 'has a warning message. Set the "may_print_to_stderr" ' + 'argument to true to get and validate the message:\n' + 'Command: "%s"\nstderr: %s') % ( + ' '.join(to_exec), error) + raise CommandException(msg, cmd=' '.join(to_exec)) + return output def rand_name(self, name='', prefix=None): """Generate a random name that includes a random number @@ -221,7 +235,7 @@ class BaseTestCase(base.BaseTestCase): def resource_allocation_set(self, consumer_uuid, allocations, project_id=None, user_id=None, - use_json=True): + use_json=True, may_print_to_stderr=False): cmd = 'resource provider allocation set {allocs} {uuid}'.format( uuid=consumer_uuid, allocs=' '.join('--allocation {}'.format(a) for a in allocations) @@ -230,7 +244,8 @@ class BaseTestCase(base.BaseTestCase): cmd += ' --project-id %s' % project_id if user_id: cmd += ' --user-id %s' % user_id - result = self.openstack(cmd, use_json=use_json) + result = self.openstack(cmd, use_json=use_json, + may_print_to_stderr=may_print_to_stderr) def cleanup(uuid): try: diff --git a/osc_placement/tests/functional/test_allocation.py b/osc_placement/tests/functional/test_allocation.py index bd2b5bd..68d06d5 100644 --- a/osc_placement/tests/functional/test_allocation.py +++ b/osc_placement/tests/functional/test_allocation.py @@ -54,17 +54,22 @@ class TestAllocation(base.BaseTestCase): self.assertEqual(expected, retrieved_alloc) # Test that specifying --project-id and --user-id before microversion - # 1.8 does not result in an error (they will be ignored). We have - # to specify use_json=False because there will be a warning in the - # output which can't be json-decoded. - output = self.resource_allocation_set( + # 1.8 does not result in an error but display a warning. + output, warning = self.resource_allocation_set( consumer_uuid, ['rp={},VCPU=2'.format(self.rp1['uuid']), 'rp={},MEMORY_MB=512'.format(self.rp1['uuid'])], - project_id='fake-project', user_id='fake-user', use_json=False) + project_id='fake-project', user_id='fake-user', + may_print_to_stderr=True) + expected = [ + {'resource_provider': self.rp1['uuid'], + 'generation': 3, + 'resources': {'VCPU': 2, 'MEMORY_MB': 512}} + ] + self.assertEqual(expected, output) self.assertIn( '--project-id and --user-id options do not affect allocation for ' - '--os-placement-api-version less than 1.8', output) + '--os-placement-api-version less than 1.8', warning) def test_allocation_create_empty(self): consumer_uuid = str(uuid.uuid4())