File: builder-cache-clobber.py

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (75 lines) | stat: -rwxr-xr-x 2,788 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python3
# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Clobbers all builder caches for a specific builder.

Note that this currently does not support windows.
"""

import argparse
import hashlib
import json
import sys

import clobber_cache_utils


def main(raw_args):
  parser = argparse.ArgumentParser()
  clobber_cache_utils.add_common_args(parser)
  parser.add_argument('--builder', required=True)
  parser.add_argument('--bucket', required=True)
  parser.add_argument('--project', default='chromium')
  parser.add_argument('--pool', default=None)
  parser.add_argument('--bot-id', default=None)
  parser.add_argument('--xcode-action',
                      choices=['warn', 'error', 'clobber'],
                      default='error',
                      help='Action to take if Xcode caches are detected. '
                      'warn: Xcode caches are removed from the bots. '
                      'error: Xcode caches are NOT removed from the bots. '
                      'clobber: Automatically clobber Xcode caches.')
  args = parser.parse_args(raw_args)

  # Always clobber the builder cache.
  # Matches http://bit.ly/2WZO33P
  string_to_hash = '%s/%s/%s' % (args.project, args.bucket, args.builder)
  h = hashlib.sha256(string_to_hash.encode('utf-8'))
  builder_cache = 'builder_%s_v2' % (h.hexdigest())
  pool = args.pool or 'luci.%s.%s' % (args.project, args.bucket)
  realm = '%s:%s' % (args.project, args.bucket)
  mount_rel_path = 'cache/builder'

  bots_state = clobber_cache_utils.confirm_and_trigger_clobber_bots(
      args.swarming_server, pool, realm, builder_cache, mount_rel_path,
      args.dry_run, args.bot_id)

  if not bots_state:
    return 1  # Exit when no bot can be found.

  xcode_caches_dict = clobber_cache_utils.get_xcode_caches_for_all_bots(
      bots_state)
  if xcode_caches_dict.values():
    message = (f'Some bots have Xcode caches:\n'
               f'{json.dumps(xcode_caches_dict, sort_keys=True, indent=2)}')
    if args.xcode_action == 'error':
      print(f'ERROR: {message}.\nUse --xcode-action to change.')
      return 1  # Exit
    if args.xcode_action == 'warn':
      print(f'WARNING: {message}')
    elif args.xcode_action == 'clobber':
      print(message)
    for bot_id, xcode_caches in xcode_caches_dict.items():
      for xcode_cache in xcode_caches:
        mount_rel_path = 'cache/%s' % xcode_cache
        clobber_cache_utils.trigger_clobber_cache(args.swarming_server, pool,
                                                  realm, xcode_cache, bot_id,
                                                  mount_rel_path, args.dry_run)

  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))