aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_cli.py
blob: 5005bf4c43a13d95db2516f556338f8894480f9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python3
"""CLI functional tests"""

import datetime
import time
import unittest

from vpp_papi import VPPIOError

from framework import VppTestCase, VppTestRunner


class TestCLI(VppTestCase):
    """ CLI Test Case """
    maxDiff = None

    @classmethod
    def setUpClass(cls):
        # using the framework default
        cls.vapi_response_timeout = 5
        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)

    def test_long_cli_delay(self):
        """ Test that VppApiClient raises VppIOError if timeout."""  # noqa
        with self.assertRaises(VPPIOError) as ctx:
            rv = self.vapi.papi.cli_inband(cmd='wait 10')

    def test_long_cli_delay_override(self):
        """ Test per-command _timeout option."""  # noqa
        rv = self.vapi.papi.cli_inband(cmd='wait 10', _timeout=15)
        self.assertEqual(rv.retval, 0)


class TestCLIExtendedVapiTimeout(VppTestCase):
    maxDiff = None

    @classmethod
    def setUpClass(cls):
        cls.vapi_response_timeout = 15
        cls.__doc__ = " CLI Test Case w/ Extended (%ssec) Vapi Timeout " \
                      % cls.vapi_response_timeout
        super(TestCLIExtendedVapiTimeout, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(TestCLIExtendedVapiTimeout, cls).tearDownClass()

    def setUp(self):
        super(TestCLIExtendedVapiTimeout, self).setUp()

    def tearDown(self):
        super(TestCLIExtendedVapiTimeout, self).tearDown()

    def test_long_cli_delay(self):
        """ Test that delayed result returns with extended timeout."""
        wait_secs = self.vapi_response_timeout - 1

        # get vpp time as float
        start = self.vapi.papi.show_vpe_system_time(
            _no_type_conversion=True).vpe_system_time
        rv = self.vapi.papi.cli_inband(cmd='wait %s' % wait_secs)
        now = self.vapi.papi.show_vpe_system_time(
            _no_type_conversion=True).vpe_system_time

        # assume that the overhead of the measurement is not more that .5 sec.
        self.assertEqual(round(now - start), wait_secs)


if __name__ == '__main__':
    unittest.main(testRunner=VppTestRunner)
*rta_data, int rta_data_len) { struct rtattr *rta; u8 *p; vec_add2 (m->data, p, RTA_SPACE (rta_data_len)); rta = (struct rtattr *) p; rta->rta_type = rta_type; rta->rta_len = RTA_LENGTH (rta_data_len); clib_memcpy (RTA_DATA (rta), rta_data, rta_data_len); } static clib_error_t * vnet_netlink_msg_send (vnet_netlink_msg_t * m) { clib_error_t *err = 0; struct sockaddr_nl ra = { 0 }; int len, sock; struct nlmsghdr *nh = (struct nlmsghdr *) m->data; nh->nlmsg_len = vec_len (m->data); char buf[4096]; if ((sock = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) return clib_error_return_unix (0, "socket(AF_NETLINK)"); ra.nl_family = AF_NETLINK; ra.nl_pid = 0; if ((bind (sock, (struct sockaddr *) &ra, sizeof (ra))) == -1) { err = clib_error_return_unix (0, "bind"); goto done; } if ((send (sock, m->data, vec_len (m->data), 0)) == -1) err = clib_error_return_unix (0, "send"); if ((len = recv (sock, buf, sizeof (buf), 0)) == -1) err = clib_error_return_unix (0, "recv"); for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len); nh = NLMSG_NEXT (nh, len)) { if (nh->nlmsg_type == NLMSG_DONE) goto done; if (nh->nlmsg_type == NLMSG_ERROR) { struct nlmsgerr *e = (struct nlmsgerr *) NLMSG_DATA (nh); if (e->error) err = clib_error_return (0, "netlink error %d", e->error); goto done; } } done: close (sock); vec_free (m->data); return err; } clib_error_t * vnet_netlink_set_link_name (int ifindex, char *new_ifname) { vnet_netlink_msg_t m; struct ifinfomsg ifmsg = { 0 }; ifmsg.ifi_index = ifindex; vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST, &ifmsg, sizeof (struct ifinfomsg)); vnet_netlink_msg_add_rtattr (&m, IFLA_IFNAME, new_ifname, strlen (new_ifname) + 1); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_set_link_netns (int ifindex, int netns_fd, char *new_ifname) { vnet_netlink_msg_t m; struct ifinfomsg ifmsg = { 0 }; ifmsg.ifi_index = ifindex; vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST, &ifmsg, sizeof (struct ifinfomsg)); vnet_netlink_msg_add_rtattr (&m, IFLA_NET_NS_FD, &netns_fd, sizeof (int)); if (new_ifname) vnet_netlink_msg_add_rtattr (&m, IFLA_IFNAME, new_ifname, strlen (new_ifname) + 1); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_set_link_master (int ifindex, char *master_ifname) { vnet_netlink_msg_t m; struct ifinfomsg ifmsg = { 0 }; int i; ifmsg.ifi_index = ifindex; if ((i = if_nametoindex (master_ifname)) == 0) clib_error_return_unix (0, "unknown master interface '%s'", master_ifname); vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST, &ifmsg, sizeof (struct ifinfomsg)); vnet_netlink_msg_add_rtattr (&m, IFLA_MASTER, &i, sizeof (int)); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_set_link_addr (int ifindex, u8 * mac) { vnet_netlink_msg_t m; struct ifinfomsg ifmsg = { 0 }; ifmsg.ifi_index = ifindex; vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST, &ifmsg, sizeof (struct ifinfomsg)); vnet_netlink_msg_add_rtattr (&m, IFLA_ADDRESS, mac, 6); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_set_link_state (int ifindex, int up) { vnet_netlink_msg_t m; struct ifinfomsg ifmsg = { 0 }; ifmsg.ifi_flags = IFF_UP; ifmsg.ifi_change = IFF_UP; ifmsg.ifi_index = ifindex; vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST, &ifmsg, sizeof (struct ifinfomsg)); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_set_link_mtu (int ifindex, int mtu) { vnet_netlink_msg_t m; struct ifinfomsg ifmsg = { 0 }; ifmsg.ifi_index = ifindex; vnet_netlink_msg_init (&m, RTM_SETLINK, NLM_F_REQUEST, &ifmsg, sizeof (struct ifinfomsg)); vnet_netlink_msg_add_rtattr (&m, IFLA_MTU, &mtu, sizeof (int)); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_add_ip4_addr (int ifindex, void *addr, int pfx_len) { vnet_netlink_msg_t m; struct ifaddrmsg ifa = { 0 }; ifa.ifa_family = AF_INET; ifa.ifa_prefixlen = pfx_len; ifa.ifa_index = ifindex; vnet_netlink_msg_init (&m, RTM_NEWADDR, NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL, &ifa, sizeof (struct ifaddrmsg)); vnet_netlink_msg_add_rtattr (&m, IFA_LOCAL, addr, 4); vnet_netlink_msg_add_rtattr (&m, IFA_ADDRESS, addr, 4); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_add_ip6_addr (int ifindex, void *addr, int pfx_len) { vnet_netlink_msg_t m; struct ifaddrmsg ifa = { 0 }; ifa.ifa_family = AF_INET6; ifa.ifa_prefixlen = pfx_len; ifa.ifa_index = ifindex; vnet_netlink_msg_init (&m, RTM_NEWADDR, NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL, &ifa, sizeof (struct ifaddrmsg)); vnet_netlink_msg_add_rtattr (&m, IFA_LOCAL, addr, 16); vnet_netlink_msg_add_rtattr (&m, IFA_ADDRESS, addr, 16); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_add_ip4_route (void *dst, u8 dst_len, void *gw) { vnet_netlink_msg_t m; struct rtmsg rtm = { 0 }; u8 dflt[4] = { 0 }; rtm.rtm_family = AF_INET; rtm.rtm_table = RT_TABLE_MAIN; rtm.rtm_type = RTN_UNICAST; rtm.rtm_dst_len = dst_len; vnet_netlink_msg_init (&m, RTM_NEWROUTE, NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL, &rtm, sizeof (struct rtmsg)); vnet_netlink_msg_add_rtattr (&m, RTA_GATEWAY, gw, 4); vnet_netlink_msg_add_rtattr (&m, RTA_DST, dst ? dst : dflt, 4); return vnet_netlink_msg_send (&m); } clib_error_t * vnet_netlink_add_ip6_route (void *dst, u8 dst_len, void *gw) { vnet_netlink_msg_t m; struct rtmsg rtm = { 0 }; u8 dflt[16] = { 0 }; rtm.rtm_family = AF_INET6; rtm.rtm_table = RT_TABLE_MAIN; rtm.rtm_type = RTN_UNICAST; rtm.rtm_dst_len = dst_len; vnet_netlink_msg_init (&m, RTM_NEWROUTE, NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL, &rtm, sizeof (struct rtmsg)); vnet_netlink_msg_add_rtattr (&m, RTA_GATEWAY, gw, 16); vnet_netlink_msg_add_rtattr (&m, RTA_DST, dst ? dst : dflt, 16); return vnet_netlink_msg_send (&m); } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */