def CopyTechSupportFiles(naples_nodes, techsupport_files, log_dir): req = api.Trigger_CreateExecuteCommandsRequest() for node in naples_nodes: api.Trigger_AddNaplesCommand(req, node, "ls /data/techsupport/") for file in techsupport_files: cmd = "chmod 666 %s" % file api.Trigger_AddNaplesCommand(req, node, cmd) resp = api.Trigger(req) for cmd_resp in resp.commands: api.PrintCommandResults(cmd_resp) for node in naples_nodes: resp = api.CopyFromNaples(node, techsupport_files, log_dir) if resp == None or resp.api_response.api_status != types_pb2.API_STATUS_OK: api.Logger.info( "Failed to copy tech-support file(s) to logdir:%s" % (log_dir)) return api.types.status.FAILURE for file in techsupport_files: cmd = "mv " + log_dir + "/" + os.path.basename( file) + " " + log_dir + "/" + os.path.basename( file) + "-" + node #Rename file based on node api.Logger.info("executing cmd %s" % cmd) os.system(cmd) return api.types.status.SUCCESS
def collect_techsupports(tc): result = True if tc.resp is None: api.Logger.error("Failed to trigger techsupport requests") return False tc.techsupportTarBalls = [] for cmd in tc.resp.commands: node = cmd.node_name if cmd.exit_code != 0: api.PrintCommandResults(cmd) api.Logger.error(f"Failed to collect techsupport for {node}") result = False else: ts_file = get_techsupport_file(cmd.stdout) if api.GlobalOptions.dryrun: continue if ts_file is None: api.Logger.error(f"Failed to parse techsupport op for {node}") result = False continue if not naples_utils.ChangeFilesPermission([node], [ts_file]): api.Logger.error(f"Failed to fix perm for techsupport on {node}") result = False continue # copy out the generated techsupport tarball from naples api.Logger.debug(f"Copying out {ts_file} from {node} to {tc.dir}") cur_dir = api.GetCurrentDirectory() api.ChangeDirectory("/") api.CopyFromNaples(node, [ts_file], tc.dir, naples=None, via_oob=True) tc.techsupportTarBalls.append(tc.dir+ts_utils.GetTechsupportFilename(ts_file)) api.ChangeDirectory(cur_dir) return result
def trigger_techsupport_request(tc): result = ts_utils.DeleteTSDir(tc.nodes) if result != True: api.Logger.error( "Failed to clean techsupport in naples before request") return result # get testcase directory to copy out generated techsupports tc_dir = tc.GetLogsDir() tc.techsupportTarBalls = [] for node in tc.nodes: # initiate techsupport collect request ts_obj = OperClient.GetTechSupportObject(node) ts_obj.SetSkipCores(tc.skipcores) ts_file = ts_obj.Collect() api.Logger.debug( f"Collecting techsupport from {node} skipcores {tc.skipcores}") if api.GlobalOptions.dryrun: continue if ts_file is None: api.Logger.error(f"Failed to collect techsupport for {node}") result = False continue api.Logger.debug(f"Copying out {ts_file} from {node} to {tc_dir}") # copy out the generated techsupport tarball from naples api.CopyFromNaples(node, [ts_file], tc_dir, naples=None, via_oob=True) tc.techsupportTarBalls.append(tc_dir + ts_utils.GetTechsupportFilename(ts_file)) api.Logger.verbose(f"TS: collected techsupports {tc.techsupportTarBalls}") return result
def GetUpgLog(nodes, log_dir): nodes = nodes if nodes else api.GetNaplesHostnames() file_name = f"{log_dir}/{__UPG_LOG_FNAME}" for node in nodes: api.CopyFromNaples(node, [__UPG_LOG_PATH], log_dir, via_oob=True) if os.path.exists(file_name): os.rename(file_name, __get_upg_log_fname_from_node(node, log_dir)) else: api.Logger.error( f"Upgrade logs for {node} not found @ {file_name}") return api.types.status.FAILURE return api.types.status.SUCCESS
def GetUpgLog(nodes, log_dir): nodes = nodes if nodes else api.GetNaplesWorkloads() file_name = f"{log_dir}/{__upg_log_fname}" for node in nodes: if __dhcp_oob_mnic0([node]) != api.types.status.SUCCESS: return api.types.status.FAILURE api.CopyFromNaples(node, [__upg_log_path], log_dir, via_oob=True) if os.path.exists(file_name): os.rename(file_name, __get_upg_log_fname_from_node(node, log_dir)) else: api.Logger.error( f"Upgrade logs for {node} not found @ {file_name}") return api.types.status.FAILURE return api.types.status.SUCCESS
def HitlessAddUpgTestAppToJson(node, naples_json_dir): file = 'upgrade_hitless.json' tmp_dir = f"/tmp/{node}/" # remove already existing one if there are any if os.path.exists(f"{tmp_dir}/{file}"): os.remove(f"{tmp_dir}/{file}") # copy hitless.json from naples api.CopyFromNaples(node, [f"{naples_json_dir}/{file}"], f"{tmp_dir}", via_oob=True) if api.GlobalOptions.dryrun: return api.types.status.SUCCESS if not os.path.exists(f"{tmp_dir}/{file}"): api.Logger.error(f"Upgrade json for {node} not found @ {file}") return api.types.status.FAILURE # delete from the host req = api.Trigger_CreateAllParallelCommandsRequest() api.Trigger_AddHostCommand(req, node, f"rm -f {file}") resp = api.Trigger(req) file = f"{tmp_dir}/{file}" cmd = "cp %s %s.org && " % (file, file) # add upgtestapp to the discovery and serial list cmd = cmd + '''awk ' BEGIN { found=0;line=0 } /"upg_svc"/ { found=1;line=0 } /.*/ { if (found == 1 && line == 1) print " \\\"upgtestapp\\\"," } /.*/ { print $0;line=line+1 } ' %s.org > %s && ''' % (file, file) cmd = cmd + '''sed -i 's/"svc_sequence" : "\([a-z:].*\)"/"svc_sequence" : "\\1:upgtestapp"/' "%s"''' % ( file) rv = subprocess.call(cmd, shell=True) if rv != 0: api.Logger.error(f"Upgrade hitless json modify {cmd} failed") return api.types.status.FAILURE # copy the modified json back resp = api.CopyToNaples(node, [file], "", naples_dir=f"{naples_json_dir}", via_oob=True) if resp.api_response.api_status != types_pb2.API_STATUS_OK: return api.types.status.FAILURE return api.types.status.SUCCESS