|
| 1 | +import re |
| 2 | +from dump.match_infra import MatchRequest |
| 3 | +from dump.helper import create_template_dict |
| 4 | +from dump.helper import handle_error, handle_multiple_keys_matched_error |
| 5 | +from .executor import Executor |
| 6 | + |
| 7 | +TRAP_ID_MAP = { |
| 8 | + "stp": "SAI_HOSTIF_TRAP_TYPE_STP", |
| 9 | + "lacp": "SAI_HOSTIF_TRAP_TYPE_LACP", |
| 10 | + "eapol": "SAI_HOSTIF_TRAP_TYPE_EAPOL", |
| 11 | + "lldp": "SAI_HOSTIF_TRAP_TYPE_LLDP", |
| 12 | + "pvrst": "SAI_HOSTIF_TRAP_TYPE_PVRST", |
| 13 | + "igmp_query": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_QUERY", |
| 14 | + "igmp_leave": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_LEAVE", |
| 15 | + "igmp_v1_report": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_V1_REPORT", |
| 16 | + "igmp_v2_report": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_V2_REPORT", |
| 17 | + "igmp_v3_report": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_V3_REPORT", |
| 18 | + "sample_packet": "SAI_HOSTIF_TRAP_TYPE_SAMPLEPACKET", |
| 19 | + "switch_cust_range": "SAI_HOSTIF_TRAP_TYPE_SWITCH_CUSTOM_RANGE_BASE", |
| 20 | + "arp_req": "SAI_HOSTIF_TRAP_TYPE_ARP_REQUEST", |
| 21 | + "arp_resp": "SAI_HOSTIF_TRAP_TYPE_ARP_RESPONSE", |
| 22 | + "dhcp": "SAI_HOSTIF_TRAP_TYPE_DHCP", |
| 23 | + "ospf": "SAI_HOSTIF_TRAP_TYPE_OSPF", |
| 24 | + "pim": "SAI_HOSTIF_TRAP_TYPE_PIM", |
| 25 | + "vrrp": "SAI_HOSTIF_TRAP_TYPE_VRRP", |
| 26 | + "bgp": "SAI_HOSTIF_TRAP_TYPE_BGP", |
| 27 | + "dhcpv6": "SAI_HOSTIF_TRAP_TYPE_DHCPV6", |
| 28 | + "ospfv6": "SAI_HOSTIF_TRAP_TYPE_OSPFV6", |
| 29 | + "vrrpv6": "SAI_HOSTIF_TRAP_TYPE_VRRPV6", |
| 30 | + "bgpv6": "SAI_HOSTIF_TRAP_TYPE_BGPV6", |
| 31 | + "neigh_discovery": "SAI_HOSTIF_TRAP_TYPE_IPV6_NEIGHBOR_DISCOVERY", |
| 32 | + "mld_v1_v2": "SAI_HOSTIF_TRAP_TYPE_IPV6_MLD_V1_V2", |
| 33 | + "mld_v1_report": "SAI_HOSTIF_TRAP_TYPE_IPV6_MLD_V1_REPORT", |
| 34 | + "mld_v1_done": "SAI_HOSTIF_TRAP_TYPE_IPV6_MLD_V1_DONE", |
| 35 | + "mld_v2_report": "SAI_HOSTIF_TRAP_TYPE_MLD_V2_REPORT", |
| 36 | + "ip2me": "SAI_HOSTIF_TRAP_TYPE_IP2ME", |
| 37 | + "ssh": "SAI_HOSTIF_TRAP_TYPE_SSH", |
| 38 | + "snmp": "SAI_HOSTIF_TRAP_TYPE_SNMP", |
| 39 | + "router_custom_range": "SAI_HOSTIF_TRAP_TYPE_ROUTER_CUSTOM_RANGE_BASE", |
| 40 | + "l3_mtu_error": "SAI_HOSTIF_TRAP_TYPE_L3_MTU_ERROR", |
| 41 | + "ttl_error": "SAI_HOSTIF_TRAP_TYPE_TTL_ERROR", |
| 42 | + "udld": "SAI_HOSTIF_TRAP_TYPE_UDLD", |
| 43 | + "bfd": "SAI_HOSTIF_TRAP_TYPE_BFD", |
| 44 | + "bfdv6": "SAI_HOSTIF_TRAP_TYPE_BFDV6", |
| 45 | + "src_nat_miss": "SAI_HOSTIF_TRAP_TYPE_SNAT_MISS", |
| 46 | + "dest_nat_miss": "SAI_HOSTIF_TRAP_TYPE_DNAT_MISS" |
| 47 | +} |
| 48 | + |
| 49 | +CFG_COPP_TRAP_TABLE_NAME = "COPP_TRAP" |
| 50 | +CFG_COPP_GROUP_TABLE_NAME = "COPP_GROUP" |
| 51 | +APP_COPP_TABLE_NAME = "COPP_TABLE" |
| 52 | + |
| 53 | +ASIC_DB_PREFIX = "ASIC_STATE" |
| 54 | + |
| 55 | +ASIC_TRAP_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF_TRAP" |
| 56 | +ASIC_TRAP_GROUP_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF_TRAP_GROUP" |
| 57 | +ASIC_HOSTIF_TABLE_ENTRY = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF_TABLE_ENTRY" |
| 58 | +ASIC_HOSTIF = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF" |
| 59 | +ASIC_POLICER_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_POLICER" |
| 60 | +ASIC_QUEUE_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_QUEUE" |
| 61 | + |
| 62 | + |
| 63 | +class Copp(Executor): |
| 64 | + |
| 65 | + ARG_NAME = "trap_id" |
| 66 | + CONFIG_FILE = "/etc/sonic/copp_cfg.json" |
| 67 | + |
| 68 | + def __init__(self, match_engine=None): |
| 69 | + super().__init__(match_engine) |
| 70 | + self.copp_trap_cfg_key = "" |
| 71 | + self.trap_group = "" |
| 72 | + self.trap_id = "" |
| 73 | + self.ns = "" |
| 74 | + self.ret_temp = {} |
| 75 | + |
| 76 | + def fetch_all_trap_ids(self, ret): |
| 77 | + traps = [] |
| 78 | + if not ret["error"]: |
| 79 | + for key in ret["keys"]: |
| 80 | + temp_ids = ret["return_values"][key]["trap_ids"].split(",") |
| 81 | + for id in temp_ids: |
| 82 | + traps.append(id) |
| 83 | + return traps |
| 84 | + |
| 85 | + def get_all_args(self, ns): |
| 86 | + all_trap_ids = set() |
| 87 | + req = MatchRequest(file=Copp.CONFIG_FILE, table=CFG_COPP_TRAP_TABLE_NAME, return_fields=["trap_ids"], ns=ns) |
| 88 | + ret = self.match_engine.fetch(req) |
| 89 | + all_trap_ids.update(self.fetch_all_trap_ids(ret)) |
| 90 | + |
| 91 | + req = MatchRequest(db="CONFIG_DB", table=CFG_COPP_TRAP_TABLE_NAME, return_fields=["trap_ids"], ns=ns) |
| 92 | + ret = self.match_engine.fetch(req) |
| 93 | + all_trap_ids.update(self.fetch_all_trap_ids(ret)) |
| 94 | + return list(all_trap_ids) |
| 95 | + |
| 96 | + def execute(self, params): |
| 97 | + self.ret_temp = create_template_dict(dbs=["CONFIG_DB", "APPL_DB", "ASIC_DB", "STATE_DB", "CONFIG_FILE"]) |
| 98 | + self.ns = params["namespace"] |
| 99 | + self.trap_id = params[Copp.ARG_NAME] |
| 100 | + self.copp_trap_cfg_key = "" |
| 101 | + self.trap_group = "" |
| 102 | + self.handle_user_and_default_config() |
| 103 | + self.handle_appl_db() |
| 104 | + self.handle_asic_db() |
| 105 | + self.handle_state_db() |
| 106 | + return self.ret_temp |
| 107 | + |
| 108 | + def handle_state_db(self): |
| 109 | + req = MatchRequest(db="STATE_DB", table="COPP_TRAP_TABLE", key_pattern=self.copp_trap_cfg_key) |
| 110 | + ret = self.match_engine.fetch(req) |
| 111 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 112 | + self.ret_temp["STATE_DB"]["keys"].append(ret["keys"][0]) |
| 113 | + else: |
| 114 | + self.ret_temp["STATE_DB"]["tables_not_found"].append("COPP_TRAP_TABLE") |
| 115 | + |
| 116 | + req = MatchRequest(db="STATE_DB", table="COPP_GROUP_TABLE", key_pattern=self.trap_group) |
| 117 | + ret = self.match_engine.fetch(req) |
| 118 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 119 | + self.ret_temp["STATE_DB"]["keys"].append(ret["keys"][0]) |
| 120 | + else: |
| 121 | + self.ret_temp["STATE_DB"]["tables_not_found"].append("COPP_GROUP_TABLE") |
| 122 | + |
| 123 | + def handle_appl_db(self): |
| 124 | + req = MatchRequest(db="APPL_DB", table=APP_COPP_TABLE_NAME, key_pattern="*", field="trap_ids", |
| 125 | + value=self.trap_id, match_entire_list=False, return_fields=["trap_group"]) |
| 126 | + ret = self.match_engine.fetch(req) |
| 127 | + tg = "" |
| 128 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 129 | + if len(ret["keys"]) > 1: |
| 130 | + err_str_tup = ("ERROR: Multiple COPP_TABLE Keys found for the trap_id {} in", |
| 131 | + "the APPL_DB, keys found: {}") |
| 132 | + err_str = " ".join(err_str_tup) |
| 133 | + err_str = err_str.format(self.trap_id, str(ret["keys"])) |
| 134 | + handle_multiple_keys_matched_error(err_str, ret["keys"][0]) |
| 135 | + self.ret_temp["APPL_DB"]["keys"].append(ret["keys"][0]) |
| 136 | + tg = ret["return_values"][ret["keys"][0]]["trap_group"] |
| 137 | + else: |
| 138 | + self.ret_temp["APPL_DB"]["tables_not_found"].append(APP_COPP_TABLE_NAME) |
| 139 | + |
| 140 | + if tg != self.trap_group and not self.trap_group and not tg: |
| 141 | + err_str_tup = ("The Associated Trap_group for the trap_id found in APPL", |
| 142 | + "and CONFIG_DB/CONFIG_FILE did not match.", |
| 143 | + "In APPL_DB: {}, CONFIG_DB: {}", |
| 144 | + "\n Proceding with the trap group found in APPL DB") |
| 145 | + err_str = " ".join(err_str_tup) |
| 146 | + err_str = err_str.format(tg, self.trap_group) |
| 147 | + handle_error(err_str, False) |
| 148 | + |
| 149 | + if tg: |
| 150 | + self.trap_group = tg |
| 151 | + |
| 152 | + def handle_asic_db(self): |
| 153 | + if self.trap_id not in TRAP_ID_MAP: |
| 154 | + err_str = "Invalid Trap Id {} is provided, no corresponding SAI_TRAP_OBJ is found" |
| 155 | + handle_error(err_str.format(self.trap_id), False) |
| 156 | + sai_trap_id = "" |
| 157 | + else: |
| 158 | + sai_trap_id = TRAP_ID_MAP[self.trap_id] |
| 159 | + sai_trap, sai_trap_grp = self.__get_asic_hostif_trap_obj(sai_trap_id) |
| 160 | + sai_queue, sai_policer = self.__get_asic_hostif_trap_group_obj(sai_trap_grp) |
| 161 | + self.__get_asic_policer_obj(sai_policer) |
| 162 | + self.__get_asic_queue_obj(sai_queue) |
| 163 | + sai_hostif_vid = self.__get_asic_hostif_entry_obj(sai_trap) |
| 164 | + self.__get_asic_hostif_obj(sai_hostif_vid) |
| 165 | + |
| 166 | + def __get_asic_hostif_trap_obj(self, sai_trap_id): |
| 167 | + if not sai_trap_id: |
| 168 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_OBJ) |
| 169 | + return "", "" |
| 170 | + |
| 171 | + req = MatchRequest(db="ASIC_DB", table=ASIC_TRAP_OBJ, field="SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE", value=sai_trap_id, |
| 172 | + ns=self.ns, return_fields=["SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP"]) |
| 173 | + ret = self.match_engine.fetch(req) |
| 174 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 175 | + if len(ret["keys"]) > 1: |
| 176 | + err_str = "ERROR: Multiple {} Keys found for the trap_sai_type {} in the ASIC_DB, keys found: {}".format(ASIC_TRAP_OBJ, trap_sai_obj, str(ret["keys"])) |
| 177 | + handle_multiple_keys_matched_error(err_str, ret["keys"][0]) |
| 178 | + trap_asic_key = ret["keys"][0] |
| 179 | + self.ret_temp["ASIC_DB"]["keys"].append(trap_asic_key) |
| 180 | + return trap_asic_key, ret["return_values"][trap_asic_key]["SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP"] |
| 181 | + else: |
| 182 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_OBJ) |
| 183 | + return "", "" |
| 184 | + |
| 185 | + def __get_asic_hostif_trap_group_obj(self, trap_group_obj): |
| 186 | + if not trap_group_obj: |
| 187 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_GROUP_OBJ) |
| 188 | + return "", "" |
| 189 | + |
| 190 | + req = MatchRequest(db="ASIC_DB", table=ASIC_TRAP_GROUP_OBJ, key_pattern=trap_group_obj, ns=self.ns, |
| 191 | + return_fields=["SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE", "SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER"]) |
| 192 | + ret = self.match_engine.fetch(req) |
| 193 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 194 | + trap_group_asic_key = ret["keys"][0] |
| 195 | + self.ret_temp["ASIC_DB"]["keys"].append(trap_group_asic_key) |
| 196 | + SAI_QUEUE_INDEX = ret["return_values"][trap_group_asic_key]["SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE"] |
| 197 | + SAI_POLICER_OBJ = ret["return_values"][trap_group_asic_key]["SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER"] |
| 198 | + return SAI_QUEUE_INDEX, SAI_POLICER_OBJ |
| 199 | + else: |
| 200 | + self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_GROUP_OBJ) |
| 201 | + return "", "" |
| 202 | + |
| 203 | + def __get_asic_policer_obj(self, policer_sai_obj): |
| 204 | + # Not adding to tables_not_found because, some of the trap_ids might not have a policer associated with them |
| 205 | + # and that is expected |
| 206 | + if not policer_sai_obj: |
| 207 | + return |
| 208 | + req = MatchRequest(db="ASIC_DB", table=ASIC_POLICER_OBJ, key_pattern=policer_sai_obj, ns=self.ns) |
| 209 | + ret = self.match_engine.fetch(req) |
| 210 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 211 | + self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0]) |
| 212 | + |
| 213 | + def __get_asic_queue_obj(self, queue_sai_obj): |
| 214 | + # Not adding tp tables_not_found because of the type of reason specified for policer obj |
| 215 | + if not queue_sai_obj: |
| 216 | + return |
| 217 | + req = MatchRequest(db="ASIC_DB", table=ASIC_QUEUE_OBJ, field="SAI_QUEUE_ATTR_INDEX", value=queue_sai_obj, ns=self.ns) |
| 218 | + ret = self.match_engine.fetch(req) |
| 219 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 220 | + self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0]) |
| 221 | + |
| 222 | + def __get_asic_hostif_entry_obj(self, sai_trap_key): |
| 223 | + # Not adding tp tables_not_found because of the type of reason specified for policer obj |
| 224 | + if not sai_trap_key: |
| 225 | + return |
| 226 | + matches = re.findall(r"oid:0x\w{1,14}", sai_trap_key) |
| 227 | + if matches: |
| 228 | + sai_trap_vid = matches[0] |
| 229 | + else: |
| 230 | + return |
| 231 | + req = MatchRequest(db="ASIC_DB", table=ASIC_HOSTIF_TABLE_ENTRY, field="SAI_HOSTIF_TABLE_ENTRY_ATTR_TRAP_ID", |
| 232 | + value=sai_trap_vid, return_fields=["SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF"], ns=self.ns) |
| 233 | + ret = self.match_engine.fetch(req) |
| 234 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 235 | + sai_hostif_table_entry_key = ret["keys"][0] |
| 236 | + self.ret_temp["ASIC_DB"]["keys"].append(sai_hostif_table_entry_key) |
| 237 | + sai_hostif_vid = ret["return_values"][sai_hostif_table_entry_key]["SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF"] |
| 238 | + return sai_hostif_vid |
| 239 | + |
| 240 | + def __get_asic_hostif_obj(self, sai_hostif_vid): |
| 241 | + # Not adding tp tables_not_found because of the type of reason specified for policer obj |
| 242 | + if not sai_hostif_vid: |
| 243 | + return |
| 244 | + req = MatchRequest(db="ASIC_DB", table=ASIC_HOSTIF, key_pattern=sai_hostif_vid, ns=self.ns) |
| 245 | + ret = self.match_engine.fetch(req) |
| 246 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 247 | + self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0]) |
| 248 | + |
| 249 | + # When the user writes config to CONFIG_DB, that takes precedence over default config |
| 250 | + def handle_user_and_default_config(self): |
| 251 | + # ------------------ Find trap_id_key and trap_group from both the sources |
| 252 | + # Search for any user-provided config for the trap-id provided |
| 253 | + trap_id_key_db, trap_group_db = self.__find_trap_id_in_db() |
| 254 | + trap_id_key_cf, trap_group_cf = "", "" |
| 255 | + if not trap_id_key_db: # If nothing is found, search in CONFIG_FILE |
| 256 | + trap_id_key_cf, trap_group_cf = self.__find_trap_id_in_conf_file() |
| 257 | + elif trap_id_key_db and not trap_group_db: |
| 258 | + _, trap_group_cf = self.__find_trap_id_in_conf_file(trap_id_key_db.split("|")[-1], False) |
| 259 | + |
| 260 | + # ------------------ Find any diff and fill the return dictionary with COPP_TRAP keys |
| 261 | + if trap_id_key_db: |
| 262 | + self.ret_temp["CONFIG_DB"]["keys"].append(trap_id_key_db) |
| 263 | + self.copp_trap_cfg_key = trap_id_key_db.split("|")[-1] |
| 264 | + id_in_file, _ = self.__find_trap_id_in_conf_file(self.copp_trap_cfg_key, False) |
| 265 | + if id_in_file == trap_id_key_db: # If any diff |
| 266 | + self.ret_temp["CONFIG_FILE"]["keys"].append(trap_id_key_db) |
| 267 | + elif trap_id_key_cf: |
| 268 | + self.ret_temp["CONFIG_FILE"]["keys"].append(trap_id_key_cf) |
| 269 | + self.copp_trap_cfg_key = trap_id_key_cf.split("|")[-1] |
| 270 | + id_in_file, _ = self.__find_trap_id_in_db(self.copp_trap_cfg_key, False) |
| 271 | + if id_in_file == trap_id_key_cf: # Find the diff, if any, inside the CONFIG DB |
| 272 | + self.ret_temp["CONFIG_DB"]["keys"].append(trap_id_key_cf) |
| 273 | + else: |
| 274 | + self.ret_temp["CONFIG_FILE"]["tables_not_found"].append(CFG_COPP_TRAP_TABLE_NAME) |
| 275 | + self.ret_temp["CONFIG_DB"]["tables_not_found"].append(CFG_COPP_TRAP_TABLE_NAME) |
| 276 | + |
| 277 | + # ------------------ Find any diff and fill the return dictionary with COPP_GROUP keys |
| 278 | + if trap_group_db: # Preference to User-provided Config |
| 279 | + self.trap_group = trap_group_db |
| 280 | + trap_in_cfg_file = False |
| 281 | + elif trap_group_cf: # Then, the preference to the group found in CFG_File |
| 282 | + self.trap_group = trap_group_cf |
| 283 | + trap_in_cfg_file = True |
| 284 | + else: |
| 285 | + self.ret_temp["CONFIG_FILE"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME) |
| 286 | + self.ret_temp["CONFIG_DB"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME) |
| 287 | + return |
| 288 | + tg_in_default = self.__fill_trap_group_in_conf_file(trap_in_cfg_file) # Check if the trap_group in cfg_file |
| 289 | + # Trap_group is expected to be in cfg_db when |
| 290 | + # 1) Trap_group is not found in cfg_file |
| 291 | + # 2) Trap_ID was provided by the user i.e trap_in_cfg_file = False |
| 292 | + # Otherwise, we're just looking for diff |
| 293 | + self.__fill_trap_group_in_conf_db(not(tg_in_default) and not(trap_in_cfg_file)) |
| 294 | + |
| 295 | + def __fill_trap_group_in_conf_file(self, not_found_report=True): |
| 296 | + req = MatchRequest(table=CFG_COPP_GROUP_TABLE_NAME, key_pattern=self.trap_group, ns=self.ns, file=Copp.CONFIG_FILE) |
| 297 | + ret = self.match_engine.fetch(req) |
| 298 | + key_tg = "" |
| 299 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 300 | + key_tg = ret["keys"][0] |
| 301 | + self.ret_temp["CONFIG_FILE"]["keys"].append(key_tg) |
| 302 | + return True |
| 303 | + elif not_found_report: |
| 304 | + self.ret_temp["CONFIG_FILE"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME) |
| 305 | + return False |
| 306 | + |
| 307 | + def __fill_trap_group_in_conf_db(self, not_found_report=True): |
| 308 | + req = MatchRequest(table=CFG_COPP_GROUP_TABLE_NAME, key_pattern=self.trap_group, ns=self.ns, db="CONFIG_DB") |
| 309 | + ret = self.match_engine.fetch(req) |
| 310 | + key_tg = "" |
| 311 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 312 | + key_tg = ret["keys"][0] |
| 313 | + self.ret_temp["CONFIG_DB"]["keys"].append(key_tg) |
| 314 | + return True |
| 315 | + elif not_found_report: |
| 316 | + self.ret_temp["CONFIG_DB"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME) |
| 317 | + return False |
| 318 | + |
| 319 | + def __find_trap_id_in_conf_file(self, key_ptrn="*", do_fv_check=True): |
| 320 | + field_, value_ = None, None |
| 321 | + if do_fv_check: |
| 322 | + field_ = "trap_ids" |
| 323 | + value_ = self.trap_id |
| 324 | + req = MatchRequest(file=Copp.CONFIG_FILE, table=CFG_COPP_TRAP_TABLE_NAME, key_pattern=key_ptrn, match_entire_list=False, |
| 325 | + ns=self.ns, return_fields=["trap_group"], field=field_, value=value_) |
| 326 | + ret = self.match_engine.fetch(req) |
| 327 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 328 | + if len(ret["keys"]) > 1: |
| 329 | + err_str = "ERROR (AMBIGUITY): Multiple COPP_TRAP Keys found for the trap_id {} in the copp_init file, i.e. {}".format(self.trap_id, str(ret["keys"])) |
| 330 | + handle_multiple_keys_matched_error(err_str, ret["keys"][0]) |
| 331 | + key_copp_trap = ret["keys"][0] |
| 332 | + return key_copp_trap, ret["return_values"][key_copp_trap]["trap_group"] |
| 333 | + else: |
| 334 | + return "", "" |
| 335 | + |
| 336 | + def __find_trap_id_in_db(self, key_ptrn="*", do_fv_check=True): |
| 337 | + field_, value_ = None, None |
| 338 | + if do_fv_check: |
| 339 | + field_ = "trap_ids" |
| 340 | + value_ = self.trap_id |
| 341 | + req = MatchRequest(db="CONFIG_DB", table=CFG_COPP_TRAP_TABLE_NAME, key_pattern=key_ptrn, match_entire_list=False, |
| 342 | + ns=self.ns, return_fields=["trap_group"], field=field_, value=value_) |
| 343 | + ret = self.match_engine.fetch(req) |
| 344 | + if not ret["error"] and len(ret["keys"]) > 0: |
| 345 | + if len(ret["keys"]) > 1: |
| 346 | + err_str = "Multiple COPP_TRAP Keys found for the trap_id {} in the CONFIG_DB, i.e. {}".format(self.trap_id, str(ret["keys"])) |
| 347 | + handle_multiple_keys_matched_error(err_str, ret["keys"][0]) |
| 348 | + key_copp_trap = ret["keys"][0] |
| 349 | + return key_copp_trap, ret["return_values"][key_copp_trap]["trap_group"] |
| 350 | + else: |
| 351 | + return "", "" |
0 commit comments