17022: Start work on user activity reporting script
[arvados.git] / tools / user-activity / arv-user-activity.py
1 #!/usr/bin/env python3
2 # Copyright (C) The Arvados Authors. All rights reserved.
3 #
4 # SPDX-License-Identifier: AGPL-3.0
5
6 import argparse
7 import sys
8
9 import arvados
10 import arvados.util
11
12 def keyset_list_all(fn, order_key="created_at", num_retries=0, ascending=True, **kwargs):
13     pagesize = 1000
14     kwargs["limit"] = pagesize
15     kwargs["count"] = 'none'
16     kwargs["order"] = ["%s %s" % (order_key, "asc" if ascending else "desc"), "uuid asc"]
17     other_filters = kwargs.get("filters", [])
18
19     if "select" in kwargs and "uuid" not in kwargs["select"]:
20         kwargs["select"].append("uuid")
21
22     nextpage = []
23     tot = 0
24     expect_full_page = True
25     seen_prevpage = set()
26     seen_thispage = set()
27     lastitem = None
28     prev_page_all_same_order_key = False
29
30     while True:
31         kwargs["filters"] = nextpage+other_filters
32         items = fn(**kwargs).execute(num_retries=num_retries)
33
34         if len(items["items"]) == 0:
35             if prev_page_all_same_order_key:
36                 nextpage = [[order_key, ">" if ascending else "<", lastitem[order_key]]]
37                 prev_page_all_same_order_key = False
38                 continue
39             else:
40                 return
41
42         seen_prevpage = seen_thispage
43         seen_thispage = set()
44
45         for i in items["items"]:
46             # In cases where there's more than one record with the
47             # same order key, the result could include records we
48             # already saw in the last page.  Skip them.
49             if i["uuid"] in seen_prevpage:
50                 continue
51             seen_thispage.add(i["uuid"])
52             yield i
53
54         firstitem = items["items"][0]
55         lastitem = items["items"][-1]
56
57         if firstitem[order_key] == lastitem[order_key]:
58             # Got a page where every item has the same order key.
59             # Switch to using uuid for paging.
60             nextpage = [[order_key, "=", lastitem[order_key]], ["uuid", ">", lastitem["uuid"]]]
61             prev_page_all_same_order_key = True
62         else:
63             # Start from the last order key seen, but skip the last
64             # known uuid to avoid retrieving the same row twice.  If
65             # there are multiple rows with the same order key it is
66             # still likely we'll end up retrieving duplicate rows.
67             # That's handled by tracking the "seen" rows for each page
68             # so they can be skipped if they show up on the next page.
69             nextpage = [[order_key, ">=" if ascending else "<=", lastitem[order_key]], ["uuid", "!=", lastitem["uuid"]]]
70             prev_page_all_same_order_key = False
71
72
73 def parse_arguments(arguments):
74     arg_parser = argparse.ArgumentParser()
75     arg_parser.add_argument('--timespan', type=str)
76     args = arg_parser.parse_args(arguments)
77     return args
78
79 def main(arguments):
80     args = parse_arguments(arguments)
81
82     arv = arvados.api()
83
84     events = keyset_list_all(arv.logs().list, filters=[["created_at", ">=", "2020-11-05T14:51:42-05:00"]])
85
86     users = {}
87
88     for e in events:
89         if e["event_type"] == "create" and e["object_uuid"][6:11] == "tpzed":
90             users.setdefault(e["object_uuid"], [])
91             users[e["object_uuid"]].append("User was created")
92
93         if e["event_type"] == "create" and e["object_uuid"][6:11] == "xvhdp":
94             users.setdefault(e["object_owner_uuid"], [])
95             users[e["object_owner_uuid"]].append("Ran a container")
96
97         if e["event_type"] == "create" and e["object_uuid"][6:11] == "j7d0g":
98             users.setdefault(e["object_owner_uuid"], [])
99             users[e["object_owner_uuid"]].append("Created a project")
100
101     for k,v in users.items():
102         print("%s:" % k)
103         for ev in v:
104             print("  %s" % ev)
105
106
107 main(sys.argv[1:])