|
| 1 | +from dump.match_infra import MatchRequest |
| 2 | +from dump.helper import create_template_dict |
| 3 | +from .executor import Executor |
| 4 | + |
| 5 | + |
| 6 | +class Vxlan_tunnel(Executor): |
| 7 | + """ |
| 8 | + Debug Dump Plugin for Vxlan Tunnel Module |
| 9 | + """ |
| 10 | + ARG_NAME = "vxlan_tunnel_name" |
| 11 | + |
| 12 | + def __init__(self, match_engine=None): |
| 13 | + super().__init__(match_engine) |
| 14 | + self.ret_temp = {} |
| 15 | + self.ns = '' |
| 16 | + self.src_ip = '' |
| 17 | + self.dst_ip = '' |
| 18 | + self.tunnel_obj = '' |
| 19 | + self.encap_mappers = [] |
| 20 | + self.decap_mappers = [] |
| 21 | + |
| 22 | + def get_all_args(self, ns=""): |
| 23 | + req = MatchRequest(db="CONFIG_DB", table="VXLAN_TUNNEL", key_pattern="*", ns=ns) |
| 24 | + ret = self.match_engine.fetch(req) |
| 25 | + vxlan_tunnels = ret["keys"] |
| 26 | + return [key.split("|")[-1] for key in vxlan_tunnels] |
| 27 | + |
| 28 | + def execute(self, params): |
| 29 | + self.ret_temp = create_template_dict(dbs=["CONFIG_DB", "APPL_DB", "ASIC_DB", "STATE_DB"]) |
| 30 | + vxlan_tunnel_name = params[Vxlan_tunnel.ARG_NAME] |
| 31 | + self.ns = params["namespace"] |
| 32 | + self.init_vxlan_tunnel_config_info(vxlan_tunnel_name) |
| 33 | + self.init_vxlan_tunnel_appl_info(vxlan_tunnel_name) |
| 34 | + self.init_asic_vxlan_tunnel_info() |
| 35 | + self.init_asic_vxlan_tunnel_map_info() |
| 36 | + self.init_asic_vxlan_tunnel_term_info() |
| 37 | + self.init_state_vxlan_tunnel_info(vxlan_tunnel_name) |
| 38 | + return self.ret_temp |
| 39 | + |
| 40 | + def add_to_ret_template(self, table, db, keys, err): |
| 41 | + if not err and keys: |
| 42 | + self.ret_temp[db]["keys"].extend(keys) |
| 43 | + return True |
| 44 | + else: |
| 45 | + self.ret_temp[db]["tables_not_found"].extend([table]) |
| 46 | + return False |
| 47 | + |
| 48 | + def init_vxlan_tunnel_config_info(self, vxlan_tunnel_name): |
| 49 | + req = MatchRequest(db="CONFIG_DB", table="VXLAN_TUNNEL", key_pattern=vxlan_tunnel_name, ns=self.ns) |
| 50 | + ret = self.match_engine.fetch(req) |
| 51 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
| 52 | + |
| 53 | + def init_vxlan_tunnel_appl_info(self, vxlan_tunnel_name): |
| 54 | + req = MatchRequest(db="APPL_DB", table="VXLAN_TUNNEL_TABLE", key_pattern=vxlan_tunnel_name, ns=self.ns, |
| 55 | + return_fields=["src_ip", "dst_ip"]) |
| 56 | + ret = self.match_engine.fetch(req) |
| 57 | + if ret["keys"]: |
| 58 | + app_key = ret["keys"][0] |
| 59 | + self.src_ip = ret["return_values"][app_key]["src_ip"] |
| 60 | + self.dst_ip = ret["return_values"][app_key]["dst_ip"] |
| 61 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
| 62 | + |
| 63 | + def init_state_vxlan_tunnel_info(self, vxlan_tunnel_name): |
| 64 | + req = MatchRequest(db="STATE_DB", table="VXLAN_TUNNEL_TABLE", key_pattern=vxlan_tunnel_name, ns=self.ns) |
| 65 | + ret = self.match_engine.fetch(req) |
| 66 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
| 67 | + |
| 68 | + def init_asic_vxlan_tunnel_info(self): |
| 69 | + if not self.src_ip: |
| 70 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL") |
| 71 | + return None |
| 72 | + req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL", field="SAI_TUNNEL_ATTR_ENCAP_SRC_IP", value=self.src_ip, ns=self.ns, |
| 73 | + return_fields=["SAI_TUNNEL_ATTR_TYPE", "SAI_TUNNEL_ATTR_ENCAP_DST_IP", |
| 74 | + "SAI_TUNNEL_ATTR_ENCAP_MAPPERS", "SAI_TUNNEL_ATTR_DECAP_MAPPERS"]) |
| 75 | + ret = self.match_engine.fetch(req) |
| 76 | + ret["keys"] = [x for x in ret["keys"] if ret["return_values"][x]["SAI_TUNNEL_ATTR_TYPE"] == "SAI_TUNNEL_TYPE_VXLAN"] |
| 77 | + ret["keys"] = [x for x in ret["keys"] if not self.dst_ip and ret["return_values"][x]["SAI_TUNNEL_ATTR_ENCAP_DST_IP"] == "" or |
| 78 | + ret["return_values"][x]["SAI_TUNNEL_ATTR_ENCAP_DST_IP"] == self.dst_ip] |
| 79 | + if ret["keys"]: |
| 80 | + asic_key = ret["keys"][0] |
| 81 | + self.tunnel_obj = asic_key.replace("ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL:", "") |
| 82 | + if ret["return_values"][asic_key]["SAI_TUNNEL_ATTR_ENCAP_MAPPERS"]: |
| 83 | + self.encap_mappers = ret["return_values"][asic_key]["SAI_TUNNEL_ATTR_ENCAP_MAPPERS"].split(':', 1)[-1].split(',') |
| 84 | + if ret["return_values"][asic_key]["SAI_TUNNEL_ATTR_DECAP_MAPPERS"]: |
| 85 | + self.decap_mappers = ret["return_values"][asic_key]["SAI_TUNNEL_ATTR_DECAP_MAPPERS"].split(':', 1)[-1].split(',') |
| 86 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
| 87 | + |
| 88 | + def init_asic_vxlan_tunnel_term_info(self): |
| 89 | + if not self.tunnel_obj: |
| 90 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL_TERM_TABLE_ENTRY") |
| 91 | + return None |
| 92 | + req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL_TERM_TABLE_ENTRY", |
| 93 | + field="SAI_TUNNEL_TERM_TABLE_ENTRY_ATTR_ACTION_TUNNEL_ID", value=self.tunnel_obj, ns=self.ns) |
| 94 | + ret = self.match_engine.fetch(req) |
| 95 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
| 96 | + |
| 97 | + def init_asic_vxlan_tunnel_map_info(self): |
| 98 | + if not (self.encap_mappers or self.decap_mappers): |
| 99 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL_MAP") |
| 100 | + return None |
| 101 | + for key in self.encap_mappers: |
| 102 | + req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL_MAP", |
| 103 | + key_pattern=key, ns=self.ns) |
| 104 | + ret = self.match_engine.fetch(req) |
| 105 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
| 106 | + for key in self.decap_mappers: |
| 107 | + req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL_MAP", |
| 108 | + key_pattern=key, ns=self.ns) |
| 109 | + ret = self.match_engine.fetch(req) |
| 110 | + self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"]) |
0 commit comments