15350: Adds PySDK recipe to get a container request's state.
[arvados.git] / doc / sdk / python / cookbook.html.textile.liquid
1 ---
2 layout: default
3 navsection: sdk
4 navmenu: Python
5 title: Code cookbook
6 ...
7 {% comment %}
8 Copyright (C) The Arvados Authors. All rights reserved.
9
10 SPDX-License-Identifier: CC-BY-SA-3.0
11 {% endcomment %}
12
13 h2. Cancel a container request
14
15 {% codeblock as python %}
16 import arvados
17 arvados.api().container_requests().update(uuid=container_request_uuid, body={"priority": 0}).execute()
18 {% endcodeblock %}
19
20 h2. Cancel all container requests
21
22 {% codeblock as python %}
23 import arvados
24 api = arvados.api()
25 result = api.container_requests().list(filters=[["state", "=", "Committed"], ["priority", ">", "0"]]).execute()["items"]
26 for container_request in result:
27     api.container_requests().update(uuid=container_request["uuid"], body={"priority": 0}).execute()
28 {% endcodeblock %}
29
30 h2. List completed container requests
31
32 {% codeblock as python %}
33 import arvados
34 api = arvados.api()
35 result = api.container_requests().list(filters=[["name", "like", name], ["state", "=", "Final"]]).execute()["items"]
36 container_uuids = [cr["container_uuid"] for cr in result]
37 containers = api.containers().list(filters=[["uuid", "in", container_uuids]]).execute()["items"]
38 container_dict = {c["uuid"]: c for c in containers}
39
40 for container_request in result:
41     container = container_dict[container_request["container_uuid"]]
42     print("%s, %s, %s" % (container_request["uuid"], container_request["name"], "Success" if container["exit_code"] == 0 else "Failed"))
43 {% endcodeblock %}
44
45 h2. Get input of a CWL workflow
46
47 {% codeblock as python %}
48 import arvados
49 api = arvados.api()
50 container_request_uuid="qr1hi-xvhdp-zzzzzzzzzzzzzzz"
51 container_request = api.container_requests().get(uuid=container_request_uuid).execute()
52 print(container_request["mounts"]["/var/lib/cwl/cwl.input.json"])
53 {% endcodeblock %}
54
55 h2. Get output of a CWL workflow
56
57 {% codeblock as python %}
58 import arvados
59 import arvados.collection
60 api = arvados.api()
61 container_request_uuid="qr1hi-xvhdp-zzzzzzzzzzzzzzz"
62 container_request = api.container_requests().get(uuid=container_request_uuid).execute()
63 collection = arvados.collection.CollectionReader(container_request["output_uuid"])
64 print(collection.open("cwl.output.json").read())
65 {% endcodeblock %}
66
67 h2. Get state of a CWL workflow
68
69 {% codeblock as python %}
70 import arvados
71 def get_cr_state(cr_uuid):
72     api = arvados.api()
73     cr = api.container_requests().get(uuid=cr_uuid).execute()
74     if cr['container_uuid'] is None:
75         return cr['state']
76     c = api.containers().get(uuid=cr['container_uuid']).execute()
77     if cr['state'] == 'Final' and c['state'] != 'Complete':
78         return 'Cancelled'
79     elif c['state'] in ['Locked', 'Queued']:
80         if c['priority'] == 0:
81             return 'On hold'
82         else:
83             return 'Queued'
84     elif c['state'] == 'Complete':
85         if c['exit_code'] == 0:
86             return c['state']
87         else:
88             return 'Failed'
89     elif c['state'] == 'Running':
90         if c['runtime_status'].get('error', None):
91             return 'Failing'
92         elif c['runtime_status'].get('warning', None):
93             return 'Warning'
94         else:
95             return c['state']
96     return c['state']
97 container_request_uuid = 'qr1hi-xvhdp-zzzzzzzzzzzzzzz'
98 print(get_cr_state(container_request_uuid))
99 {% endcodeblock %}
100
101 h2. List input of child requests
102
103 {% codeblock as python %}
104 import arvados
105 api = arvados.api()
106 parent_request_uuid = "qr1hi-xvhdp-zzzzzzzzzzzzzzz"
107 namefilter = "bwa%"  # the "like" filter uses SQL pattern match syntax
108 container_request = api.container_requests().get(uuid=parent_request_uuid).execute()
109 parent_container_uuid = container_request["container_uuid"]
110 child_requests = api.container_requests().list(filters=[
111     ["requesting_container_uuid", "=", parent_container_uuid],
112     ["name", "like", namefilter]]).execute()
113 for c in child_requests["items"]:
114     print("%s" % c["name"])
115     for m in c["mounts"].values():
116         if "portable_data_hash" in m:
117             print("  %s" % m["portable_data_hash"])
118 {% endcodeblock %}
119
120 h2. List output of child requests
121
122 {% codeblock as python %}
123 import arvados
124 api = arvados.api()
125 parent_request_uuid = "qr1hi-xvhdp-zzzzzzzzzzzzzzz"
126 namefilter = "bwa%"  # the "like" filter uses SQL pattern match syntax
127 container_request = api.container_requests().get(uuid=parent_request_uuid).execute()
128 parent_container_uuid = container_request["container_uuid"]
129 child_requests = api.container_requests().list(filters=[
130     ["requesting_container_uuid", "=", parent_container_uuid],
131     ["name", "like", namefilter]]).execute()
132 output_uuids = [c["output_uuid"] for c in child_requests["items"]]
133 collections = api.collections().list(filters=[["uuid", "in", output_uuids]]).execute()
134 uuid_to_pdh = {c["uuid"]: c["portable_data_hash"] for c in collections["items"]}
135 for c in child_requests["items"]:
136     print("%s -> %s" % (c["name"], uuid_to_pdh[c["output_uuid"]]))
137 {% endcodeblock %}
138
139 h2. List failed child requests
140
141 {% codeblock as python %}
142 import arvados
143 api = arvados.api()
144 parent_request_uuid = "qr1hi-xvhdp-zzzzzzzzzzzzzzz"
145 container_request = api.container_requests().get(uuid=parent_request_uuid).execute()
146 parent_container_uuid = container_request["container_uuid"]
147 child_requests = api.container_requests().list(filters=[
148     ["requesting_container_uuid", "=", parent_container_uuid]], limit=1000).execute()
149 child_containers = {c["container_uuid"]: c for c in child_requests["items"]}
150 cancelled_child_containers = api.containers().list(filters=[
151     ["exit_code", "!=", "0"],
152     ["uuid", "in", child_containers.keys()]], limit=1000).execute()
153 for c in cancelled_child_containers["items"]:
154     print("%s (%s)" % (child_containers[c["uuid"]]["name"], child_containers[c["uuid"]]["uuid"]))
155 {% endcodeblock %}
156
157 h2. Get log of a child request
158
159 {% codeblock as python %}
160 import arvados
161 import arvados.collection
162 api = arvados.api()
163 container_request_uuid = "qr1hi-xvhdp-zzzzzzzzzzzzzzz"
164 container_request = api.container_requests().get(uuid=container_request_uuid).execute()
165 collection = arvados.collection.CollectionReader(container_request["log_uuid"])
166 for c in collection:
167     print(collection.open(c).read())
168 {% endcodeblock %}
169
170 h2. Create a collection sharing link
171
172 {% codeblock as python %}
173 import arvados
174 api = arvados.api()
175 download="https://your.download.server"
176 collection_uuid="qr1hi-4zz18-zzzzzzzzzzzzzzz"
177 token = api.api_client_authorizations().create(body={"api_client_authorization":{"scopes": [
178     "GET /arvados/v1/collections/%s" % collection_uuid,
179     "GET /arvados/v1/collections/%s/" % collection_uuid,
180     "GET /arvados/v1/keep_services/accessible"]}}).execute()
181 print("%s/c=%s/t=%s/_/" % (download, collection_uuid, token["api_token"]))
182 {% endcodeblock %}
183
184 h2. Combine two or more collections
185
186 Note, if two collections have files of the same name, the contents will be concatenated in the resulting manifest.
187
188 {% codeblock as python %}
189 import arvados
190 import arvados.collection
191 api = arvados.api()
192 project_uuid = "qr1hi-tpzed-zzzzzzzzzzzzzzz"
193 collection_uuids = ["qr1hi-4zz18-aaaaaaaaaaaaaaa", "qr1hi-4zz18-bbbbbbbbbbbbbbb"]
194 combined_manifest = ""
195 for u in collection_uuids:
196     c = api.collections().get(uuid=u).execute()
197     combined_manifest += c["manifest_text"]
198 newcol = arvados.collection.Collection(combined_manifest)
199 newcol.save_new(name="My combined collection", owner_uuid=project_uuid)
200 {% endcodeblock %}
201
202 h2. Upload a file into a new collection
203
204 {% codeblock as python %}
205 import arvados
206 import arvados.collection
207
208 project_uuid = "qr1hi-j7d0g-zzzzzzzzzzzzzzz"
209 collection_name = "My collection"
210 filename = "file1.txt"
211
212 api = arvados.api()
213 c = arvados.collection.Collection()
214 with open(filename, "rb") as reader:
215     with c.open(filename, "wb") as writer:
216         content = reader.read(128*1024)
217         while content:
218             writer.write(content)
219             content = reader.read(128*1024)
220 c.save_new(name=collection_name, owner_uuid=project_uuid)
221 print("Saved %s to %s" % (collection_name, c.manifest_locator()))
222 {% endcodeblock %}
223
224 h2. Download a file from a collection
225
226 {% codeblock as python %}
227 import arvados
228 import arvados.collection
229
230 collection_uuid = "qr1hi-4zz18-zzzzzzzzzzzzzzz"
231 filename = "file1.txt"
232
233 api = arvados.api()
234 c = arvados.collection.CollectionReader(collection_uuid)
235 with c.open(filename, "rb") as reader:
236     with open(filename, "wb") as writer:
237         content = reader.read(128*1024)
238         while content:
239             writer.write(content)
240             content = reader.read(128*1024)
241 print("Finished downloading %s" % filename)
242 {% endcodeblock %}