def create_main_work_dir(args): """ Create and return the pilot's main work directory. The function also sets args.mainworkdir and cd's into this directory. :param args: pilot arguments object. :return: exit code (int), main work directory (string). """ exit_code = 0 if args.workdir != "": mainworkdir = get_pilot_work_dir(args.workdir) try: # create the main PanDA Pilot work directory mkdirs(mainworkdir) except PilotException as error: # print to stderr since logging has not been established yet print('failed to create workdir at %s -- aborting: %s' % (mainworkdir, error), file=sys.stderr) exit_code = shell_exit_code(error._errorCode) else: mainworkdir = getcwd() args.mainworkdir = mainworkdir chdir(mainworkdir) return exit_code, mainworkdir
def wrap_up(initdir, mainworkdir, args): """ Perform cleanup and terminate logging. :param initdir: launch directory (string). :param mainworkdir: main work directory (string). :param args: pilot arguments object. :return: exit code (int). """ exit_code = 0 # cleanup pilot workdir if created if initdir != mainworkdir and args.cleanup: chdir(initdir) try: rmtree(mainworkdir) except Exception as e: logging.warning("failed to remove %s: %s", mainworkdir, e) else: logging.info("removed %s", mainworkdir) # in Harvester mode, create a kill_worker file that will instruct Harvester that the pilot has finished if args.harvester: from pilot.util.harvester import kill_worker kill_worker() try: exit_code = trace.pilot['error_code'] except Exception: exit_code = trace else: logging.info('traces error code: %d', exit_code) if trace.pilot['nr_jobs'] <= 1: if exit_code != 0: logging.info( 'an exit code was already set: %d (will be converted to a standard shell code)', exit_code) elif trace.pilot['nr_jobs'] > 0: if trace.pilot['nr_jobs'] == 1: logging.getLogger(__name__).info( 'pilot has finished (%d job was processed)', trace.pilot['nr_jobs']) else: logging.getLogger(__name__).info( 'pilot has finished (%d jobs were processed)', trace.pilot['nr_jobs']) exit_code = SUCCESS elif trace.pilot['state'] == FAILURE: logging.critical('pilot workflow failure -- aborting') elif trace.pilot['state'] == ERRNO_NOJOBS: logging.critical('pilot did not process any events -- aborting') exit_code = ERRNO_NOJOBS logging.info('pilot has finished') logging.shutdown() return shell_exit_code(exit_code)