From 6e855d6682b99d3a21b9b227555cdcbbf76c4700 Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Thu, 22 Sep 2016 12:49:00 -0400 Subject: [PATCH] DISPATCH-492 - Added module parameter to GET-LOG management operation --- python/qpid_dispatch_internal/dispatch.py | 2 +- .../management/agent.py | 30 +++++++++++++++---- src/log.c | 21 +++++++++++-- tests/system_tests_qdmanage.py | 23 ++++++++++++++ 4 files changed, 68 insertions(+), 8 deletions(-) diff --git a/python/qpid_dispatch_internal/dispatch.py b/python/qpid_dispatch_internal/dispatch.py index e397f863cb..52567bd72e 100644 --- a/python/qpid_dispatch_internal/dispatch.py +++ b/python/qpid_dispatch_internal/dispatch.py @@ -93,7 +93,7 @@ def __init__(self, handle): self._prototype(self.qd_entity_refresh_begin, c_long, [py_object]) self._prototype(self.qd_entity_refresh_end, None, []) - self._prototype(self.qd_log_recent_py, py_object, [c_long]) + self._prototype(self.qd_log_recent_py, py_object, [c_long, c_char_p]) def _errcheck(self, result, func, args): if self.qd_error_code(): diff --git a/python/qpid_dispatch_internal/management/agent.py b/python/qpid_dispatch_internal/management/agent.py index 370dc36a0f..acc4620309 100644 --- a/python/qpid_dispatch_internal/management/agent.py +++ b/python/qpid_dispatch_internal/management/agent.py @@ -635,8 +635,10 @@ def __init__(self, agent, entity_type, attributes, validate=True): def requested_type(self, request): type = request.properties.get('entityType') - if type: return self._schema.entity_type(type) - else: return None + if type: + return self._schema.entity_type(type) + else: + return None def query(self, request): """Management node query operation""" @@ -705,15 +707,33 @@ def get_schema(self, request): def _intprop(self, request, prop): value = request.properties.get(prop) - if value is not None: value = int(value) + if value is not None: + value = int(value) return value def get_json_schema(self, request): return (OK, json.dumps(self._schema.dump(), indent=self._intprop(request, "indent"))) + def is_log_module_valid(self, module): + module_valid = False + if module: + log_type = self._schema.prefixdot + 'log' + for module_type in self._schema.entity_types.get(log_type).attributes['module'].type: + if str(module_type) == module.upper(): + module_valid = True + break + + return module_valid + def get_log(self, request): - logs = self._qd.qd_log_recent_py(self._intprop(request, "limit") or -1) - return (OK, logs) + module = request.properties.get("module") + + if module and not self.is_log_module_valid(module): + raise BadRequestStatus("Invalid module %s " % module) + + logs = self._qd.qd_log_recent_py(self._intprop(request, "limit") or -1, + module) + return OK, logs def profile(self, request): """Start/stop the python profiler, returns profile results""" diff --git a/src/log.c b/src/log.c index 3e5aca6aa9..dd7c9b4cff 100644 --- a/src/log.c +++ b/src/log.c @@ -382,13 +382,29 @@ void qd_log_impl(qd_log_source_t *source, qd_log_level_t level, const char *file static PyObject *inc_none() { Py_INCREF(Py_None); return Py_None; } /// Return the log buffer up to limit as a python list. Called by management agent. -PyObject *qd_log_recent_py(long limit) { +PyObject *qd_log_recent_py(long limit, char *module) { if (PyErr_Occurred()) return NULL; PyObject *list = PyList_New(0); PyObject *py_entry = NULL; if (!list) goto error; qd_log_entry_t *entry = DEQ_TAIL(entries); + + if (module) { + // Convert module to uppercase + int i = 0; + while(module[i] && module[i] >= 'a' && module[i] <= 'z') { + module[i]=toupper(module[i]); + i++; + } + } + while (entry && limit) { + if (module && entry->module) { + if (strcmp(module, entry->module) != 0) { + entry = DEQ_PREV(entry); + continue; + } + } const int ENTRY_SIZE=6; py_entry = PyList_New(ENTRY_SIZE); if (!py_entry) goto error; @@ -405,7 +421,8 @@ PyObject *qd_log_recent_py(long limit) { if (PyErr_Occurred()) goto error; PyList_Insert(list, 0, py_entry); Py_DECREF(py_entry); - if (limit > 0) --limit; + if (limit > 0) + --limit; entry = DEQ_PREV(entry); } return list; diff --git a/tests/system_tests_qdmanage.py b/tests/system_tests_qdmanage.py index 346bd725f6..45dc3ce0b7 100644 --- a/tests/system_tests_qdmanage.py +++ b/tests/system_tests_qdmanage.py @@ -185,6 +185,29 @@ def test_get_log(self): self.assertEquals(['AGENT', 'trace'], log[0:2]) self.assertRegexpMatches(log[2], 'get-log') + log = json.loads(self.run_qdmanage("get-log module=policy"))[0] + self.assertTrue(log[0], "POLICY") + + log = json.loads(self.run_qdmanage("get-log limit=2 module=policy")) + self.assertEquals(2, len(log)) + + # Use uppercase module=POLICY + log = json.loads(self.run_qdmanage("get-log limit=2 module=POLICY")) + self.assertEquals(2, len(log)) + + log = json.loads(self.run_qdmanage("get-log module=policy")) + self.assertTrue(len(log) > 2) + + try: + # Test getting the log for an invalid module + exception_occured = False + print self.run_qdmanage("get-log module=INVALIDMODULE") + except Exception as e: + exception_occured = True + self.assertTrue("Invalid module INVALIDMODULE" in e.message) + + self.assertTrue(exception_occured) + def test_ssl(self): """Simple test for SSL connection. Note system_tests_qdstat has a more complete SSL test""" url = Url(self.router_1.addresses[1], scheme="amqps")