summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitsuhiko Yamazaki <yamazaki-mitsuhiko@cnt.mxc.nes.nec.co.jp>2013-04-05 10:17:06 +0900
committerMitsuhiko Yamazaki <yamazaki-mitsuhiko@cnt.mxc.nes.nec.co.jp>2013-04-08 11:41:01 +0900
commit0611f19406383fe1c8c1f2b2ec957c3b45d51eb2 (patch)
treea723dff3998dbfe56539f6b7ae18d5ac08cf5588
parent147eebe613d5d1756ce4f11066c62474eabb6076 (diff)
downloadnova-0611f19406383fe1c8c1f2b2ec957c3b45d51eb2.tar.gz
nova-0611f19406383fe1c8c1f2b2ec957c3b45d51eb2.tar.xz
nova-0611f19406383fe1c8c1f2b2ec957c3b45d51eb2.zip
Add reset function to nova coverage.
Now nova coverage is standardized to accumulate coverage data. It enables user to get combined coverage data of several tests. In addition to it, we need to restart nova services when measuring coverage of each test because there is no function to reset data. This adds reset coverage data API. Fixes bug: 1164331 Change-Id: Idd16cf3849b6510e7c620ed3bf16d507ed44c328
-rw-r--r--doc/api_samples/os-coverage/coverage-reset-post-req.json4
-rw-r--r--doc/api_samples/os-coverage/coverage-reset-post-req.xml2
-rw-r--r--nova/api/openstack/compute/contrib/coverage_ext.py25
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_coverage_ext.py25
4 files changed, 55 insertions, 1 deletions
diff --git a/doc/api_samples/os-coverage/coverage-reset-post-req.json b/doc/api_samples/os-coverage/coverage-reset-post-req.json
new file mode 100644
index 000000000..e5a22bb2b
--- /dev/null
+++ b/doc/api_samples/os-coverage/coverage-reset-post-req.json
@@ -0,0 +1,4 @@
+{
+ "reset" : {
+ }
+}
diff --git a/doc/api_samples/os-coverage/coverage-reset-post-req.xml b/doc/api_samples/os-coverage/coverage-reset-post-req.xml
new file mode 100644
index 000000000..b7971ad27
--- /dev/null
+++ b/doc/api_samples/os-coverage/coverage-reset-post-req.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<reset></reset>
diff --git a/nova/api/openstack/compute/contrib/coverage_ext.py b/nova/api/openstack/compute/contrib/coverage_ext.py
index ad30987ff..b8a1681d0 100644
--- a/nova/api/openstack/compute/contrib/coverage_ext.py
+++ b/nova/api/openstack/compute/contrib/coverage_ext.py
@@ -259,18 +259,41 @@ class CoverageController(object):
output.close()
return {'path': path}
+ def _reset_coverage_telnet(self, tn):
+ tn.write("coverInst.erase()\n")
+ tn.write("print 'finished'\n")
+ tn.expect([re.compile('finished')])
+
+ def _reset_coverage(self, req):
+ # Reopen telnet connections if they are closed.
+ for service in self.services:
+ if not service['telnet'].get_socket():
+ service['telnet'].open(service['host'], service['port'])
+
+ # Stop coverage if it is started.
+ try:
+ self._stop_coverage(req)
+ except exc.HTTPNotFound:
+ pass
+
+ for service in self.services:
+ self._reset_coverage_telnet(service['telnet'])
+ service['telnet'].close()
+ self.coverInst.erase()
+
def action(self, req, body):
_actions = {
'start': self._start_coverage,
'stop': self._stop_coverage,
'report': self._report_coverage,
+ 'reset': self._reset_coverage,
}
authorize(req.environ['nova.context'])
if not self.coverInst:
msg = _("Python coverage module is not installed.")
raise exc.HTTPServiceUnavailable(explanation=msg)
for action, data in body.iteritems():
- if action == 'stop':
+ if action == 'stop' or action == 'reset':
return _actions[action](req)
elif action == 'report' or action == 'start':
return _actions[action](req, body)
diff --git a/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py b/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py
index 6d66f8d74..cd4229ddd 100644
--- a/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py
+++ b/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py
@@ -56,6 +56,9 @@ class FakeCoverage(object):
def xml_report(self, outfile):
pass
+ def erase(self):
+ pass
+
class CoverageExtensionTest(test.TestCase):
@@ -202,3 +205,25 @@ class CoverageExtensionTest(test.TestCase):
res = req.get_response(fakes.wsgi_app(
fake_auth_context=self.admin_context))
self.assertEqual(res.status_int, 404)
+
+ def test_reset_coverage_action_while_coverage_running(self):
+ self.stubs.Set(coverage_ext.CoverageController,
+ '_check_coverage', fake_check_coverage)
+ body = {'reset': {}}
+ req = webob.Request.blank('/v2/fake/os-coverage/action')
+ req.method = "POST"
+ req.body = jsonutils.dumps(body)
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app(
+ fake_auth_context=self.admin_context))
+ self.assertEqual(res.status_int, 200)
+
+ def test_reset_coverage_action_while_coverage_stopped(self):
+ body = {'reset': {}}
+ req = webob.Request.blank('/v2/fake/os-coverage/action')
+ req.method = "POST"
+ req.body = jsonutils.dumps(body)
+ req.headers["content-type"] = "application/json"
+ res = req.get_response(fakes.wsgi_app(
+ fake_auth_context=self.admin_context))
+ self.assertEqual(res.status_int, 200)