def run_command()

in src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py [0:0]


    def run_command(self, daemon, table, data, prefix_list=None, *upper_vals):
        start_idx = len(upper_vals)
        ret_val = False
        run_cmd_cnt = 0
        for db_field, key_map in self:
            merge_vals = False
            if type(db_field) is not list and type(db_field) is not tuple:
                db_field = [db_field]
            elif type(db_field) is tuple:
                db_field = list(db_field)
                merge_vals = True

            idx = 0
            req_idx_list = []
            key_list_list = []
            opt_idx_list = set()
            run_cmd = True
            for dkey in db_field:
                optional = False
                if len(dkey) > 0 and dkey[0] == '+':
                    if len(dkey) > 1 and dkey[1] == '+':
                        opt_idx_list.add(idx)
                        dkey = dkey[2:]
                    else:
                        dkey = dkey[1:]
                    optional = True
                else:
                    req_idx_list.append(idx)
                key_list = []
                for k in dkey.split('&'):
                    if k in data and isinstance(data[k], CachedDataWithOp):
                        key_list.append(k)
                if not optional and len(key_list) == 0:
                    run_cmd = False
                    break
                if len(key_list) == 0:
                    if len(key_list_list) == 0:
                        key_list_list.append([None])
                    else:
                        for k_lst in key_list_list:
                            k_lst.append(None)
                else:
                    new_list = []
                    if len(key_list_list) == 0:
                        for k in key_list:
                            key_list_list.append([k])
                    else:
                        for k_lst in key_list_list:
                            if len(key_list) == 1:
                                k_lst.append(key_list[0])
                            else:
                                for k in key_list:
                                    new_list.append(k_lst + [k])
                    if len(new_list) > 0:
                        key_list_list = new_list
                idx += 1
            if not run_cmd:
                continue

            cmd_list_list = []
            for key_list in key_list_list:
                upd_id_list = set()
                del_id_list = set()
                no_chg_id_list = set()
                idx = 0
                for dkey in key_list:
                    if dkey is not None:
                        dval = data[dkey]
                        if dval.op == CachedDataWithOp.OP_NONE:
                            no_chg_id_list.add(idx)
                        elif dval.op == CachedDataWithOp.OP_ADD or dval.op == CachedDataWithOp.OP_UPDATE:
                            upd_id_list.add(idx)
                        elif dval.op == CachedDataWithOp.OP_DELETE:
                            del_id_list.add(idx)
                    idx += 1
                cmd_list = []
                if len(del_id_list) > 0:
                    data_val_op = self.get_cmd_data(key_list, req_idx_list, opt_idx_list, data, del_id_list, no_chg_id_list, merge_vals, True)
                    if data_val_op is not None:
                        cmd = key_map.get_command(daemon, data_val_op[1], start_idx, *(upper_vals + data_val_op[0]))
                        if cmd is not None:
                            cmd_list += cmd
                        else:
                            syslog.syslog(syslog.LOG_ERR, 'failed to get del cmd from value: %s' % data_val_op[0])
                if len(upd_id_list) > 0:
                    data_val_op = self.get_cmd_data(key_list, req_idx_list, opt_idx_list, data, upd_id_list, no_chg_id_list, merge_vals, False)
                    if data_val_op is not None:
                        cmd = key_map.get_command(daemon, data_val_op[1], start_idx, *(upper_vals + data_val_op[0]))
                        if cmd is not None:
                            cmd_list += cmd
                        else:
                            syslog.syslog(syslog.LOG_ERR, 'failed to get upd cmd from value: %s' % str(data_val_op[0]))
                if len(cmd_list) > 0:
                    cmd_list_list.append(cmd_list)
            cmd_list = []
            for chk_list in cmd_list_list:
               if self.is_cmd_list_covered(cmd_list, chk_list):
                   cmd_list = chk_list
            failed = False
            if len(cmd_list) > 0:
                run_cmd_cnt += 1
                cmd_prefix = 'vtysh '
                for pfx in prefix_list:
                    cmd_prefix += "-c '%s' " % pfx
                for cmd in cmd_list:
                    ignore_fail = False
                    if type(cmd) is tuple:
                        cmd, ignore_fail = cmd
                    if not g_run_command(table, cmd_prefix + "-c '%s'" % cmd, True, key_map.daemons, ignore_fail):
                        syslog.syslog(syslog.LOG_ERR, 'failed running FRR command: %s' % cmd)
                        failed = True
                        break
                if not failed:
                    ret_val = True
            if not failed:
                for key_list in key_list_list:
                    for dkey in key_list:
                        if dkey in data:
                            data[dkey].status = CachedDataWithOp.STAT_SUCC
        if run_cmd_cnt == 0:
            return True
        return ret_val