diff options
Diffstat (limited to 'auto_delete_nightly_test_data.py')
-rwxr-xr-x | auto_delete_nightly_test_data.py | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/auto_delete_nightly_test_data.py b/auto_delete_nightly_test_data.py new file mode 100755 index 00000000..1d9853af --- /dev/null +++ b/auto_delete_nightly_test_data.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python2 +"""A crontab script to delete night test data.""" + +from __future__ import print_function + +__author__ = 'shenhan@google.com (Han Shen)' + +import argparse +import datetime +import os +import re +import sys + +from cros_utils import command_executer +from cros_utils import constants +from cros_utils import misc + +DIR_BY_WEEKDAY = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') + + +def CleanNumberedDir(s, dry_run=False): + """Deleted directories under each dated_dir.""" + chromeos_dirs = [ + os.path.join(s, x) for x in os.listdir(s) + if misc.IsChromeOsTree(os.path.join(s, x)) + ] + ce = command_executer.GetCommandExecuter(log_level='none') + all_succeeded = True + for cd in chromeos_dirs: + if misc.DeleteChromeOsTree(cd, dry_run=dry_run): + print('Successfully removed chromeos tree "{0}".'.format(cd)) + else: + all_succeeded = False + print('Failed to remove chromeos tree "{0}", please check.'.format(cd)) + + if not all_succeeded: + print('Failed to delete at least one chromeos tree, please check.') + return False + + ## Now delete the numbered dir Before forcibly removing the directory, just + ## check 's' to make sure it is sane. A valid dir to be removed must be + ## '/usr/local/google/crostc/(SUN|MON|TUE...|SAT)'. + valid_dir_pattern = ( + '^' + constants.CROSTC_WORKSPACE + '/(' + '|'.join(DIR_BY_WEEKDAY) + ')') + if not re.search(valid_dir_pattern, s): + print('Trying to delete an invalid dir "{0}" (must match "{1}"), ' + 'please check.'.format(s, valid_dir_pattern)) + return False + + cmd = 'rm -fr {0}'.format(s) + if dry_run: + print(cmd) + else: + if ce.RunCommand(cmd, print_to_console=False, terminated_timeout=480) == 0: + print('Successfully removed "{0}".'.format(s)) + else: + all_succeeded = False + print('Failed to remove "{0}", please check.'.format(s)) + return all_succeeded + + +def CleanDatedDir(dated_dir, dry_run=False): + # List subdirs under dir + subdirs = [ + os.path.join(dated_dir, x) for x in os.listdir(dated_dir) + if os.path.isdir(os.path.join(dated_dir, x)) + ] + all_succeeded = True + for s in subdirs: + if not CleanNumberedDir(s, dry_run): + all_succeeded = False + return all_succeeded + + +def ProcessArguments(argv): + """Process arguments.""" + parser = argparse.ArgumentParser( + description='Automatically delete nightly test data directories.', + usage='auto_delete_nightly_test_data.py options') + parser.add_argument( + '-d', + '--dry_run', + dest='dry_run', + default=False, + action='store_true', + help='Only print command line, do not execute anything.') + parser.add_argument( + '--days_to_preserve', + dest='days_to_preserve', + default=3, + help=('Specify the number of days (not including today),' + ' test data generated on these days will *NOT* be ' + 'deleted. Defaults to 3.')) + options = parser.parse_args(argv) + return options + + +def CleanChromeOsTmpFiles(chroot_tmp, days_to_preserve, dry_run): + rv = 0 + ce = command_executer.GetCommandExecuter() + # Clean chroot/tmp/test_that_* and chroot/tmp/tmpxxxxxx, that were last + # accessed more than specified time. + minutes = 1440 * days_to_preserve + cmd = (r'find {0} -maxdepth 1 -type d ' + r'\( -name "test_that_*" -amin +{1} -o ' + r' -name "cros-update*" -amin +{1} -o ' + r' -regex "{0}/tmp......" -amin +{1} \) ' + r'-exec bash -c "echo rm -fr {{}}" \; ' + r'-exec bash -c "rm -fr {{}}" \;').format(chroot_tmp, minutes) + if dry_run: + print('Going to execute:\n%s' % cmd) + else: + rv = ce.RunCommand(cmd, print_to_console=False) + if rv == 0: + print('Successfully cleaned chromeos tree tmp directory ' + '"{0}".'.format(chroot_tmp)) + else: + print('Some directories were not removed under chromeos tree ' + 'tmp directory -"{0}".'.format(chroot_tmp)) + + return rv + + +def CleanChromeOsImageFiles(chroot_tmp, subdir_suffix, days_to_preserve, + dry_run): + rv = 0 + rv2 = 0 + ce = command_executer.GetCommandExecuter() + minutes = 1440 * days_to_preserve + # Clean image tar files, which were last accessed 1 hour ago and clean image + # bin files that were last accessed more than specified time. + cmd = ('find {0}/*{1} -type f ' + r'\( -name "chromiumos_test_image.tar" -amin +60 -o ' + r' -name "chromiumos_test_image.tar.xz" -amin +60 -o ' + r' -name "chromiumos_test_image.bin" -amin +{2} \) ' + r'-exec bash -c "echo rm -f {{}}" \; ' + r'-exec bash -c "rm -f {{}}" \;').format(chroot_tmp, subdir_suffix, + minutes) + + if dry_run: + print('Going to execute:\n%s' % cmd) + else: + rv2 = ce.RunCommand(cmd, print_to_console=False) + if rv2 == 0: + print('Successfully cleaned chromeos images from ' + '"{0}/*{1}".'.format(chroot_tmp, subdir_suffix)) + else: + print('Some chromeos images were not removed from ' + '"{0}/*{1}".'.format(chroot_tmp, subdir_suffix)) + + rv += rv2 + + # Clean autotest files that were last accessed more than specified time. + rv2 = 0 + cmd = (r'find {0}/*{1} -maxdepth 2 -type d ' + r'\( -name "autotest_files" \) ' + r'-amin +{2} ' + r'-exec bash -c "echo rm -fr {{}}" \; ' + r'-exec bash -c "rm -fr {{}}" \;').format(chroot_tmp, subdir_suffix, + minutes) + if dry_run: + print('Going to execute:\n%s' % cmd) + else: + rv2 = ce.RunCommand(cmd, print_to_console=False) + if rv2 == 0: + print('Successfully cleaned chromeos image autotest directories from ' + '"{0}/*{1}".'.format(chroot_tmp, subdir_suffix)) + else: + print('Some image autotest directories were not removed from ' + '"{0}/*{1}".'.format(chroot_tmp, subdir_suffix)) + + rv += rv2 + return rv + + +def CleanChromeOsTmpAndImages(days_to_preserve=1, dry_run=False): + """Delete temporaries, images under crostc/chromeos.""" + chromeos_chroot_tmp = os.path.join(constants.CROSTC_WORKSPACE, 'chromeos', + 'chroot', 'tmp') + # Clean files in tmp directory + rv = CleanChromeOsTmpFiles(chromeos_chroot_tmp, days_to_preserve, dry_run) + # Clean image files in *-release directories + rv += CleanChromeOsImageFiles(chromeos_chroot_tmp, '-release', + days_to_preserve, dry_run) + # Clean image files in *-pfq directories + rv += CleanChromeOsImageFiles(chromeos_chroot_tmp, '-pfq', days_to_preserve, + dry_run) + + return rv + + +def Main(argv): + """Delete nightly test data directories, tmps and test images.""" + options = ProcessArguments(argv) + # Function 'isoweekday' returns 1(Monday) - 7 (Sunday). + d = datetime.datetime.today().isoweekday() + # We go back 1 week, delete from that day till we are + # options.days_to_preserve away from today. + s = d - 7 + e = d - int(options.days_to_preserve) + rv = 0 + for i in range(s + 1, e): + if i <= 0: + ## Wrap around if index is negative. 6 is from i + 7 - 1, because + ## DIR_BY_WEEKDAY starts from 0, while isoweekday is from 1-7. + dated_dir = DIR_BY_WEEKDAY[i + 6] + else: + dated_dir = DIR_BY_WEEKDAY[i - 1] + + rv += 0 if CleanDatedDir( + os.path.join(constants.CROSTC_WORKSPACE, dated_dir), + options.dry_run) else 1 + +## Finally clean temporaries, images under crostc/chromeos + rv2 = CleanChromeOsTmpAndImages( + int(options.days_to_preserve), options.dry_run) + + return rv + rv2 + +if __name__ == '__main__': + retval = Main(sys.argv[1:]) + sys.exit(retval) |