2 # Copyright (C) The Arvados Authors. All rights reserved.
4 # SPDX-License-Identifier: AGPL-3.0
12 def keyset_list_all(fn, order_key="created_at", num_retries=0, ascending=True, **kwargs):
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", [])
19 if "select" in kwargs and "uuid" not in kwargs["select"]:
20 kwargs["select"].append("uuid")
24 expect_full_page = True
28 prev_page_all_same_order_key = False
31 kwargs["filters"] = nextpage+other_filters
32 items = fn(**kwargs).execute(num_retries=num_retries)
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
42 seen_prevpage = seen_thispage
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:
51 seen_thispage.add(i["uuid"])
54 firstitem = items["items"][0]
55 lastitem = items["items"][-1]
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
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
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)
80 args = parse_arguments(arguments)
84 events = keyset_list_all(arv.logs().list, filters=[["created_at", ">=", "2020-11-05T14:51:42-05:00"]])
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")
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")
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")
101 for k,v in users.items():