summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2019-05-10 12:01:10 +0200
committerPaul Vinciguerra <pvinci@vinciconsulting.com>2019-05-10 21:50:34 +0000
commit72d8758fdc2266b9f4cd53063da2d23f0855c1df (patch)
tree972c5260846e3cc5c10a9be8c6318812ed5faa75
parentf89a6de8f032536080c4a11b267bf921093d3740 (diff)
cli: Add return value in cli_inband
Even when a CLI command called through the cli_inband API failed the API would return 0 (SUCCESS). This patch fixes that, but since most CLI handlers return error->code == 0, in most failure cases it will return -1 (UNSPECIFIED ERROR). Type: fix Change-Id: Ic83f3b23e8e8954bb8aa211301baba24e8c20ef6 Signed-off-by: Ole Troan <ot@cisco.com>
-rw-r--r--src/vlib/cli.c7
-rw-r--r--src/vlib/cli.h8
-rw-r--r--src/vpp/api/api.c2
-rw-r--r--test/test_cli.py36
4 files changed, 47 insertions, 6 deletions
diff --git a/src/vlib/cli.c b/src/vlib/cli.c
index 4e8f3ae5ae5..835cb87d13d 100644
--- a/src/vlib/cli.c
+++ b/src/vlib/cli.c
@@ -684,7 +684,7 @@ vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error)
}
/* Process CLI input. */
-void
+int
vlib_cli_input (vlib_main_t * vm,
unformat_input_t * input,
vlib_cli_output_function_t * function, uword function_arg)
@@ -694,6 +694,7 @@ vlib_cli_input (vlib_main_t * vm,
clib_error_t *error;
vlib_cli_output_function_t *save_function;
uword save_function_arg;
+ int rv = 0;
save_function = cp->output_function;
save_function_arg = cp->output_function_arg;
@@ -713,11 +714,15 @@ vlib_cli_input (vlib_main_t * vm,
{
vlib_cli_output (vm, "%v", error->what);
vlib_unix_error_report (vm, error);
+ /* clib_error_return is unfortunately often called with a '0'
+ return code */
+ rv = error->code != 0 ? error->code : -1;
clib_error_free (error);
}
cp->output_function = save_function;
cp->output_function_arg = save_function_arg;
+ return rv;
}
/* Output to current CLI connection. */
diff --git a/src/vlib/cli.h b/src/vlib/cli.h
index a81e964bf97..13216dc4025 100644
--- a/src/vlib/cli.h
+++ b/src/vlib/cli.h
@@ -186,10 +186,10 @@ static __clib_unused vlib_cli_command_t __clib_unused_##x
void vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...);
/* Process CLI input. */
-void vlib_cli_input (struct vlib_main_t *vm,
- unformat_input_t * input,
- vlib_cli_output_function_t * function,
- uword function_arg);
+int vlib_cli_input (struct vlib_main_t *vm,
+ unformat_input_t * input,
+ vlib_cli_output_function_t * function,
+ uword function_arg);
clib_error_t *vlib_cli_register (struct vlib_main_t *vm,
vlib_cli_command_t * c);
diff --git a/src/vpp/api/api.c b/src/vpp/api/api.c
index c5c2480ea87..b389a7a7a63 100644
--- a/src/vpp/api/api.c
+++ b/src/vpp/api/api.c
@@ -226,7 +226,7 @@ vl_api_cli_inband_t_handler (vl_api_cli_inband_t * mp)
unformat_init_string (&input, (char *) vl_api_from_api_string (&mp->cmd),
vl_api_string_len (&mp->cmd));
- vlib_cli_input (vm, &input, inband_cli_output, (uword) & out_vec);
+ rv = vlib_cli_input (vm, &input, inband_cli_output, (uword) & out_vec);
len = vec_len (out_vec);
diff --git a/test/test_cli.py b/test/test_cli.py
new file mode 100644
index 00000000000..d3e69e924b5
--- /dev/null
+++ b/test/test_cli.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+"""CLI functional tests"""
+
+import unittest
+from framework import VppTestCase, VppTestRunner
+
+
+class TestCLI(VppTestCase):
+ """ CLI Test Case """
+ maxDiff = None
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestCLI, cls).setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ super(TestCLI, cls).tearDownClass()
+
+ def setUp(self):
+ super(TestCLI, self).setUp()
+
+ def tearDown(self):
+ super(TestCLI, self).tearDown()
+
+ def test_cli_retval(self):
+ """ CLI inband retval """
+ rv = self.vapi.papi.cli_inband(cmd='this command does not exist')
+ self.assertNotEqual(rv.retval, 0)
+
+ rv = self.vapi.papi.cli_inband(cmd='show version')
+ self.assertEqual(rv.retval, 0)
+
+
+if __name__ == '__main__':
+ unittest.main(testRunner=VppTestRunner)