resource error logging that is easier to understand

Log what a suite requested, what it has reserved and the complete resource
state.

Change-Id: Ic6887bbe5fe74a73f0e344cd4078dd7ed989cc15
This commit is contained in:
Neels Hofmeyr 2017-05-22 20:02:41 +02:00 committed by Neels Hofmeyr
parent 927344b4dc
commit 2d1d561eeb
2 changed files with 20 additions and 2 deletions

View File

@ -463,8 +463,9 @@ class ReservedResources(log.Origin):
available = available_dict.get(kind)
self.dbg(available=len(available))
if not available:
raise NoResourceExn('No unused resource found: %r%s' %
raise NoResourceExn('When trying to reserve %r nr %d: No unused resource found%s' %
(kind,
self.count(kind) + 1,
(' matching %r' % specifics) if specifics else '')
)
pick = available[0]
@ -496,5 +497,13 @@ class ReservedResources(log.Origin):
self.resources_pool.free(self.origin, self.reserved)
self.reserved = None
def counts(self):
counts = {}
for key in self.reserved.keys():
counts[key] = self.count(key)
return counts
def count(self, key):
return len(self.reserved.get(key) or [])
# vim: expandtab tabstop=4 shiftwidth=4

View File

@ -22,6 +22,7 @@ import sys
import time
import copy
import traceback
import pprint
from . import config, log, template, util, resource, schema, ofono_client, osmo_nitb, event_loop
from . import test
@ -130,7 +131,8 @@ class Test(log.Origin):
ftype = type(e).__name__
fmsg = repr(e) + '\n' + traceback.format_exc().rstrip()
if isinstance(e, resource.NoResourceExn):
fmsg += '\n' + 'Current resource state:\n' + repr(suite_run.reserved_resources)
fmsg += suite_run.resource_status_str()
self.set_fail(ftype, fmsg, False)
finally:
@ -314,6 +316,13 @@ class SuiteRun(log.Origin):
self.log('prompt entered:', repr(entered))
return entered
def resource_status_str(self):
return '\n'.join(('',
'SUITE RUN: %s' % self.origin_id(),
'ASKED FOR:', pprint.pformat(self._resource_requirements),
'RESERVED COUNT:', pprint.pformat(self.reserved_resources.counts()),
'RESOURCES STATE:', repr(self.reserved_resources)))
loaded_suite_definitions = {}
def load(suite_name):