"""VPP-api provider using vpp-papi
@property hook: hook object providing before and after api/cli hooks
-
-
"""
+ _zero, _negative = range(2)
+
def __init__(self, name, shm_prefix, test_class):
self.hook = Hook("vpp-papi-provider")
self.name = name
self.shm_prefix = shm_prefix
self.test_class = test_class
+ self._expect_api_retval = self._zero
+ self._expect_stack = []
jsonfiles = []
install_dir = os.getenv('VPP_TEST_INSTALL_PATH')
self.papi = VPP(jsonfiles)
self._events = deque()
+ def __enter__(self):
+ return self
+
+ def expect_negative_api_retval(self):
+ """ Expect API failure """
+ self._expect_stack.append(self._expect_api_retval)
+ self._expect_api_retval = self._negative
+ return self
+
+ def expect_zero_api_retval(self):
+ """ Expect API success """
+ self._expect_stack.append(self._expect_api_retval)
+ self._expect_api_retval = self._zero
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self._expect_api_retval = self._expect_stack.pop()
+
def register_hook(self, hook):
"""Replace hook registration with new hook
"""
self.hook.before_api(api_fn.__name__, api_args)
reply = api_fn(**api_args)
- if hasattr(reply, 'retval') and reply.retval != expected_retval:
- msg = "API call failed, expected retval == %d, got %s" % (
- expected_retval, repr(reply))
- self.test_class.logger.info(msg)
- raise Exception(msg)
+ if self._expect_api_retval == self._negative:
+ if hasattr(reply, 'retval') and reply.retval >= 0:
+ msg = "API call passed unexpectedly: expected negative "\
+ "return value instead of %d in %s" % \
+ (reply.retval, repr(reply))
+ self.test_class.logger.info(msg)
+ raise Exception(msg)
+ elif self._expect_api_retval == self._zero:
+ if hasattr(reply, 'retval') and reply.retval != expected_retval:
+ msg = "API call failed, expected zero return value instead "\
+ "of %d in %s" % (expected_retval, repr(reply))
+ self.test_class.logger.info(msg)
+ raise Exception(msg)
+ else:
+ raise Exception("Internal error, unexpected value for "
+ "self._expect_api_retval %s" %
+ self._expect_api_retval)
self.hook.after_api(api_fn.__name__, api_args)
return reply
{'sw_if_index': sw_if_index})
def ip6_sw_interface_ra_config(self, sw_if_index,
+ no,
suppress,
- send_unicast,):
+ send_unicast):
return self.api(self.papi.sw_interface_ip6nd_ra_config,
{'sw_if_index': sw_if_index,
+ 'is_no': no,
'suppress': suppress,
'send_unicast': send_unicast})
'template_interval': template_interval,
'udp_checksum': udp_checksum,
})
+
+ def dhcp_proxy_config(self,
+ dhcp_server,
+ dhcp_src_address,
+ rx_table_id=0,
+ server_table_id=0,
+ is_add=1,
+ is_ipv6=0,
+ insert_circuit_id=0):
+ return self.api(
+ self.papi.dhcp_proxy_config_2,
+ {
+ 'rx_vrf_id': rx_table_id,
+ 'server_vrf_id': server_table_id,
+ 'is_ipv6': is_ipv6,
+ 'is_add': is_add,
+ 'insert_circuit_id': insert_circuit_id,
+ 'dhcp_server': dhcp_server,
+ 'dhcp_src_address': dhcp_src_address,
+ })
+
+ def dhcp_proxy_set_vss(self,
+ table_id,
+ fib_id,
+ oui,
+ is_add=1,
+ is_ip6=0):
+ return self.api(
+ self.papi.dhcp_proxy_set_vss,
+ {
+ 'tbl_id': table_id,
+ 'fib_id': fib_id,
+ 'is_ipv6': is_ip6,
+ 'is_add': is_add,
+ 'oui': oui,
+ })
+
+ def ip_mroute_add_del(self,
+ src_address,
+ grp_address,
+ grp_address_length,
+ e_flags,
+ next_hop_sw_if_index,
+ i_flags,
+ table_id=0,
+ create_vrf_if_needed=0,
+ is_add=1,
+ is_ipv6=0,
+ is_local=0):
+ """
+ """
+ return self.api(
+ self.papi.ip_mroute_add_del,
+ {'next_hop_sw_if_index': next_hop_sw_if_index,
+ 'entry_flags': e_flags,
+ 'itf_flags': i_flags,
+ 'create_vrf_if_needed': create_vrf_if_needed,
+ 'is_add': is_add,
+ 'is_ipv6': is_ipv6,
+ 'is_local': is_local,
+ 'grp_address_length': grp_address_length,
+ 'grp_address': grp_address,
+ 'src_address': src_address})
+
+ def mfib_signal_dump(self):
+ return self.api(self.papi.mfib_signal_dump, {})