PAPI: Expose API enums to tests / applications
e.g: from vpp_papi import VppEnum VppEnum.vl_api_address_family_t.ADDRESS_IP4 Change-Id: I10c22d57234a1a06e98a889cf80b19085b468ed3 Signed-off-by: Ole Troan <ot@cisco.com>
This commit is contained in:
@ -27,7 +27,7 @@ import fnmatch
|
|||||||
import weakref
|
import weakref
|
||||||
import atexit
|
import atexit
|
||||||
from . vpp_serializer import VPPType, VPPEnumType, VPPUnionType, BaseTypes
|
from . vpp_serializer import VPPType, VPPEnumType, VPPUnionType, BaseTypes
|
||||||
from . vpp_serializer import VPPMessage
|
from . vpp_serializer import VPPMessage, vpp_get_type
|
||||||
|
|
||||||
if sys.version[0] == '2':
|
if sys.version[0] == '2':
|
||||||
import Queue as queue
|
import Queue as queue
|
||||||
@ -35,6 +35,19 @@ else:
|
|||||||
import queue as queue
|
import queue as queue
|
||||||
|
|
||||||
|
|
||||||
|
class VppEnumType(type):
|
||||||
|
def __getattr__(cls, name):
|
||||||
|
t = vpp_get_type(name)
|
||||||
|
return t.enum
|
||||||
|
|
||||||
|
|
||||||
|
# Python3
|
||||||
|
# class VppEnum(metaclass=VppEnumType):
|
||||||
|
# pass
|
||||||
|
class VppEnum:
|
||||||
|
__metaclass__ = VppEnumType
|
||||||
|
|
||||||
|
|
||||||
def vpp_atexit(vpp_weakref):
|
def vpp_atexit(vpp_weakref):
|
||||||
"""Clean up VPP connection on shutdown."""
|
"""Clean up VPP connection on shutdown."""
|
||||||
vpp_instance = vpp_weakref()
|
vpp_instance = vpp_weakref()
|
||||||
@ -94,6 +107,7 @@ class VPP():
|
|||||||
unresolved = {}
|
unresolved = {}
|
||||||
for k, v in types.items():
|
for k, v in types.items():
|
||||||
t = v['data']
|
t = v['data']
|
||||||
|
if not vpp_get_type(t[0]):
|
||||||
if v['type'] == 'enum':
|
if v['type'] == 'enum':
|
||||||
try:
|
try:
|
||||||
VPPEnumType(t[0], t[1:])
|
VPPEnumType(t[0], t[1:])
|
||||||
@ -200,6 +214,9 @@ class VPP():
|
|||||||
return self.context
|
return self.context
|
||||||
get_context = ContextId()
|
get_context = ContextId()
|
||||||
|
|
||||||
|
def get_type(self, name):
|
||||||
|
return vpp_get_type(name)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def find_api_dir(cls):
|
def find_api_dir(cls):
|
||||||
"""Attempt to find the best directory in which API definition
|
"""Attempt to find the best directory in which API definition
|
||||||
|
@ -62,6 +62,13 @@ types['f64'] = BaseTypes('f64')
|
|||||||
types['bool'] = BaseTypes('bool')
|
types['bool'] = BaseTypes('bool')
|
||||||
|
|
||||||
|
|
||||||
|
def vpp_get_type(name):
|
||||||
|
try:
|
||||||
|
return types[name]
|
||||||
|
except KeyError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class FixedList_u8():
|
class FixedList_u8():
|
||||||
def __init__(self, name, field_type, num):
|
def __init__(self, name, field_type, num):
|
||||||
self.name = name
|
self.name = name
|
||||||
@ -202,6 +209,9 @@ class VPPEnumType():
|
|||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
return self.enum[name]
|
return self.enum[name]
|
||||||
|
|
||||||
|
def __nonzero__(self):
|
||||||
|
return True
|
||||||
|
|
||||||
def pack(self, data, kwargs=None):
|
def pack(self, data, kwargs=None):
|
||||||
return types['u32'].pack(data, kwargs)
|
return types['u32'].pack(data, kwargs)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
from framework import VppTestCase, VppTestRunner
|
from framework import VppTestCase, VppTestRunner
|
||||||
from vpp_ip import IpAddressFamily, VppIpPrefix
|
from vpp_ip import VppIpPrefix
|
||||||
|
|
||||||
from vpp_ip_route import VppIpTable
|
from vpp_ip_route import VppIpTable
|
||||||
|
|
||||||
@ -10,6 +10,8 @@ from scapy.layers.l2 import Ether
|
|||||||
from scapy.layers.inet import IP, UDP, ICMP
|
from scapy.layers.inet import IP, UDP, ICMP
|
||||||
from scapy.layers.inet6 import IPv6
|
from scapy.layers.inet6 import IPv6
|
||||||
|
|
||||||
|
from vpp_papi import VppEnum
|
||||||
|
|
||||||
|
|
||||||
class TestSVS(VppTestCase):
|
class TestSVS(VppTestCase):
|
||||||
""" SVS Test Case """
|
""" SVS Test Case """
|
||||||
@ -94,7 +96,8 @@ class TestSVS(VppTestCase):
|
|||||||
table_ids = [101, 102]
|
table_ids = [101, 102]
|
||||||
|
|
||||||
for table_id in table_ids:
|
for table_id in table_ids:
|
||||||
self.vapi.svs_table_add_del(IpAddressFamily.ADDRESS_IP4, table_id)
|
self.vapi.svs_table_add_del(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4, table_id)
|
||||||
|
|
||||||
#
|
#
|
||||||
# map X.0.0.0/8 to each SVS table for lookup in table X
|
# map X.0.0.0/8 to each SVS table for lookup in table X
|
||||||
@ -108,11 +111,11 @@ class TestSVS(VppTestCase):
|
|||||||
#
|
#
|
||||||
# Enable SVS on pg0/pg1 using table 1001/1002
|
# Enable SVS on pg0/pg1 using table 1001/1002
|
||||||
#
|
#
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP4,
|
self.vapi.svs_enable_disable(
|
||||||
table_ids[0],
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4, table_ids[0],
|
||||||
self.pg0.sw_if_index)
|
self.pg0.sw_if_index)
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP4,
|
self.vapi.svs_enable_disable(
|
||||||
table_ids[1],
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4, table_ids[1],
|
||||||
self.pg1.sw_if_index)
|
self.pg1.sw_if_index)
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -148,19 +151,21 @@ class TestSVS(VppTestCase):
|
|||||||
|
|
||||||
self.assertEqual(ss[0].table_id, table_ids[0])
|
self.assertEqual(ss[0].table_id, table_ids[0])
|
||||||
self.assertEqual(ss[0].sw_if_index, self.pg0.sw_if_index)
|
self.assertEqual(ss[0].sw_if_index, self.pg0.sw_if_index)
|
||||||
self.assertEqual(ss[0].af, IpAddressFamily.ADDRESS_IP4)
|
self.assertEqual(ss[0].af, VppEnum.vl_api_address_family_t.ADDRESS_IP4)
|
||||||
self.assertEqual(ss[1].table_id, table_ids[1])
|
self.assertEqual(ss[1].table_id, table_ids[1])
|
||||||
self.assertEqual(ss[1].sw_if_index, self.pg1.sw_if_index)
|
self.assertEqual(ss[1].sw_if_index, self.pg1.sw_if_index)
|
||||||
self.assertEqual(ss[1].af, IpAddressFamily.ADDRESS_IP4)
|
self.assertEqual(ss[1].af, VppEnum.vl_api_address_family_t.ADDRESS_IP4)
|
||||||
|
|
||||||
#
|
#
|
||||||
# cleanup
|
# cleanup
|
||||||
#
|
#
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP4,
|
self.vapi.svs_enable_disable(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4,
|
||||||
table_ids[0],
|
table_ids[0],
|
||||||
self.pg0.sw_if_index,
|
self.pg0.sw_if_index,
|
||||||
is_enable=0)
|
is_enable=0)
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP4,
|
self.vapi.svs_enable_disable(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4,
|
||||||
table_ids[1],
|
table_ids[1],
|
||||||
self.pg1.sw_if_index,
|
self.pg1.sw_if_index,
|
||||||
is_enable=0)
|
is_enable=0)
|
||||||
@ -171,7 +176,8 @@ class TestSVS(VppTestCase):
|
|||||||
table_id,
|
table_id,
|
||||||
VppIpPrefix("%d.0.0.0" % i, 8).encode(),
|
VppIpPrefix("%d.0.0.0" % i, 8).encode(),
|
||||||
0, is_add=0)
|
0, is_add=0)
|
||||||
self.vapi.svs_table_add_del(IpAddressFamily.ADDRESS_IP4,
|
self.vapi.svs_table_add_del(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4,
|
||||||
table_id,
|
table_id,
|
||||||
is_add=0)
|
is_add=0)
|
||||||
|
|
||||||
@ -220,7 +226,8 @@ class TestSVS(VppTestCase):
|
|||||||
table_ids = [101, 102]
|
table_ids = [101, 102]
|
||||||
|
|
||||||
for table_id in table_ids:
|
for table_id in table_ids:
|
||||||
self.vapi.svs_table_add_del(IpAddressFamily.ADDRESS_IP6, table_id)
|
self.vapi.svs_table_add_del(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6, table_id)
|
||||||
|
|
||||||
#
|
#
|
||||||
# map X.0.0.0/8 to each SVS table for lookup in table X
|
# map X.0.0.0/8 to each SVS table for lookup in table X
|
||||||
@ -234,10 +241,12 @@ class TestSVS(VppTestCase):
|
|||||||
#
|
#
|
||||||
# Enable SVS on pg0/pg1 using table 1001/1002
|
# Enable SVS on pg0/pg1 using table 1001/1002
|
||||||
#
|
#
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP6,
|
self.vapi.svs_enable_disable(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
table_ids[0],
|
table_ids[0],
|
||||||
self.pg0.sw_if_index)
|
self.pg0.sw_if_index)
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP6,
|
self.vapi.svs_enable_disable(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
table_ids[1],
|
table_ids[1],
|
||||||
self.pg1.sw_if_index)
|
self.pg1.sw_if_index)
|
||||||
|
|
||||||
@ -274,19 +283,21 @@ class TestSVS(VppTestCase):
|
|||||||
|
|
||||||
self.assertEqual(ss[0].table_id, table_ids[0])
|
self.assertEqual(ss[0].table_id, table_ids[0])
|
||||||
self.assertEqual(ss[0].sw_if_index, self.pg0.sw_if_index)
|
self.assertEqual(ss[0].sw_if_index, self.pg0.sw_if_index)
|
||||||
self.assertEqual(ss[0].af, IpAddressFamily.ADDRESS_IP6)
|
self.assertEqual(ss[0].af, VppEnum.vl_api_address_family_t.ADDRESS_IP6)
|
||||||
self.assertEqual(ss[1].table_id, table_ids[1])
|
self.assertEqual(ss[1].table_id, table_ids[1])
|
||||||
self.assertEqual(ss[1].sw_if_index, self.pg1.sw_if_index)
|
self.assertEqual(ss[1].sw_if_index, self.pg1.sw_if_index)
|
||||||
self.assertEqual(ss[1].af, IpAddressFamily.ADDRESS_IP6)
|
self.assertEqual(ss[1].af, VppEnum.vl_api_address_family_t.ADDRESS_IP6)
|
||||||
|
|
||||||
#
|
#
|
||||||
# cleanup
|
# cleanup
|
||||||
#
|
#
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP6,
|
self.vapi.svs_enable_disable(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
table_ids[0],
|
table_ids[0],
|
||||||
self.pg0.sw_if_index,
|
self.pg0.sw_if_index,
|
||||||
is_enable=0)
|
is_enable=0)
|
||||||
self.vapi.svs_enable_disable(IpAddressFamily.ADDRESS_IP6,
|
self.vapi.svs_enable_disable(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
table_ids[1],
|
table_ids[1],
|
||||||
self.pg1.sw_if_index,
|
self.pg1.sw_if_index,
|
||||||
is_enable=0)
|
is_enable=0)
|
||||||
@ -296,9 +307,11 @@ class TestSVS(VppTestCase):
|
|||||||
table_id,
|
table_id,
|
||||||
VppIpPrefix("2001:%d::" % i, 32).encode(),
|
VppIpPrefix("2001:%d::" % i, 32).encode(),
|
||||||
0, is_add=0)
|
0, is_add=0)
|
||||||
self.vapi.svs_table_add_del(IpAddressFamily.ADDRESS_IP6,
|
self.vapi.svs_table_add_del(
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
table_id,
|
table_id,
|
||||||
is_add=0)
|
is_add=0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main(testRunner=VppTestRunner)
|
unittest.main(testRunner=VppTestRunner)
|
||||||
|
@ -5,11 +5,7 @@
|
|||||||
|
|
||||||
from ipaddress import ip_address
|
from ipaddress import ip_address
|
||||||
from socket import AF_INET, AF_INET6
|
from socket import AF_INET, AF_INET6
|
||||||
|
from vpp_papi import VppEnum
|
||||||
|
|
||||||
class IpAddressFamily:
|
|
||||||
ADDRESS_IP4 = 0
|
|
||||||
ADDRESS_IP6 = 1
|
|
||||||
|
|
||||||
|
|
||||||
class DpoProto:
|
class DpoProto:
|
||||||
@ -86,12 +82,12 @@ class VppIpAddress():
|
|||||||
def encode(self):
|
def encode(self):
|
||||||
if self.addr.version is 6:
|
if self.addr.version is 6:
|
||||||
return {
|
return {
|
||||||
'af': IpAddressFamily.ADDRESS_IP6,
|
'af': VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
'un': self.addr.encode()
|
'un': self.addr.encode()
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
return {
|
return {
|
||||||
'af': IpAddressFamily.ADDRESS_IP4,
|
'af': VppEnum.vl_api_address_family_t.ADDRESS_IP4,
|
||||||
'un': self.addr.encode()
|
'un': self.addr.encode()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,10 +97,12 @@ class VppIpAddress():
|
|||||||
elif hasattr(other, "af") and hasattr(other, "un"):
|
elif hasattr(other, "af") and hasattr(other, "un"):
|
||||||
# a vp_api_address_t
|
# a vp_api_address_t
|
||||||
if 4 is self.version:
|
if 4 is self.version:
|
||||||
return other.af == IpAddressFamily.ADDRESS_IP4 and \
|
return other.af == \
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP4 and \
|
||||||
other.un == self.addr
|
other.un == self.addr
|
||||||
else:
|
else:
|
||||||
return other.af == IpAddressFamily.ADDRESS_IP6 and \
|
return other.af == \
|
||||||
|
VppEnum.vl_api_address_family_t.ADDRESS_IP6 and \
|
||||||
other.un == self.addr
|
other.un == self.addr
|
||||||
else:
|
else:
|
||||||
raise Exception("Comparing VppIpAddress:%s with unknown type: %s" %
|
raise Exception("Comparing VppIpAddress:%s with unknown type: %s" %
|
||||||
@ -202,7 +200,7 @@ class VppIpMPrefix():
|
|||||||
|
|
||||||
if 6 is self.ip_saddr.version:
|
if 6 is self.ip_saddr.version:
|
||||||
prefix = {
|
prefix = {
|
||||||
'af': IpAddressFamily.ADDRESS_IP6,
|
'af': VppEnum.vl_api_address_family_t.ADDRESS_IP6,
|
||||||
'grp_address': {
|
'grp_address': {
|
||||||
'ip6': {
|
'ip6': {
|
||||||
'address': self.ip_gaddr.packed
|
'address': self.ip_gaddr.packed
|
||||||
@ -217,7 +215,7 @@ class VppIpMPrefix():
|
|||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
prefix = {
|
prefix = {
|
||||||
'af': IpAddressFamily.ADDRESS_IP4,
|
'af': VppEnum.vl_api_address_family_t.ADDRESS_IP4,
|
||||||
'grp_address': {
|
'grp_address': {
|
||||||
'ip4': {
|
'ip4': {
|
||||||
'address': self.ip_gaddr.packed
|
'address': self.ip_gaddr.packed
|
||||||
|
Reference in New Issue
Block a user