api: Implement log_dump/log_details

- Replaces the need to screen scrape "show log".
- Adds an api to return the system time.  When running over a socket, the
  api client may have different time than the vpp host.

expected use:
  vpp_time_before_command = self.vapi.show_vpe_system_time_ticks().vpe_system_time_ticks
  <run some commands>
  log_output = self.vapi.log_dump(start_timestamp=vpp_time_before_command)

Depends-on: https://gerrit.fd.io/r/20484
Depends-on: https://gerrit.fd.io/r/#/c/19581/

==============================================================================
TestVpeApi
==============================================================================
log_details(_0=838, context=3, timestamp_ticks=2.4954863503546518e+48, level=<vl_api_log_level_t.VPE_API_LOG_LEVEL_WARNING: 4>, timestamp=u'2019/07/04 20:35:41:281', msg_class=u'buffer', message=u'vlib_physmem_shared_map_create: clib_mem_create_hugetlb_fd: open: No such file or directory\n\n')
log_details(_0=838, context=3, timestamp_ticks=1.6101902879480125e+159, level=<vl_api_log_level_t.VPE_API_LOG_LEVEL_WARNING: 4>, timestamp=u'2019/07/04 20:35:41:281', msg_class=u'buffer', message=u'falling back to non-hugepage backed buffer pool')
test_log_dump_default (test_vpe_api.TestVpeApi)                          OK
log_details(_0=838, context=13, timestamp_ticks=2.4954863503546518e+48, level=<vl_api_log_level_t.VPE_API_LOG_LEVEL_WARNING: 4>, timestamp=u'2019/07/04 20:35:41:281', msg_class=u'buffer', message=u'vlib_physmem_shared_map_create: clib_mem_create_hugetlb_fd: open: No such file or directory\n\n')
log_details(_0=838, context=13, timestamp_ticks=1.6101902879480125e+159, level=<vl_api_log_level_t.VPE_API_LOG_LEVEL_WARNING: 4>, timestamp=u'2019/07/04 20:35:41:281', msg_class=u'buffer', message=u'falling back to non-hugepage backed buffer pool')
test_log_dump_timestamp_0 (test_vpe_api.TestVpeApi)                      OK
test_log_dump_timestamp_future (test_vpe_api.TestVpeApi)                 SKIP
test_show_vpe_system_time_ticks (test_vpe_api.TestVpeApi)                SKIP

==============================================================================
TEST RESULTS:
     Scheduled tests: 4
      Executed tests: 4
        Passed tests: 2
       Skipped tests: 2
==============================================================================

Test run was successful

Type: feature

Change-Id: I893fc0a65f39749d2091093c2c604659aadd8447
Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
This commit is contained in:
Paul Vinciguerra
2019-06-25 22:30:19 -04:00
committed by Neale Ranns
parent 1d6d9f021c
commit 03f1af23b9
5 changed files with 241 additions and 60 deletions

46
test/test_vpe_api.py Normal file
View File

@ -0,0 +1,46 @@
# Copyright (c) 2019. Vinci Consulting Corp. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import time
import unittest
from framework import VppTestCase
class TestVpeApi(VppTestCase):
"""TestVpeApi"""
def test_log_dump_default(self):
rv = self.vapi.cli('test log notice fib entry this is a test')
rv = self.vapi.log_dump()
# print('\n'.join([str(v) for v in rv]))
self.assertTrue(rv)
def test_log_dump_timestamp_0(self):
rv = self.vapi.cli('test log notice fib entry this is a test')
rv = self.vapi.log_dump(start_timestamp=0.0)
# print('\n'.join([str(v) for v in rv]))
self.assertTrue(rv)
@unittest.skip('Requires https://gerrit.fd.io/r/#/c/19581/ '
'to use timestamp_ticks.')
def test_log_dump_timestamp_future(self):
rv = self.vapi.cli('test log debug fib entry test')
rv = self.vapi.log_dump(start_timestamp=time.time() + 60.0)
# print('\n'.join([str(v) for v in rv]))
self.assertFalse(rv)
@unittest.skip('Requires https://gerrit.fd.io/r/#/c/19581/ '
'to use timestamp_ticks.')
def test_show_vpe_system_time_ticks(self):
rv = self.vapi.show_vpe_system_time_ticks()
self.assertTrue(rv.vpe_system_time_ticks > 1.0)