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