mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	Expands `clean-venv-cache` tool so that it can be used in prod. Also moves it from `tools/` to `scripts/`.
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
import argparse
 | 
						|
import datetime
 | 
						|
import os
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
import time
 | 
						|
 | 
						|
if False:
 | 
						|
    from typing import Set, Text
 | 
						|
 | 
						|
ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 | 
						|
sys.path.append(ZULIP_PATH)
 | 
						|
from scripts.lib.zulip_tools import GENERIC_CACHE_SCRIPT_PARSER, \
 | 
						|
    get_caches_to_be_purged, get_environment, get_recent_deployments
 | 
						|
 | 
						|
ENV = get_environment()
 | 
						|
VENV_CACHE_DIR = '/srv/zulip-venv-cache'
 | 
						|
if ENV == "travis":
 | 
						|
    VENV_CACHE_DIR = os.path.join(os.environ["HOME"], "zulip-venv-cache")
 | 
						|
 | 
						|
def parse_args():
 | 
						|
    # type: () -> argparse.Namespace
 | 
						|
    parser = argparse.ArgumentParser(description="This script cleans unused zulip venv caches.",
 | 
						|
                                     parents=[GENERIC_CACHE_SCRIPT_PARSER, ])
 | 
						|
    args = parser.parse_args()
 | 
						|
    return args
 | 
						|
 | 
						|
def get_caches_in_use(threshold_days):
 | 
						|
    # type: (int) -> Set[Text]
 | 
						|
    setups_to_check = set([ZULIP_PATH, ])
 | 
						|
    caches_in_use = set()
 | 
						|
    if ENV == "prod":
 | 
						|
        setups_to_check |= get_recent_deployments(threshold_days)
 | 
						|
    hash_reqs = os.path.join(ZULIP_PATH, 'scripts', 'lib', 'hash_reqs.py')
 | 
						|
    for path in setups_to_check:
 | 
						|
        for filename in os.listdir(os.path.join(path, "requirements")):
 | 
						|
            requirements_file = os.path.join(path, "requirements", filename)
 | 
						|
            hash_val = subprocess.check_output([hash_reqs, requirements_file]).strip()
 | 
						|
            caches_in_use.add(os.path.join(VENV_CACHE_DIR, hash_val.decode('utf-8')))
 | 
						|
    return caches_in_use
 | 
						|
 | 
						|
def main():
 | 
						|
    # type: () -> None
 | 
						|
    args = parse_args()
 | 
						|
 | 
						|
    all_caches = set([os.path.join(VENV_CACHE_DIR, cache) for cache in os.listdir(VENV_CACHE_DIR)])
 | 
						|
    caches_in_use = get_caches_in_use(args.threshold_days)
 | 
						|
    caches_to_purge = get_caches_to_be_purged(VENV_CACHE_DIR, caches_in_use, args.threshold_days)
 | 
						|
    caches_to_keep = all_caches - caches_to_purge
 | 
						|
 | 
						|
    if args.dry_run:
 | 
						|
        print("Performing a dry run...")
 | 
						|
    else:
 | 
						|
        print("Cleaning unused venv caches...")
 | 
						|
 | 
						|
    for cache_dir in caches_to_purge:
 | 
						|
        print("Cleaning unused venv %s" % (cache_dir,))
 | 
						|
        if not args.dry_run:
 | 
						|
            subprocess.check_call(["sudo", "rm", "-rf", cache_dir])
 | 
						|
 | 
						|
    for cache_dir in caches_to_keep:
 | 
						|
        print("Keeping used venv: %s" % (cache_dir,))
 | 
						|
 | 
						|
    print("Done!\n")
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |