xref: /aosp_15_r20/external/perfetto/tools/delete_permalink (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard Worker"""A tool to delete permalinks and traces behind them.
4*6dbdd20aSAndroid Build Coastguard Worker
5*6dbdd20aSAndroid Build Coastguard WorkerTo be used by the Perfetto team, who has write access to the GCS bucket.
6*6dbdd20aSAndroid Build Coastguard Worker"""
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard Workerimport json
9*6dbdd20aSAndroid Build Coastguard Workerimport logging
10*6dbdd20aSAndroid Build Coastguard Workerimport re
11*6dbdd20aSAndroid Build Coastguard Workerimport subprocess
12*6dbdd20aSAndroid Build Coastguard Workerimport sys
13*6dbdd20aSAndroid Build Coastguard Worker
14*6dbdd20aSAndroid Build Coastguard Workerfrom typing import List
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard WorkerGCS_BUCKET = 'perfetto-ui-data'
17*6dbdd20aSAndroid Build Coastguard WorkerGCS_HTTP = 'https://storage.googleapis.com/%s/' % GCS_BUCKET
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Workerdef delete_gcs_obj(url: str, gcs_delete_list: List[str]):
21*6dbdd20aSAndroid Build Coastguard Worker  if not url.startswith(GCS_HTTP):
22*6dbdd20aSAndroid Build Coastguard Worker    logging.error('The URL %s should start with %s', url, GCS_HTTP)
23*6dbdd20aSAndroid Build Coastguard Worker    return
24*6dbdd20aSAndroid Build Coastguard Worker  gs_url = 'gs://%s/%s' % (GCS_BUCKET, url[len(GCS_HTTP):])
25*6dbdd20aSAndroid Build Coastguard Worker  gcs_delete_list.append(gs_url)
26*6dbdd20aSAndroid Build Coastguard Worker
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Workerdef delete_permalink_uuid(uuid: str, gcs_delete_list: List[str]):
29*6dbdd20aSAndroid Build Coastguard Worker  state_url = GCS_HTTP + uuid
30*6dbdd20aSAndroid Build Coastguard Worker  delete_gcs_obj(state_url, gcs_delete_list)
31*6dbdd20aSAndroid Build Coastguard Worker  state_json = subprocess.check_output(['curl', '-Ls', state_url])
32*6dbdd20aSAndroid Build Coastguard Worker  state = json.loads(state_json)
33*6dbdd20aSAndroid Build Coastguard Worker  trace_url = state['engine']['source']['url']
34*6dbdd20aSAndroid Build Coastguard Worker  delete_gcs_obj(trace_url, gcs_delete_list)
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Workerdef main():
38*6dbdd20aSAndroid Build Coastguard Worker  gcs_delete_list = []
39*6dbdd20aSAndroid Build Coastguard Worker  if sys.stdin.isatty():
40*6dbdd20aSAndroid Build Coastguard Worker    logging.warn('This tool expects a list of uuids or https://ui.perfetto.dev/#!#?s=deadbeef')
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Worker  for line in sys.stdin.readlines():
43*6dbdd20aSAndroid Build Coastguard Worker    line = line.strip()
44*6dbdd20aSAndroid Build Coastguard Worker    m = re.match(r'.*?\b([a-f0-9]{64})', line)
45*6dbdd20aSAndroid Build Coastguard Worker    if not m:
46*6dbdd20aSAndroid Build Coastguard Worker      logging.error('Could not find a 64 hex UUID from %s', line)
47*6dbdd20aSAndroid Build Coastguard Worker      continue
48*6dbdd20aSAndroid Build Coastguard Worker    uuid = m.group(1)
49*6dbdd20aSAndroid Build Coastguard Worker    delete_permalink_uuid(uuid, gcs_delete_list)
50*6dbdd20aSAndroid Build Coastguard Worker
51*6dbdd20aSAndroid Build Coastguard Worker  if len(gcs_delete_list) == 0:
52*6dbdd20aSAndroid Build Coastguard Worker    logging.info('No object to delete, quitting without taking any action')
53*6dbdd20aSAndroid Build Coastguard Worker    return 0
54*6dbdd20aSAndroid Build Coastguard Worker
55*6dbdd20aSAndroid Build Coastguard Worker  print('Removing the following objects:')
56*6dbdd20aSAndroid Build Coastguard Worker  for gs_uri in gcs_delete_list:
57*6dbdd20aSAndroid Build Coastguard Worker    print('  ', gs_uri)
58*6dbdd20aSAndroid Build Coastguard Worker  subprocess.check_call(['gsutil', '-m', 'rm', '-f', '-a'] + gcs_delete_list)
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard Worker
61*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__':
62*6dbdd20aSAndroid Build Coastguard Worker  sys.exit(main())
63