Add html reports to report action in coverage extension.

This makes a few minor cleanups and 2 additions to the
coverage extension. First, it adds a new optional field to the
report action: 'html'. This will generate an html report instead
of either the text or xml reports that the extension can
generate.

The second change is that it adds a return for the stop action.
Now upon successful completion of the stop action the directory
where the coverage data files will be returned.

Change-Id: If1aa25fc7237e9bb5100d2a4a8e560f0a68eba61
This commit is contained in:
Matthew Treinish 2012-12-20 11:56:04 -05:00
parent 2655ac9f3c
commit ce9867b3fa
7 changed files with 32 additions and 7 deletions

View File

@ -0,0 +1,3 @@
{
"path": "/tmp/tmpua9HvB/nova-coverage_rs2CaS"
}

View File

@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<path>/tmp/tmpCLve38/nova-coverage_GJ4BZ_</path>

View File

@ -71,7 +71,6 @@ class CoverageController(object):
"network": self.network_api.get_backdoor_port,
}
ports = []
temp = {}
#TODO(mtreinish): Figure out how to bind the backdoor socket to 0.0.0.0
# Currently this will only work if the host is resolved as loopback on
# the same host as api-server
@ -110,7 +109,7 @@ class CoverageController(object):
def _start_coverage(self, req, body):
'''Begin recording coverage information.'''
LOG.debug("Coverage begin")
LOG.debug(_("Coverage begin"))
body = body['start']
self.combine = False
if 'combine' in body.keys():
@ -144,8 +143,9 @@ class CoverageController(object):
for service in self.services:
self._stop_coverage_telnet(service['telnet'])
if self._check_coverage():
msg = ("Coverage not running")
msg = _("Coverage not running")
raise exc.HTTPNotFound(explanation=msg)
return {'path': self.data_path}
def _report_coverage_telnet(self, tn, path, xml=False):
if xml:
@ -165,26 +165,34 @@ class CoverageController(object):
def _report_coverage(self, req, body):
self._stop_coverage(req)
xml = False
html = False
path = None
body = body['report']
if 'file' in body.keys():
path = body['file']
if path != os.path.basename(path):
msg = ("Invalid path")
msg = _("Invalid path")
raise exc.HTTPBadRequest(explanation=msg)
path = os.path.join(self.data_path, path)
else:
msg = ("No path given for report file")
msg = _("No path given for report file")
raise exc.HTTPBadRequest(explanation=msg)
if 'xml' in body.keys():
xml = body['xml']
elif 'html' in body.keys():
if not self.combine:
msg = _("You can't use html reports without combining")
raise exc.HTTPBadRequest(explanation=msg)
html = body['html']
if self.combine:
self.coverInst.combine()
if xml:
self.coverInst.xml_report(outfile=path)
elif html:
self.coverInst.html_report(directory=path)
else:
output = open(path, 'w')
self.coverInst.report(file=output)

View File

@ -90,6 +90,8 @@ class CoverageExtensionTest(test.TestCase):
res = req.get_response(fakes.wsgi_app(
fake_auth_context=self.admin_context))
self.assertEqual(res.status_int, 200)
resp_dict = jsonutils.loads(res.body)
self.assertTrue('path' in resp_dict)
def test_report_coverage_action_file(self):
self.stubs.Set(coverage_ext.CoverageController,
@ -180,7 +182,7 @@ class CoverageExtensionTest(test.TestCase):
self.assertEqual(res.status_int, 404)
def test_report_coverage_action_nostart(self):
body = {'stop': {}}
body = {'report': {}}
req = webob.Request.blank('/v2/fake/os-coverage/action')
req.method = "POST"
req.body = jsonutils.dumps(body)

View File

@ -0,0 +1,3 @@
{
"path" : "%(path)s"
}

View File

@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<path>%(path)s</path>

View File

@ -753,10 +753,15 @@ class CoverageExtJsonTests(ApiSampleTestBase):
def test_stop_coverage(self):
"""Stop coverage data collection"""
subs = {}
subs = {
'path': '/.*',
}
response = self._do_post('os-coverage/action',
'coverage-stop-post-req', subs)
self.assertEqual(response.status, 200)
subs.update(self._get_regexes())
return self._verify_response('coverage-stop-post-resp',
subs, response)
def test_report_coverage(self):
"""Generate a coverage report"""