ciocore 5.1.1__py2.py3-none-any.whl → 10.0.0b3__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. ciocore/VERSION +1 -1
  2. ciocore/__init__.py +23 -1
  3. ciocore/api_client.py +655 -160
  4. ciocore/auth/__init__.py +5 -3
  5. ciocore/cli.py +501 -0
  6. ciocore/common.py +15 -13
  7. ciocore/conductor_submit.py +77 -60
  8. ciocore/config.py +127 -13
  9. ciocore/data.py +162 -77
  10. ciocore/docsite/404.html +746 -0
  11. ciocore/docsite/apidoc/api_client/index.html +3605 -0
  12. ciocore/docsite/apidoc/apidoc/index.html +909 -0
  13. ciocore/docsite/apidoc/config/index.html +1652 -0
  14. ciocore/docsite/apidoc/data/index.html +1553 -0
  15. ciocore/docsite/apidoc/hardware_set/index.html +2460 -0
  16. ciocore/docsite/apidoc/package_environment/index.html +1507 -0
  17. ciocore/docsite/apidoc/package_tree/index.html +2386 -0
  18. ciocore/docsite/assets/_mkdocstrings.css +16 -0
  19. ciocore/docsite/assets/images/favicon.png +0 -0
  20. ciocore/docsite/assets/javascripts/bundle.471ce7a9.min.js +29 -0
  21. ciocore/docsite/assets/javascripts/bundle.471ce7a9.min.js.map +7 -0
  22. ciocore/docsite/assets/javascripts/lunr/min/lunr.ar.min.js +1 -0
  23. ciocore/docsite/assets/javascripts/lunr/min/lunr.da.min.js +18 -0
  24. ciocore/docsite/assets/javascripts/lunr/min/lunr.de.min.js +18 -0
  25. ciocore/docsite/assets/javascripts/lunr/min/lunr.du.min.js +18 -0
  26. ciocore/docsite/assets/javascripts/lunr/min/lunr.el.min.js +1 -0
  27. ciocore/docsite/assets/javascripts/lunr/min/lunr.es.min.js +18 -0
  28. ciocore/docsite/assets/javascripts/lunr/min/lunr.fi.min.js +18 -0
  29. ciocore/docsite/assets/javascripts/lunr/min/lunr.fr.min.js +18 -0
  30. ciocore/docsite/assets/javascripts/lunr/min/lunr.he.min.js +1 -0
  31. ciocore/docsite/assets/javascripts/lunr/min/lunr.hi.min.js +1 -0
  32. ciocore/docsite/assets/javascripts/lunr/min/lunr.hu.min.js +18 -0
  33. ciocore/docsite/assets/javascripts/lunr/min/lunr.hy.min.js +1 -0
  34. ciocore/docsite/assets/javascripts/lunr/min/lunr.it.min.js +18 -0
  35. ciocore/docsite/assets/javascripts/lunr/min/lunr.ja.min.js +1 -0
  36. ciocore/docsite/assets/javascripts/lunr/min/lunr.jp.min.js +1 -0
  37. ciocore/docsite/assets/javascripts/lunr/min/lunr.kn.min.js +1 -0
  38. ciocore/docsite/assets/javascripts/lunr/min/lunr.ko.min.js +1 -0
  39. ciocore/docsite/assets/javascripts/lunr/min/lunr.multi.min.js +1 -0
  40. ciocore/docsite/assets/javascripts/lunr/min/lunr.nl.min.js +18 -0
  41. ciocore/docsite/assets/javascripts/lunr/min/lunr.no.min.js +18 -0
  42. ciocore/docsite/assets/javascripts/lunr/min/lunr.pt.min.js +18 -0
  43. ciocore/docsite/assets/javascripts/lunr/min/lunr.ro.min.js +18 -0
  44. ciocore/docsite/assets/javascripts/lunr/min/lunr.ru.min.js +18 -0
  45. ciocore/docsite/assets/javascripts/lunr/min/lunr.sa.min.js +1 -0
  46. ciocore/docsite/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +1 -0
  47. ciocore/docsite/assets/javascripts/lunr/min/lunr.sv.min.js +18 -0
  48. ciocore/docsite/assets/javascripts/lunr/min/lunr.ta.min.js +1 -0
  49. ciocore/docsite/assets/javascripts/lunr/min/lunr.te.min.js +1 -0
  50. ciocore/docsite/assets/javascripts/lunr/min/lunr.th.min.js +1 -0
  51. ciocore/docsite/assets/javascripts/lunr/min/lunr.tr.min.js +18 -0
  52. ciocore/docsite/assets/javascripts/lunr/min/lunr.vi.min.js +1 -0
  53. ciocore/docsite/assets/javascripts/lunr/min/lunr.zh.min.js +1 -0
  54. ciocore/docsite/assets/javascripts/lunr/tinyseg.js +206 -0
  55. ciocore/docsite/assets/javascripts/lunr/wordcut.js +6708 -0
  56. ciocore/docsite/assets/javascripts/workers/search.b8dbb3d2.min.js +42 -0
  57. ciocore/docsite/assets/javascripts/workers/search.b8dbb3d2.min.js.map +7 -0
  58. ciocore/docsite/assets/stylesheets/main.3cba04c6.min.css +1 -0
  59. ciocore/docsite/assets/stylesheets/main.3cba04c6.min.css.map +1 -0
  60. ciocore/docsite/assets/stylesheets/palette.06af60db.min.css +1 -0
  61. ciocore/docsite/assets/stylesheets/palette.06af60db.min.css.map +1 -0
  62. ciocore/docsite/cmdline/docs/index.html +871 -0
  63. ciocore/docsite/cmdline/downloader/index.html +934 -0
  64. ciocore/docsite/cmdline/packages/index.html +878 -0
  65. ciocore/docsite/cmdline/uploader/index.html +995 -0
  66. ciocore/docsite/how-to-guides/index.html +869 -0
  67. ciocore/docsite/index.html +895 -0
  68. ciocore/docsite/logo.png +0 -0
  69. ciocore/docsite/objects.inv +0 -0
  70. ciocore/docsite/search/search_index.json +1 -0
  71. ciocore/docsite/sitemap.xml +3 -0
  72. ciocore/docsite/sitemap.xml.gz +0 -0
  73. ciocore/docsite/stylesheets/extra.css +26 -0
  74. ciocore/docsite/stylesheets/tables.css +167 -0
  75. ciocore/downloader/base_downloader.py +644 -0
  76. ciocore/downloader/download_runner_base.py +47 -0
  77. ciocore/downloader/job_downloader.py +119 -0
  78. ciocore/{downloader.py → downloader/legacy_downloader.py} +12 -9
  79. ciocore/downloader/log.py +73 -0
  80. ciocore/downloader/logging_download_runner.py +87 -0
  81. ciocore/downloader/perpetual_downloader.py +63 -0
  82. ciocore/downloader/registry.py +97 -0
  83. ciocore/downloader/reporter.py +135 -0
  84. ciocore/exceptions.py +8 -2
  85. ciocore/file_utils.py +51 -50
  86. ciocore/hardware_set.py +449 -0
  87. ciocore/loggeria.py +89 -20
  88. ciocore/package_environment.py +110 -48
  89. ciocore/package_query.py +182 -0
  90. ciocore/package_tree.py +319 -258
  91. ciocore/retry.py +0 -0
  92. ciocore/uploader/_uploader.py +547 -364
  93. ciocore/uploader/thread_queue_job.py +176 -0
  94. ciocore/uploader/upload_stats/__init__.py +3 -4
  95. ciocore/uploader/upload_stats/stats_formats.py +10 -4
  96. ciocore/validator.py +34 -2
  97. ciocore/worker.py +174 -151
  98. ciocore-10.0.0b3.dist-info/METADATA +928 -0
  99. ciocore-10.0.0b3.dist-info/RECORD +128 -0
  100. {ciocore-5.1.1.dist-info → ciocore-10.0.0b3.dist-info}/WHEEL +1 -1
  101. ciocore-10.0.0b3.dist-info/entry_points.txt +2 -0
  102. tests/instance_type_fixtures.py +175 -0
  103. tests/package_fixtures.py +205 -0
  104. tests/test_api_client.py +297 -12
  105. tests/test_base_downloader.py +104 -0
  106. tests/test_cli.py +149 -0
  107. tests/test_common.py +1 -7
  108. tests/test_config.py +40 -18
  109. tests/test_data.py +162 -173
  110. tests/test_downloader.py +118 -0
  111. tests/test_hardware_set.py +139 -0
  112. tests/test_job_downloader.py +213 -0
  113. tests/test_package_query.py +38 -0
  114. tests/test_package_tree.py +91 -291
  115. tests/test_submit.py +44 -18
  116. tests/test_uploader.py +1 -4
  117. ciocore/__about__.py +0 -10
  118. ciocore/cli/conductor.py +0 -191
  119. ciocore/compat.py +0 -15
  120. ciocore-5.1.1.data/scripts/conductor +0 -19
  121. ciocore-5.1.1.data/scripts/conductor.bat +0 -13
  122. ciocore-5.1.1.dist-info/METADATA +0 -408
  123. ciocore-5.1.1.dist-info/RECORD +0 -47
  124. tests/mocks/api_client_mock.py +0 -51
  125. /ciocore/{cli → downloader}/__init__.py +0 -0
  126. {ciocore-5.1.1.dist-info → ciocore-10.0.0b3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,3605 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+
10
+ <meta name="author" content="Conductor Developers">
11
+
12
+
13
+
14
+ <link rel="prev" href="../apidoc/">
15
+
16
+
17
+ <link rel="next" href="../config/">
18
+
19
+
20
+ <link rel="icon" href="../../assets/images/favicon.png">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.32">
22
+
23
+
24
+
25
+ <title>ciocore.api_client - Conductor Core</title>
26
+
27
+
28
+
29
+ <link rel="stylesheet" href="../../assets/stylesheets/main.3cba04c6.min.css">
30
+
31
+
32
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
46
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
47
+ <style>:root{--md-text-font:"Raleway";--md-code-font:"Roboto Mono"}</style>
48
+
49
+
50
+
51
+ <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
52
+
53
+ <link rel="stylesheet" href="../../stylesheets/extra.css">
54
+
55
+ <link rel="stylesheet" href="../../stylesheets/tables.css">
56
+
57
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
58
+
59
+
60
+
61
+
62
+
63
+
64
+ </head>
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
+
76
+
77
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
78
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
79
+ <label class="md-overlay" for="__drawer"></label>
80
+ <div data-md-component="skip">
81
+
82
+
83
+ <a href="#ciocoreapi_client" class="md-skip">
84
+ Skip to content
85
+ </a>
86
+
87
+ </div>
88
+ <div data-md-component="announce">
89
+
90
+ </div>
91
+
92
+
93
+
94
+
95
+
96
+
97
+ <header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="https://www.conductortech.com" title="Conductor Core" class="md-header__button md-logo" aria-label="Conductor Core" data-md-component="logo">
100
+
101
+ <img src="../../logo.png" alt="logo">
102
+
103
+ </a>
104
+ <label class="md-header__button md-icon" for="__drawer">
105
+
106
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
107
+ </label>
108
+ <div class="md-header__title" data-md-component="header-title">
109
+ <div class="md-header__ellipsis">
110
+ <div class="md-header__topic">
111
+ <span class="md-ellipsis">
112
+ Conductor Core
113
+ </span>
114
+ </div>
115
+ <div class="md-header__topic" data-md-component="header-topic">
116
+ <span class="md-ellipsis">
117
+
118
+ ciocore.api_client
119
+
120
+ </span>
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+
126
+ <form class="md-header__option" data-md-component="palette">
127
+
128
+
129
+
130
+
131
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
132
+
133
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
134
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
135
+ </label>
136
+
137
+
138
+
139
+
140
+
141
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
142
+
143
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
145
+ </label>
146
+
147
+
148
+ </form>
149
+
150
+
151
+
152
+ <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
153
+
154
+
155
+
156
+ <label class="md-header__button md-icon" for="__search">
157
+
158
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
159
+ </label>
160
+ <div class="md-search" data-md-component="search" role="dialog">
161
+ <label class="md-search__overlay" for="__search"></label>
162
+ <div class="md-search__inner" role="search">
163
+ <form class="md-search__form" name="search">
164
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
165
+ <label class="md-search__icon md-icon" for="__search">
166
+
167
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
168
+
169
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
170
+ </label>
171
+ <nav class="md-search__options" aria-label="Search">
172
+
173
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
174
+
175
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
176
+ </button>
177
+ </nav>
178
+
179
+ </form>
180
+ <div class="md-search__output">
181
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
182
+ <div class="md-search-result" data-md-component="search-result">
183
+ <div class="md-search-result__meta">
184
+ Initializing search
185
+ </div>
186
+ <ol class="md-search-result__list" role="presentation"></ol>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ </div>
192
+
193
+
194
+ </nav>
195
+
196
+
197
+
198
+ <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
199
+ <div class="md-grid">
200
+ <ul class="md-tabs__list">
201
+
202
+
203
+
204
+
205
+
206
+ <li class="md-tabs__item">
207
+ <a href="../.." class="md-tabs__link">
208
+
209
+
210
+
211
+
212
+ Overview
213
+
214
+ </a>
215
+ </li>
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+ <li class="md-tabs__item">
226
+ <a href="../../cmdline/uploader/" class="md-tabs__link">
227
+
228
+
229
+ CLI
230
+
231
+ </a>
232
+ </li>
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+ <li class="md-tabs__item md-tabs__item--active">
246
+ <a href="../apidoc/" class="md-tabs__link">
247
+
248
+
249
+ API
250
+
251
+ </a>
252
+ </li>
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ <li class="md-tabs__item">
262
+ <a href="../../how-to-guides/" class="md-tabs__link">
263
+
264
+
265
+
266
+
267
+ How to
268
+
269
+ </a>
270
+ </li>
271
+
272
+
273
+
274
+ </ul>
275
+ </div>
276
+ </nav>
277
+
278
+
279
+ </header>
280
+
281
+ <div class="md-container" data-md-component="container">
282
+
283
+
284
+
285
+
286
+ <main class="md-main" data-md-component="main">
287
+ <div class="md-main__inner md-grid">
288
+
289
+
290
+
291
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
292
+ <div class="md-sidebar__scrollwrap">
293
+ <div class="md-sidebar__inner">
294
+
295
+
296
+
297
+
298
+
299
+
300
+ <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
301
+ <label class="md-nav__title" for="__drawer">
302
+ <a href="https://www.conductortech.com" title="Conductor Core" class="md-nav__button md-logo" aria-label="Conductor Core" data-md-component="logo">
303
+
304
+ <img src="../../logo.png" alt="logo">
305
+
306
+ </a>
307
+ Conductor Core
308
+ </label>
309
+
310
+ <ul class="md-nav__list" data-md-scrollfix>
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+ <li class="md-nav__item">
319
+ <a href="../.." class="md-nav__link">
320
+
321
+
322
+ <span class="md-ellipsis">
323
+ Overview
324
+ </span>
325
+
326
+
327
+ </a>
328
+ </li>
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+ <li class="md-nav__item md-nav__item--nested">
346
+
347
+
348
+
349
+
350
+
351
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
352
+
353
+
354
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
355
+
356
+
357
+ <span class="md-ellipsis">
358
+ CLI
359
+ </span>
360
+
361
+
362
+ <span class="md-nav__icon md-icon"></span>
363
+ </label>
364
+
365
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
366
+ <label class="md-nav__title" for="__nav_2">
367
+ <span class="md-nav__icon md-icon"></span>
368
+ CLI
369
+ </label>
370
+ <ul class="md-nav__list" data-md-scrollfix>
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+ <li class="md-nav__item">
379
+ <a href="../../cmdline/uploader/" class="md-nav__link">
380
+
381
+
382
+ <span class="md-ellipsis">
383
+ Uploader
384
+ </span>
385
+
386
+
387
+ </a>
388
+ </li>
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+ <li class="md-nav__item">
400
+ <a href="../../cmdline/downloader/" class="md-nav__link">
401
+
402
+
403
+ <span class="md-ellipsis">
404
+ Downloader
405
+ </span>
406
+
407
+
408
+ </a>
409
+ </li>
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+ <li class="md-nav__item">
421
+ <a href="../../cmdline/packages/" class="md-nav__link">
422
+
423
+
424
+ <span class="md-ellipsis">
425
+ Packages
426
+ </span>
427
+
428
+
429
+ </a>
430
+ </li>
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+ <li class="md-nav__item">
442
+ <a href="../../cmdline/docs/" class="md-nav__link">
443
+
444
+
445
+ <span class="md-ellipsis">
446
+ Docs
447
+ </span>
448
+
449
+
450
+ </a>
451
+ </li>
452
+
453
+
454
+
455
+
456
+ </ul>
457
+ </nav>
458
+
459
+ </li>
460
+
461
+
462
+
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+
478
+
479
+
480
+
481
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
482
+
483
+
484
+
485
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
486
+
487
+
488
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
489
+
490
+
491
+ <span class="md-ellipsis">
492
+ API
493
+ </span>
494
+
495
+
496
+ <span class="md-nav__icon md-icon"></span>
497
+ </label>
498
+
499
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
500
+ <label class="md-nav__title" for="__nav_3">
501
+ <span class="md-nav__icon md-icon"></span>
502
+ API
503
+ </label>
504
+ <ul class="md-nav__list" data-md-scrollfix>
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+ <li class="md-nav__item">
513
+ <a href="../apidoc/" class="md-nav__link">
514
+
515
+
516
+ <span class="md-ellipsis">
517
+ Api Overview
518
+ </span>
519
+
520
+
521
+ </a>
522
+ </li>
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+ <li class="md-nav__item md-nav__item--active">
536
+
537
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
538
+
539
+
540
+
541
+
542
+
543
+ <label class="md-nav__link md-nav__link--active" for="__toc">
544
+
545
+
546
+ <span class="md-ellipsis">
547
+ ciocore.api_client
548
+ </span>
549
+
550
+
551
+ <span class="md-nav__icon md-icon"></span>
552
+ </label>
553
+
554
+ <a href="./" class="md-nav__link md-nav__link--active">
555
+
556
+
557
+ <span class="md-ellipsis">
558
+ ciocore.api_client
559
+ </span>
560
+
561
+
562
+ </a>
563
+
564
+
565
+
566
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
567
+
568
+
569
+
570
+
571
+
572
+
573
+ <label class="md-nav__title" for="__toc">
574
+ <span class="md-nav__icon md-icon"></span>
575
+ Table of contents
576
+ </label>
577
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
578
+
579
+ <li class="md-nav__item">
580
+ <a href="#ciocore.api_client" class="md-nav__link">
581
+ <span class="md-ellipsis">
582
+ ciocore.api_client
583
+ </span>
584
+ </a>
585
+
586
+ </li>
587
+
588
+ <li class="md-nav__item">
589
+ <a href="#ciocore.api_client.ApiClient" class="md-nav__link">
590
+ <span class="md-ellipsis">
591
+ ApiClient
592
+ </span>
593
+ </a>
594
+
595
+ <nav class="md-nav" aria-label="ApiClient">
596
+ <ul class="md-nav__list">
597
+
598
+ <li class="md-nav__item">
599
+ <a href="#ciocore.api_client.ApiClient.make_prepared_request" class="md-nav__link">
600
+ <span class="md-ellipsis">
601
+ make_prepared_request()
602
+ </span>
603
+ </a>
604
+
605
+ </li>
606
+
607
+ <li class="md-nav__item">
608
+ <a href="#ciocore.api_client.ApiClient.make_request" class="md-nav__link">
609
+ <span class="md-ellipsis">
610
+ make_request()
611
+ </span>
612
+ </a>
613
+
614
+ </li>
615
+
616
+ <li class="md-nav__item">
617
+ <a href="#ciocore.api_client.ApiClient.register_client" class="md-nav__link">
618
+ <span class="md-ellipsis">
619
+ register_client()
620
+ </span>
621
+ </a>
622
+
623
+ </li>
624
+
625
+ </ul>
626
+ </nav>
627
+
628
+ </li>
629
+
630
+ <li class="md-nav__item">
631
+ <a href="#ciocore.api_client.truncate_middle" class="md-nav__link">
632
+ <span class="md-ellipsis">
633
+ truncate_middle()
634
+ </span>
635
+ </a>
636
+
637
+ </li>
638
+
639
+ <li class="md-nav__item">
640
+ <a href="#ciocore.api_client.read_conductor_credentials" class="md-nav__link">
641
+ <span class="md-ellipsis">
642
+ read_conductor_credentials()
643
+ </span>
644
+ </a>
645
+
646
+ </li>
647
+
648
+ <li class="md-nav__item">
649
+ <a href="#ciocore.api_client.get_api_key_bearer_token" class="md-nav__link">
650
+ <span class="md-ellipsis">
651
+ get_api_key_bearer_token()
652
+ </span>
653
+ </a>
654
+
655
+ </li>
656
+
657
+ <li class="md-nav__item">
658
+ <a href="#ciocore.api_client.get_creds_path" class="md-nav__link">
659
+ <span class="md-ellipsis">
660
+ get_creds_path()
661
+ </span>
662
+ </a>
663
+
664
+ </li>
665
+
666
+ <li class="md-nav__item">
667
+ <a href="#ciocore.api_client.get_bearer_token" class="md-nav__link">
668
+ <span class="md-ellipsis">
669
+ get_bearer_token()
670
+ </span>
671
+ </a>
672
+
673
+ </li>
674
+
675
+ <li class="md-nav__item">
676
+ <a href="#ciocore.api_client.creds_same_domain" class="md-nav__link">
677
+ <span class="md-ellipsis">
678
+ creds_same_domain()
679
+ </span>
680
+ </a>
681
+
682
+ </li>
683
+
684
+ <li class="md-nav__item">
685
+ <a href="#ciocore.api_client.account_id_from_jwt" class="md-nav__link">
686
+ <span class="md-ellipsis">
687
+ account_id_from_jwt()
688
+ </span>
689
+ </a>
690
+
691
+ </li>
692
+
693
+ <li class="md-nav__item">
694
+ <a href="#ciocore.api_client.account_name_from_jwt" class="md-nav__link">
695
+ <span class="md-ellipsis">
696
+ account_name_from_jwt()
697
+ </span>
698
+ </a>
699
+
700
+ </li>
701
+
702
+ <li class="md-nav__item">
703
+ <a href="#ciocore.api_client.request_instance_types" class="md-nav__link">
704
+ <span class="md-ellipsis">
705
+ request_instance_types()
706
+ </span>
707
+ </a>
708
+
709
+ </li>
710
+
711
+ <li class="md-nav__item">
712
+ <a href="#ciocore.api_client.request_projects" class="md-nav__link">
713
+ <span class="md-ellipsis">
714
+ request_projects()
715
+ </span>
716
+ </a>
717
+
718
+ </li>
719
+
720
+ <li class="md-nav__item">
721
+ <a href="#ciocore.api_client.request_software_packages" class="md-nav__link">
722
+ <span class="md-ellipsis">
723
+ request_software_packages()
724
+ </span>
725
+ </a>
726
+
727
+ </li>
728
+
729
+ <li class="md-nav__item">
730
+ <a href="#ciocore.api_client.request_extra_environment" class="md-nav__link">
731
+ <span class="md-ellipsis">
732
+ request_extra_environment()
733
+ </span>
734
+ </a>
735
+
736
+ </li>
737
+
738
+ <li class="md-nav__item">
739
+ <a href="#ciocore.api_client.get_jobs" class="md-nav__link">
740
+ <span class="md-ellipsis">
741
+ get_jobs()
742
+ </span>
743
+ </a>
744
+
745
+ </li>
746
+
747
+ <li class="md-nav__item">
748
+ <a href="#ciocore.api_client.get_log" class="md-nav__link">
749
+ <span class="md-ellipsis">
750
+ get_log()
751
+ </span>
752
+ </a>
753
+
754
+ </li>
755
+
756
+ <li class="md-nav__item">
757
+ <a href="#ciocore.api_client.kill_jobs" class="md-nav__link">
758
+ <span class="md-ellipsis">
759
+ kill_jobs()
760
+ </span>
761
+ </a>
762
+
763
+ </li>
764
+
765
+ <li class="md-nav__item">
766
+ <a href="#ciocore.api_client.kill_tasks" class="md-nav__link">
767
+ <span class="md-ellipsis">
768
+ kill_tasks()
769
+ </span>
770
+ </a>
771
+
772
+ </li>
773
+
774
+ <li class="md-nav__item">
775
+ <a href="#ciocore.api_client.get_compute_usage" class="md-nav__link">
776
+ <span class="md-ellipsis">
777
+ get_compute_usage()
778
+ </span>
779
+ </a>
780
+
781
+ </li>
782
+
783
+ <li class="md-nav__item">
784
+ <a href="#ciocore.api_client.get_storage_usage" class="md-nav__link">
785
+ <span class="md-ellipsis">
786
+ get_storage_usage()
787
+ </span>
788
+ </a>
789
+
790
+ </li>
791
+
792
+ </ul>
793
+
794
+ </nav>
795
+
796
+ </li>
797
+
798
+
799
+
800
+
801
+
802
+
803
+
804
+
805
+
806
+
807
+ <li class="md-nav__item">
808
+ <a href="../config/" class="md-nav__link">
809
+
810
+
811
+ <span class="md-ellipsis">
812
+ ciocore.config
813
+ </span>
814
+
815
+
816
+ </a>
817
+ </li>
818
+
819
+
820
+
821
+
822
+
823
+
824
+
825
+
826
+
827
+
828
+ <li class="md-nav__item">
829
+ <a href="../data/" class="md-nav__link">
830
+
831
+
832
+ <span class="md-ellipsis">
833
+ ciocore.data
834
+ </span>
835
+
836
+
837
+ </a>
838
+ </li>
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+ <li class="md-nav__item">
850
+ <a href="../hardware_set/" class="md-nav__link">
851
+
852
+
853
+ <span class="md-ellipsis">
854
+ ciocore.hardware_set
855
+ </span>
856
+
857
+
858
+ </a>
859
+ </li>
860
+
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+ <li class="md-nav__item">
871
+ <a href="../package_tree/" class="md-nav__link">
872
+
873
+
874
+ <span class="md-ellipsis">
875
+ ciocore.package_tree
876
+ </span>
877
+
878
+
879
+ </a>
880
+ </li>
881
+
882
+
883
+
884
+
885
+
886
+
887
+
888
+
889
+
890
+
891
+ <li class="md-nav__item">
892
+ <a href="../package_environment/" class="md-nav__link">
893
+
894
+
895
+ <span class="md-ellipsis">
896
+ ciocore.package_environment
897
+ </span>
898
+
899
+
900
+ </a>
901
+ </li>
902
+
903
+
904
+
905
+
906
+ </ul>
907
+ </nav>
908
+
909
+ </li>
910
+
911
+
912
+
913
+
914
+
915
+
916
+
917
+
918
+
919
+ <li class="md-nav__item">
920
+ <a href="../../how-to-guides/" class="md-nav__link">
921
+
922
+
923
+ <span class="md-ellipsis">
924
+ How to
925
+ </span>
926
+
927
+
928
+ </a>
929
+ </li>
930
+
931
+
932
+
933
+ </ul>
934
+ </nav>
935
+ </div>
936
+ </div>
937
+ </div>
938
+
939
+
940
+
941
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
942
+ <div class="md-sidebar__scrollwrap">
943
+ <div class="md-sidebar__inner">
944
+
945
+
946
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
947
+
948
+
949
+
950
+
951
+
952
+
953
+ <label class="md-nav__title" for="__toc">
954
+ <span class="md-nav__icon md-icon"></span>
955
+ Table of contents
956
+ </label>
957
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
958
+
959
+ <li class="md-nav__item">
960
+ <a href="#ciocore.api_client" class="md-nav__link">
961
+ <span class="md-ellipsis">
962
+ ciocore.api_client
963
+ </span>
964
+ </a>
965
+
966
+ </li>
967
+
968
+ <li class="md-nav__item">
969
+ <a href="#ciocore.api_client.ApiClient" class="md-nav__link">
970
+ <span class="md-ellipsis">
971
+ ApiClient
972
+ </span>
973
+ </a>
974
+
975
+ <nav class="md-nav" aria-label="ApiClient">
976
+ <ul class="md-nav__list">
977
+
978
+ <li class="md-nav__item">
979
+ <a href="#ciocore.api_client.ApiClient.make_prepared_request" class="md-nav__link">
980
+ <span class="md-ellipsis">
981
+ make_prepared_request()
982
+ </span>
983
+ </a>
984
+
985
+ </li>
986
+
987
+ <li class="md-nav__item">
988
+ <a href="#ciocore.api_client.ApiClient.make_request" class="md-nav__link">
989
+ <span class="md-ellipsis">
990
+ make_request()
991
+ </span>
992
+ </a>
993
+
994
+ </li>
995
+
996
+ <li class="md-nav__item">
997
+ <a href="#ciocore.api_client.ApiClient.register_client" class="md-nav__link">
998
+ <span class="md-ellipsis">
999
+ register_client()
1000
+ </span>
1001
+ </a>
1002
+
1003
+ </li>
1004
+
1005
+ </ul>
1006
+ </nav>
1007
+
1008
+ </li>
1009
+
1010
+ <li class="md-nav__item">
1011
+ <a href="#ciocore.api_client.truncate_middle" class="md-nav__link">
1012
+ <span class="md-ellipsis">
1013
+ truncate_middle()
1014
+ </span>
1015
+ </a>
1016
+
1017
+ </li>
1018
+
1019
+ <li class="md-nav__item">
1020
+ <a href="#ciocore.api_client.read_conductor_credentials" class="md-nav__link">
1021
+ <span class="md-ellipsis">
1022
+ read_conductor_credentials()
1023
+ </span>
1024
+ </a>
1025
+
1026
+ </li>
1027
+
1028
+ <li class="md-nav__item">
1029
+ <a href="#ciocore.api_client.get_api_key_bearer_token" class="md-nav__link">
1030
+ <span class="md-ellipsis">
1031
+ get_api_key_bearer_token()
1032
+ </span>
1033
+ </a>
1034
+
1035
+ </li>
1036
+
1037
+ <li class="md-nav__item">
1038
+ <a href="#ciocore.api_client.get_creds_path" class="md-nav__link">
1039
+ <span class="md-ellipsis">
1040
+ get_creds_path()
1041
+ </span>
1042
+ </a>
1043
+
1044
+ </li>
1045
+
1046
+ <li class="md-nav__item">
1047
+ <a href="#ciocore.api_client.get_bearer_token" class="md-nav__link">
1048
+ <span class="md-ellipsis">
1049
+ get_bearer_token()
1050
+ </span>
1051
+ </a>
1052
+
1053
+ </li>
1054
+
1055
+ <li class="md-nav__item">
1056
+ <a href="#ciocore.api_client.creds_same_domain" class="md-nav__link">
1057
+ <span class="md-ellipsis">
1058
+ creds_same_domain()
1059
+ </span>
1060
+ </a>
1061
+
1062
+ </li>
1063
+
1064
+ <li class="md-nav__item">
1065
+ <a href="#ciocore.api_client.account_id_from_jwt" class="md-nav__link">
1066
+ <span class="md-ellipsis">
1067
+ account_id_from_jwt()
1068
+ </span>
1069
+ </a>
1070
+
1071
+ </li>
1072
+
1073
+ <li class="md-nav__item">
1074
+ <a href="#ciocore.api_client.account_name_from_jwt" class="md-nav__link">
1075
+ <span class="md-ellipsis">
1076
+ account_name_from_jwt()
1077
+ </span>
1078
+ </a>
1079
+
1080
+ </li>
1081
+
1082
+ <li class="md-nav__item">
1083
+ <a href="#ciocore.api_client.request_instance_types" class="md-nav__link">
1084
+ <span class="md-ellipsis">
1085
+ request_instance_types()
1086
+ </span>
1087
+ </a>
1088
+
1089
+ </li>
1090
+
1091
+ <li class="md-nav__item">
1092
+ <a href="#ciocore.api_client.request_projects" class="md-nav__link">
1093
+ <span class="md-ellipsis">
1094
+ request_projects()
1095
+ </span>
1096
+ </a>
1097
+
1098
+ </li>
1099
+
1100
+ <li class="md-nav__item">
1101
+ <a href="#ciocore.api_client.request_software_packages" class="md-nav__link">
1102
+ <span class="md-ellipsis">
1103
+ request_software_packages()
1104
+ </span>
1105
+ </a>
1106
+
1107
+ </li>
1108
+
1109
+ <li class="md-nav__item">
1110
+ <a href="#ciocore.api_client.request_extra_environment" class="md-nav__link">
1111
+ <span class="md-ellipsis">
1112
+ request_extra_environment()
1113
+ </span>
1114
+ </a>
1115
+
1116
+ </li>
1117
+
1118
+ <li class="md-nav__item">
1119
+ <a href="#ciocore.api_client.get_jobs" class="md-nav__link">
1120
+ <span class="md-ellipsis">
1121
+ get_jobs()
1122
+ </span>
1123
+ </a>
1124
+
1125
+ </li>
1126
+
1127
+ <li class="md-nav__item">
1128
+ <a href="#ciocore.api_client.get_log" class="md-nav__link">
1129
+ <span class="md-ellipsis">
1130
+ get_log()
1131
+ </span>
1132
+ </a>
1133
+
1134
+ </li>
1135
+
1136
+ <li class="md-nav__item">
1137
+ <a href="#ciocore.api_client.kill_jobs" class="md-nav__link">
1138
+ <span class="md-ellipsis">
1139
+ kill_jobs()
1140
+ </span>
1141
+ </a>
1142
+
1143
+ </li>
1144
+
1145
+ <li class="md-nav__item">
1146
+ <a href="#ciocore.api_client.kill_tasks" class="md-nav__link">
1147
+ <span class="md-ellipsis">
1148
+ kill_tasks()
1149
+ </span>
1150
+ </a>
1151
+
1152
+ </li>
1153
+
1154
+ <li class="md-nav__item">
1155
+ <a href="#ciocore.api_client.get_compute_usage" class="md-nav__link">
1156
+ <span class="md-ellipsis">
1157
+ get_compute_usage()
1158
+ </span>
1159
+ </a>
1160
+
1161
+ </li>
1162
+
1163
+ <li class="md-nav__item">
1164
+ <a href="#ciocore.api_client.get_storage_usage" class="md-nav__link">
1165
+ <span class="md-ellipsis">
1166
+ get_storage_usage()
1167
+ </span>
1168
+ </a>
1169
+
1170
+ </li>
1171
+
1172
+ </ul>
1173
+
1174
+ </nav>
1175
+ </div>
1176
+ </div>
1177
+ </div>
1178
+
1179
+
1180
+
1181
+ <div class="md-content" data-md-component="content">
1182
+ <article class="md-content__inner md-typeset">
1183
+
1184
+
1185
+
1186
+
1187
+ <h1 id="ciocoreapi_client">ciocore.api_client</h1>
1188
+
1189
+
1190
+ <div class="doc doc-object doc-module">
1191
+
1192
+ <a id="ciocore.api_client"></a>
1193
+ <div class="doc doc-contents first">
1194
+
1195
+ <p>The api_client module is used to make requests to the Conductor API.</p>
1196
+
1197
+
1198
+
1199
+ <div class="doc doc-children">
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+ <div class="doc doc-object doc-class">
1209
+
1210
+
1211
+
1212
+ <h2 id="ciocore.api_client.ApiClient" class="doc doc-heading">
1213
+ <code>
1214
+ ApiClient </code>
1215
+
1216
+
1217
+
1218
+ </h2>
1219
+
1220
+ <div class="doc doc-contents ">
1221
+
1222
+ <p>The ApiClient class is a wrapper around the requests library that handles authentication and retries.</p>
1223
+
1224
+ <details class="quote">
1225
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
1226
+ <div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">ApiClient</span><span class="p">:</span>
1227
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1228
+ <span class="sd"> The ApiClient class is a wrapper around the requests library that handles authentication and retries.</span>
1229
+ <span class="sd"> &quot;&quot;&quot;</span>
1230
+
1231
+ <span class="n">http_verbs</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;PUT&quot;</span><span class="p">,</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span> <span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="s2">&quot;DELETE&quot;</span><span class="p">,</span> <span class="s2">&quot;HEAD&quot;</span><span class="p">,</span> <span class="s2">&quot;PATCH&quot;</span><span class="p">]</span>
1232
+
1233
+ <span class="n">USER_AGENT_TEMPLATE</span> <span class="o">=</span> <span class="s2">&quot;client </span><span class="si">{client_name}</span><span class="s2">/</span><span class="si">{client_version}</span><span class="s2"> (ciocore </span><span class="si">{ciocore_version}</span><span class="s2">; </span><span class="si">{runtime}</span><span class="s2"> </span><span class="si">{runtime_version}</span><span class="s2">; </span><span class="si">{platform}</span><span class="s2"> </span><span class="si">{platform_details}</span><span class="s2">; </span><span class="si">{hostname}</span><span class="s2"> </span><span class="si">{pid}</span><span class="s2">; </span><span class="si">{python_path}</span><span class="s2">)&quot;</span>
1234
+ <span class="n">USER_AGENT_MAX_PATH_LENGTH</span> <span class="o">=</span> <span class="mi">1024</span>
1235
+
1236
+ <span class="n">user_agent_header</span> <span class="o">=</span> <span class="kc">None</span>
1237
+
1238
+ <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1239
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
1240
+
1241
+ <span class="k">def</span><span class="w"> </span><span class="nf">_make_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">conductor_url</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
1242
+ <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
1243
+ <span class="n">method</span><span class="o">=</span><span class="n">verb</span><span class="p">,</span> <span class="n">url</span><span class="o">=</span><span class="n">conductor_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span>
1244
+ <span class="p">)</span>
1245
+
1246
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;verb: </span><span class="si">{</span><span class="n">verb</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1247
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;conductor_url: </span><span class="si">{</span><span class="n">conductor_url</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1248
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;headers: </span><span class="si">{</span><span class="n">headers</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1249
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;params: </span><span class="si">{</span><span class="n">params</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1250
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;data: </span><span class="si">{</span><span class="n">data</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1251
+
1252
+ <span class="c1"># If we get 300s/400s debug out the response. TODO(lws): REMOVE THIS</span>
1253
+ <span class="k">if</span> <span class="mi">300</span> <span class="o">&lt;=</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">&lt;</span> <span class="mi">500</span><span class="p">:</span>
1254
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;***** ERROR!! *****&quot;</span><span class="p">)</span>
1255
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Reason: </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">reason</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1256
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Text: </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
1257
+
1258
+ <span class="c1"># trigger an exception to be raised for 4XX or 5XX http responses</span>
1259
+ <span class="k">if</span> <span class="n">raise_on_error</span><span class="p">:</span>
1260
+ <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
1261
+
1262
+ <span class="k">return</span> <span class="n">response</span>
1263
+
1264
+ <span class="k">def</span><span class="w"> </span><span class="nf">make_prepared_request</span><span class="p">(</span>
1265
+ <span class="bp">self</span><span class="p">,</span>
1266
+ <span class="n">verb</span><span class="p">,</span>
1267
+ <span class="n">url</span><span class="p">,</span>
1268
+ <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1269
+ <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1270
+ <span class="n">json_payload</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1271
+ <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1272
+ <span class="n">stream</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
1273
+ <span class="n">remove_headers_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1274
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
1275
+ <span class="n">tries</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
1276
+ <span class="p">):</span>
1277
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1278
+ <span class="sd"> Make a request to the Conductor API.</span>
1279
+
1280
+ <span class="sd"> Deprecated:</span>
1281
+ <span class="sd"> Primarily used to removed enforced headers by requests.Request. Requests 2.x will add</span>
1282
+ <span class="sd"> Transfer-Encoding: chunked with file like object that is 0 bytes, causing s3 failures (501)</span>
1283
+ <span class="sd"> - https://github.com/psf/requests/issues/4215#issuecomment-319521235</span>
1284
+
1285
+ <span class="sd"> To get around this bug make_prepared_request has functionality to remove the enforced header</span>
1286
+ <span class="sd"> that would occur when using requests.request(...). Requests 3.x resolves this issue, when</span>
1287
+ <span class="sd"> client is built to use Requests 3.x this function can be removed.</span>
1288
+
1289
+ <span class="sd"> Returns:</span>
1290
+ <span class="sd"> requests.Response: The response object.</span>
1291
+
1292
+ <span class="sd"> Args:</span>
1293
+ <span class="sd"> verb (str): The HTTP verb to use.</span>
1294
+ <span class="sd"> url (str): The URL to make the request to.</span>
1295
+ <span class="sd"> headers (dict): A dictionary of headers to send with the request.</span>
1296
+ <span class="sd"> params (dict): A dictionary of query parameters to send with the request.</span>
1297
+ <span class="sd"> json (dict): A JSON payload to send with the request.</span>
1298
+ <span class="sd"> stream (bool): Whether or not to stream the response.</span>
1299
+ <span class="sd"> remove_headers_list (list): A list of headers to remove from the request.</span>
1300
+ <span class="sd"> raise_on_error (bool): Whether or not to raise an exception if the request fails.</span>
1301
+ <span class="sd"> tries (int): The number of times to retry the request.</span>
1302
+ <span class="sd"> &quot;&quot;&quot;</span>
1303
+
1304
+ <span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span>
1305
+ <span class="n">method</span><span class="o">=</span><span class="n">verb</span><span class="p">,</span>
1306
+ <span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span>
1307
+ <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span>
1308
+ <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
1309
+ <span class="n">json</span><span class="o">=</span><span class="n">json_payload</span><span class="p">,</span>
1310
+ <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
1311
+ <span class="p">)</span>
1312
+ <span class="n">prepped</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">prepare</span><span class="p">()</span>
1313
+
1314
+ <span class="k">if</span> <span class="n">remove_headers_list</span><span class="p">:</span>
1315
+ <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">remove_headers_list</span><span class="p">:</span>
1316
+ <span class="n">prepped</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
1317
+
1318
+ <span class="c1"># Create a retry wrapper function</span>
1319
+ <span class="n">retry_wrapper</span> <span class="o">=</span> <span class="n">common</span><span class="o">.</span><span class="n">DecRetry</span><span class="p">(</span>
1320
+ <span class="n">retry_exceptions</span><span class="o">=</span><span class="n">CONNECTION_EXCEPTIONS</span><span class="p">,</span> <span class="n">tries</span><span class="o">=</span><span class="n">tries</span>
1321
+ <span class="p">)</span>
1322
+
1323
+ <span class="c1"># requests sessions potentially not thread-safe, but need to removed enforced</span>
1324
+ <span class="c1"># headers by using a prepared request.create which can only be done through an</span>
1325
+ <span class="c1"># request.Session object. Create Session object per call of make_prepared_request, it will</span>
1326
+ <span class="c1"># not benefit from connection pooling reuse. https://github.com/psf/requests/issues/1871</span>
1327
+ <span class="n">session</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Session</span><span class="p">()</span>
1328
+
1329
+ <span class="c1"># wrap the request function with the retry wrapper</span>
1330
+ <span class="n">wrapped_func</span> <span class="o">=</span> <span class="n">retry_wrapper</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">send</span><span class="p">)</span>
1331
+
1332
+ <span class="c1"># call the wrapped request function</span>
1333
+ <span class="n">response</span> <span class="o">=</span> <span class="n">wrapped_func</span><span class="p">(</span><span class="n">prepped</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="n">stream</span><span class="p">)</span>
1334
+
1335
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;verb: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">prepped</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
1336
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;url: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">prepped</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
1337
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;headers: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">prepped</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
1338
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;params: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
1339
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;response: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
1340
+
1341
+ <span class="c1"># trigger an exception to be raised for 4XX or 5XX http responses</span>
1342
+ <span class="k">if</span> <span class="n">raise_on_error</span><span class="p">:</span>
1343
+ <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
1344
+
1345
+ <span class="k">return</span> <span class="n">response</span>
1346
+
1347
+ <span class="k">def</span><span class="w"> </span><span class="nf">make_request</span><span class="p">(</span>
1348
+ <span class="bp">self</span><span class="p">,</span>
1349
+ <span class="n">uri_path</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">,</span>
1350
+ <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1351
+ <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1352
+ <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1353
+ <span class="n">verb</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1354
+ <span class="n">conductor_url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1355
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
1356
+ <span class="n">tries</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
1357
+ <span class="n">use_api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
1358
+ <span class="p">):</span>
1359
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1360
+ <span class="sd"> Make a request to the Conductor API.</span>
1361
+
1362
+ <span class="sd"> Args:</span>
1363
+ <span class="sd"> uri_path (str): The path to the resource to request.</span>
1364
+ <span class="sd"> headers (dict): A dictionary of headers to send with the request.</span>
1365
+ <span class="sd"> params (dict): A dictionary of query parameters to send with the request.</span>
1366
+ <span class="sd"> data (dict): A dictionary of data to send with the request.</span>
1367
+ <span class="sd"> verb (str): The HTTP verb to use.</span>
1368
+ <span class="sd"> conductor_url (str): The Conductor URL.</span>
1369
+ <span class="sd"> raise_on_error (bool): Whether or not to raise an exception if the request fails.</span>
1370
+ <span class="sd"> tries (int): The number of times to retry the request.</span>
1371
+ <span class="sd"> use`_api_key (bool): Whether or not to use the API key for authentication.</span>
1372
+
1373
+ <span class="sd"> Returns:</span>
1374
+ <span class="sd"> tuple(str, int): The response text and status code.</span>
1375
+ <span class="sd"> &quot;&quot;&quot;</span>
1376
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
1377
+ <span class="c1"># TODO: set Content Content-Type to json if data arg</span>
1378
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">headers</span><span class="p">:</span>
1379
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;Accept&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
1380
+
1381
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;read_conductor_credentials(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">use_api_key</span><span class="p">))</span>
1382
+ <span class="n">bearer_token</span> <span class="o">=</span> <span class="n">read_conductor_credentials</span><span class="p">(</span><span class="n">use_api_key</span><span class="p">)</span>
1383
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">bearer_token</span><span class="p">:</span>
1384
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Error: Could not get conductor credentials!&quot;</span><span class="p">)</span>
1385
+
1386
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Authorization&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Bearer </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bearer_token</span>
1387
+
1388
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ApiClient</span><span class="o">.</span><span class="n">user_agent_header</span><span class="p">:</span>
1389
+ <span class="bp">self</span><span class="o">.</span><span class="n">register_client</span><span class="p">(</span><span class="s2">&quot;ciocore&quot;</span><span class="p">)</span>
1390
+
1391
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="o">.</span><span class="n">user_agent_header</span>
1392
+
1393
+ <span class="c1"># Construct URL</span>
1394
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">conductor_url</span><span class="p">:</span>
1395
+ <span class="n">conductor_url</span> <span class="o">=</span> <span class="n">parse</span><span class="o">.</span><span class="n">urljoin</span><span class="p">(</span><span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">],</span> <span class="n">uri_path</span><span class="p">)</span>
1396
+
1397
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">verb</span><span class="p">:</span>
1398
+ <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
1399
+ <span class="n">verb</span> <span class="o">=</span> <span class="s2">&quot;POST&quot;</span>
1400
+ <span class="k">else</span><span class="p">:</span>
1401
+ <span class="n">verb</span> <span class="o">=</span> <span class="s2">&quot;GET&quot;</span>
1402
+
1403
+ <span class="k">assert</span> <span class="n">verb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_verbs</span><span class="p">,</span> <span class="s2">&quot;Invalid http verb: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">verb</span>
1404
+
1405
+ <span class="c1"># Create a retry wrapper function</span>
1406
+ <span class="n">retry_wrapper</span> <span class="o">=</span> <span class="n">common</span><span class="o">.</span><span class="n">DecRetry</span><span class="p">(</span>
1407
+ <span class="n">retry_exceptions</span><span class="o">=</span><span class="n">CONNECTION_EXCEPTIONS</span><span class="p">,</span> <span class="n">tries</span><span class="o">=</span><span class="n">tries</span>
1408
+ <span class="p">)</span>
1409
+
1410
+ <span class="c1"># wrap the request function with the retry wrapper</span>
1411
+ <span class="n">wrapped_func</span> <span class="o">=</span> <span class="n">retry_wrapper</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_make_request</span><span class="p">)</span>
1412
+
1413
+ <span class="c1"># call the wrapped request function</span>
1414
+ <span class="n">response</span> <span class="o">=</span> <span class="n">wrapped_func</span><span class="p">(</span>
1415
+ <span class="n">verb</span><span class="p">,</span> <span class="n">conductor_url</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="n">raise_on_error</span>
1416
+ <span class="p">)</span>
1417
+
1418
+ <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span>
1419
+
1420
+ <span class="nd">@classmethod</span>
1421
+ <span class="k">def</span><span class="w"> </span><span class="nf">register_client</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">client_name</span><span class="p">,</span> <span class="n">client_version</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
1422
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1423
+ <span class="sd"> Generates the http User Agent header that includes helpful debug info.</span>
1424
+ <span class="sd"> &quot;&quot;&quot;</span>
1425
+
1426
+ <span class="c1"># Use the provided client_version.</span>
1427
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">client_version</span><span class="p">:</span>
1428
+ <span class="n">client_version</span> <span class="o">=</span> <span class="s1">&#39;unknown&#39;</span>
1429
+
1430
+ <span class="n">python_version</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">python_version</span><span class="p">()</span>
1431
+ <span class="n">system_info</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span>
1432
+ <span class="n">release_info</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
1433
+
1434
+
1435
+ <span class="c1"># Get the MD5 hex digest of the path to the python executable</span>
1436
+ <span class="n">python_executable_path</span> <span class="o">=</span> <span class="n">truncate_middle</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">),</span> <span class="bp">cls</span><span class="o">.</span><span class="n">USER_AGENT_MAX_PATH_LENGTH</span><span class="p">)</span>
1437
+ <span class="n">md5_hash</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="n">python_executable_path</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
1438
+
1439
+ <span class="n">user_agent</span> <span class="o">=</span> <span class="p">(</span>
1440
+ <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">client_name</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">client_version</span><span class="si">}</span><span class="s2"> &quot;</span>
1441
+ <span class="sa">f</span><span class="s2">&quot;(python </span><span class="si">{</span><span class="n">python_version</span><span class="si">}</span><span class="s2">; </span><span class="si">{</span><span class="n">system_info</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">release_info</span><span class="si">}</span><span class="s2">; </span><span class="si">{</span><span class="n">md5_hash</span><span class="si">}</span><span class="s2">)&quot;</span>
1442
+ <span class="p">)</span>
1443
+ <span class="bp">cls</span><span class="o">.</span><span class="n">user_agent_header</span> <span class="o">=</span> <span class="n">user_agent</span>
1444
+
1445
+ <span class="k">return</span> <span class="n">user_agent</span>
1446
+ </code></pre></div>
1447
+ </details>
1448
+
1449
+
1450
+
1451
+ <div class="doc doc-children">
1452
+
1453
+
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+
1465
+
1466
+ <div class="doc doc-object doc-method">
1467
+
1468
+
1469
+
1470
+ <h3 id="ciocore.api_client.ApiClient.make_prepared_request" class="doc doc-heading">
1471
+ <code class="highlight language-python"><span class="n">make_prepared_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verb</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">json_payload</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">remove_headers_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">tries</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span></code>
1472
+
1473
+
1474
+ </h3>
1475
+
1476
+ <div class="doc doc-contents ">
1477
+
1478
+ <p>Make a request to the Conductor API.</p>
1479
+ <div class="admonition deprecated">
1480
+ <p class="admonition-title">Deprecated</p>
1481
+ <p>Primarily used to removed enforced headers by requests.Request. Requests 2.x will add
1482
+ Transfer-Encoding: chunked with file like object that is 0 bytes, causing s3 failures (501)
1483
+ - https://github.com/psf/requests/issues/4215#issuecomment-319521235</p>
1484
+ <p>To get around this bug make_prepared_request has functionality to remove the enforced header
1485
+ that would occur when using requests.request(...). Requests 3.x resolves this issue, when
1486
+ client is built to use Requests 3.x this function can be removed.</p>
1487
+ </div>
1488
+
1489
+ <p><strong>Returns:</strong></p>
1490
+ <table>
1491
+ <thead>
1492
+ <tr>
1493
+ <th>Type</th>
1494
+ <th>Description</th>
1495
+ </tr>
1496
+ </thead>
1497
+ <tbody>
1498
+ <tr>
1499
+ <td><code>requests.Response</code></td>
1500
+ <td><p>The response object.</p></td>
1501
+ </tr>
1502
+ </tbody>
1503
+ </table>
1504
+ <p><strong>Parameters:</strong></p>
1505
+ <table>
1506
+ <thead>
1507
+ <tr>
1508
+ <th>Name</th>
1509
+ <th>Type</th>
1510
+ <th>Description</th>
1511
+ <th>Default</th>
1512
+ </tr>
1513
+ </thead>
1514
+ <tbody>
1515
+ <tr>
1516
+ <td><code>verb</code></td>
1517
+ <td><code>str</code></td>
1518
+ <td><p>The HTTP verb to use.</p></td>
1519
+ <td><em>required</em></td>
1520
+ </tr>
1521
+ <tr>
1522
+ <td><code>url</code></td>
1523
+ <td><code>str</code></td>
1524
+ <td><p>The URL to make the request to.</p></td>
1525
+ <td><em>required</em></td>
1526
+ </tr>
1527
+ <tr>
1528
+ <td><code>headers</code></td>
1529
+ <td><code>dict</code></td>
1530
+ <td><p>A dictionary of headers to send with the request.</p></td>
1531
+ <td><code>None</code></td>
1532
+ </tr>
1533
+ <tr>
1534
+ <td><code>params</code></td>
1535
+ <td><code>dict</code></td>
1536
+ <td><p>A dictionary of query parameters to send with the request.</p></td>
1537
+ <td><code>None</code></td>
1538
+ </tr>
1539
+ <tr>
1540
+ <td><code>json</code></td>
1541
+ <td><code>dict</code></td>
1542
+ <td><p>A JSON payload to send with the request.</p></td>
1543
+ <td><em>required</em></td>
1544
+ </tr>
1545
+ <tr>
1546
+ <td><code>stream</code></td>
1547
+ <td><code>bool</code></td>
1548
+ <td><p>Whether or not to stream the response.</p></td>
1549
+ <td><code>False</code></td>
1550
+ </tr>
1551
+ <tr>
1552
+ <td><code>remove_headers_list</code></td>
1553
+ <td><code>list</code></td>
1554
+ <td><p>A list of headers to remove from the request.</p></td>
1555
+ <td><code>None</code></td>
1556
+ </tr>
1557
+ <tr>
1558
+ <td><code>raise_on_error</code></td>
1559
+ <td><code>bool</code></td>
1560
+ <td><p>Whether or not to raise an exception if the request fails.</p></td>
1561
+ <td><code>True</code></td>
1562
+ </tr>
1563
+ <tr>
1564
+ <td><code>tries</code></td>
1565
+ <td><code>int</code></td>
1566
+ <td><p>The number of times to retry the request.</p></td>
1567
+ <td><code>5</code></td>
1568
+ </tr>
1569
+ </tbody>
1570
+ </table>
1571
+ <details class="quote">
1572
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
1573
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">make_prepared_request</span><span class="p">(</span>
1574
+ <span class="bp">self</span><span class="p">,</span>
1575
+ <span class="n">verb</span><span class="p">,</span>
1576
+ <span class="n">url</span><span class="p">,</span>
1577
+ <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1578
+ <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1579
+ <span class="n">json_payload</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1580
+ <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1581
+ <span class="n">stream</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
1582
+ <span class="n">remove_headers_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1583
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
1584
+ <span class="n">tries</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
1585
+ <span class="p">):</span>
1586
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1587
+ <span class="sd"> Make a request to the Conductor API.</span>
1588
+
1589
+ <span class="sd"> Deprecated:</span>
1590
+ <span class="sd"> Primarily used to removed enforced headers by requests.Request. Requests 2.x will add</span>
1591
+ <span class="sd"> Transfer-Encoding: chunked with file like object that is 0 bytes, causing s3 failures (501)</span>
1592
+ <span class="sd"> - https://github.com/psf/requests/issues/4215#issuecomment-319521235</span>
1593
+
1594
+ <span class="sd"> To get around this bug make_prepared_request has functionality to remove the enforced header</span>
1595
+ <span class="sd"> that would occur when using requests.request(...). Requests 3.x resolves this issue, when</span>
1596
+ <span class="sd"> client is built to use Requests 3.x this function can be removed.</span>
1597
+
1598
+ <span class="sd"> Returns:</span>
1599
+ <span class="sd"> requests.Response: The response object.</span>
1600
+
1601
+ <span class="sd"> Args:</span>
1602
+ <span class="sd"> verb (str): The HTTP verb to use.</span>
1603
+ <span class="sd"> url (str): The URL to make the request to.</span>
1604
+ <span class="sd"> headers (dict): A dictionary of headers to send with the request.</span>
1605
+ <span class="sd"> params (dict): A dictionary of query parameters to send with the request.</span>
1606
+ <span class="sd"> json (dict): A JSON payload to send with the request.</span>
1607
+ <span class="sd"> stream (bool): Whether or not to stream the response.</span>
1608
+ <span class="sd"> remove_headers_list (list): A list of headers to remove from the request.</span>
1609
+ <span class="sd"> raise_on_error (bool): Whether or not to raise an exception if the request fails.</span>
1610
+ <span class="sd"> tries (int): The number of times to retry the request.</span>
1611
+ <span class="sd"> &quot;&quot;&quot;</span>
1612
+
1613
+ <span class="n">req</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span>
1614
+ <span class="n">method</span><span class="o">=</span><span class="n">verb</span><span class="p">,</span>
1615
+ <span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span>
1616
+ <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span>
1617
+ <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
1618
+ <span class="n">json</span><span class="o">=</span><span class="n">json_payload</span><span class="p">,</span>
1619
+ <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
1620
+ <span class="p">)</span>
1621
+ <span class="n">prepped</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">prepare</span><span class="p">()</span>
1622
+
1623
+ <span class="k">if</span> <span class="n">remove_headers_list</span><span class="p">:</span>
1624
+ <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">remove_headers_list</span><span class="p">:</span>
1625
+ <span class="n">prepped</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
1626
+
1627
+ <span class="c1"># Create a retry wrapper function</span>
1628
+ <span class="n">retry_wrapper</span> <span class="o">=</span> <span class="n">common</span><span class="o">.</span><span class="n">DecRetry</span><span class="p">(</span>
1629
+ <span class="n">retry_exceptions</span><span class="o">=</span><span class="n">CONNECTION_EXCEPTIONS</span><span class="p">,</span> <span class="n">tries</span><span class="o">=</span><span class="n">tries</span>
1630
+ <span class="p">)</span>
1631
+
1632
+ <span class="c1"># requests sessions potentially not thread-safe, but need to removed enforced</span>
1633
+ <span class="c1"># headers by using a prepared request.create which can only be done through an</span>
1634
+ <span class="c1"># request.Session object. Create Session object per call of make_prepared_request, it will</span>
1635
+ <span class="c1"># not benefit from connection pooling reuse. https://github.com/psf/requests/issues/1871</span>
1636
+ <span class="n">session</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Session</span><span class="p">()</span>
1637
+
1638
+ <span class="c1"># wrap the request function with the retry wrapper</span>
1639
+ <span class="n">wrapped_func</span> <span class="o">=</span> <span class="n">retry_wrapper</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">send</span><span class="p">)</span>
1640
+
1641
+ <span class="c1"># call the wrapped request function</span>
1642
+ <span class="n">response</span> <span class="o">=</span> <span class="n">wrapped_func</span><span class="p">(</span><span class="n">prepped</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="n">stream</span><span class="p">)</span>
1643
+
1644
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;verb: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">prepped</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
1645
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;url: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">prepped</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
1646
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;headers: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">prepped</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
1647
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;params: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
1648
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;response: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
1649
+
1650
+ <span class="c1"># trigger an exception to be raised for 4XX or 5XX http responses</span>
1651
+ <span class="k">if</span> <span class="n">raise_on_error</span><span class="p">:</span>
1652
+ <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
1653
+
1654
+ <span class="k">return</span> <span class="n">response</span>
1655
+ </code></pre></div>
1656
+ </details>
1657
+ </div>
1658
+
1659
+ </div>
1660
+
1661
+
1662
+
1663
+ <div class="doc doc-object doc-method">
1664
+
1665
+
1666
+
1667
+ <h3 id="ciocore.api_client.ApiClient.make_request" class="doc doc-heading">
1668
+ <code class="highlight language-python"><span class="n">make_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">uri_path</span><span class="o">=</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">verb</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">conductor_url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">tries</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">use_api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
1669
+
1670
+
1671
+ </h3>
1672
+
1673
+ <div class="doc doc-contents ">
1674
+
1675
+ <p>Make a request to the Conductor API.</p>
1676
+
1677
+ <p><strong>Parameters:</strong></p>
1678
+ <table>
1679
+ <thead>
1680
+ <tr>
1681
+ <th>Name</th>
1682
+ <th>Type</th>
1683
+ <th>Description</th>
1684
+ <th>Default</th>
1685
+ </tr>
1686
+ </thead>
1687
+ <tbody>
1688
+ <tr>
1689
+ <td><code>uri_path</code></td>
1690
+ <td><code>str</code></td>
1691
+ <td><p>The path to the resource to request.</p></td>
1692
+ <td><code>&#39;/&#39;</code></td>
1693
+ </tr>
1694
+ <tr>
1695
+ <td><code>headers</code></td>
1696
+ <td><code>dict</code></td>
1697
+ <td><p>A dictionary of headers to send with the request.</p></td>
1698
+ <td><code>None</code></td>
1699
+ </tr>
1700
+ <tr>
1701
+ <td><code>params</code></td>
1702
+ <td><code>dict</code></td>
1703
+ <td><p>A dictionary of query parameters to send with the request.</p></td>
1704
+ <td><code>None</code></td>
1705
+ </tr>
1706
+ <tr>
1707
+ <td><code>data</code></td>
1708
+ <td><code>dict</code></td>
1709
+ <td><p>A dictionary of data to send with the request.</p></td>
1710
+ <td><code>None</code></td>
1711
+ </tr>
1712
+ <tr>
1713
+ <td><code>verb</code></td>
1714
+ <td><code>str</code></td>
1715
+ <td><p>The HTTP verb to use.</p></td>
1716
+ <td><code>None</code></td>
1717
+ </tr>
1718
+ <tr>
1719
+ <td><code>conductor_url</code></td>
1720
+ <td><code>str</code></td>
1721
+ <td><p>The Conductor URL.</p></td>
1722
+ <td><code>None</code></td>
1723
+ </tr>
1724
+ <tr>
1725
+ <td><code>raise_on_error</code></td>
1726
+ <td><code>bool</code></td>
1727
+ <td><p>Whether or not to raise an exception if the request fails.</p></td>
1728
+ <td><code>True</code></td>
1729
+ </tr>
1730
+ <tr>
1731
+ <td><code>tries</code></td>
1732
+ <td><code>int</code></td>
1733
+ <td><p>The number of times to retry the request.</p></td>
1734
+ <td><code>5</code></td>
1735
+ </tr>
1736
+ <tr>
1737
+ <td><code>use`_api_key</code></td>
1738
+ <td><code>bool</code></td>
1739
+ <td><p>Whether or not to use the API key for authentication.</p></td>
1740
+ <td><em>required</em></td>
1741
+ </tr>
1742
+ </tbody>
1743
+ </table>
1744
+ <p><strong>Returns:</strong></p>
1745
+ <table>
1746
+ <thead>
1747
+ <tr>
1748
+ <th>Type</th>
1749
+ <th>Description</th>
1750
+ </tr>
1751
+ </thead>
1752
+ <tbody>
1753
+ <tr>
1754
+ <td><code>tuple(str, int)</code></td>
1755
+ <td><p>The response text and status code.</p></td>
1756
+ </tr>
1757
+ </tbody>
1758
+ </table>
1759
+ <details class="quote">
1760
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
1761
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">make_request</span><span class="p">(</span>
1762
+ <span class="bp">self</span><span class="p">,</span>
1763
+ <span class="n">uri_path</span><span class="o">=</span><span class="s2">&quot;/&quot;</span><span class="p">,</span>
1764
+ <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1765
+ <span class="n">params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1766
+ <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1767
+ <span class="n">verb</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1768
+ <span class="n">conductor_url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
1769
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
1770
+ <span class="n">tries</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
1771
+ <span class="n">use_api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
1772
+ <span class="p">):</span>
1773
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1774
+ <span class="sd"> Make a request to the Conductor API.</span>
1775
+
1776
+ <span class="sd"> Args:</span>
1777
+ <span class="sd"> uri_path (str): The path to the resource to request.</span>
1778
+ <span class="sd"> headers (dict): A dictionary of headers to send with the request.</span>
1779
+ <span class="sd"> params (dict): A dictionary of query parameters to send with the request.</span>
1780
+ <span class="sd"> data (dict): A dictionary of data to send with the request.</span>
1781
+ <span class="sd"> verb (str): The HTTP verb to use.</span>
1782
+ <span class="sd"> conductor_url (str): The Conductor URL.</span>
1783
+ <span class="sd"> raise_on_error (bool): Whether or not to raise an exception if the request fails.</span>
1784
+ <span class="sd"> tries (int): The number of times to retry the request.</span>
1785
+ <span class="sd"> use`_api_key (bool): Whether or not to use the API key for authentication.</span>
1786
+
1787
+ <span class="sd"> Returns:</span>
1788
+ <span class="sd"> tuple(str, int): The response text and status code.</span>
1789
+ <span class="sd"> &quot;&quot;&quot;</span>
1790
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
1791
+ <span class="c1"># TODO: set Content Content-Type to json if data arg</span>
1792
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">headers</span><span class="p">:</span>
1793
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s2">&quot;Accept&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">}</span>
1794
+
1795
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;read_conductor_credentials(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">use_api_key</span><span class="p">))</span>
1796
+ <span class="n">bearer_token</span> <span class="o">=</span> <span class="n">read_conductor_credentials</span><span class="p">(</span><span class="n">use_api_key</span><span class="p">)</span>
1797
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">bearer_token</span><span class="p">:</span>
1798
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Error: Could not get conductor credentials!&quot;</span><span class="p">)</span>
1799
+
1800
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Authorization&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Bearer </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bearer_token</span>
1801
+
1802
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ApiClient</span><span class="o">.</span><span class="n">user_agent_header</span><span class="p">:</span>
1803
+ <span class="bp">self</span><span class="o">.</span><span class="n">register_client</span><span class="p">(</span><span class="s2">&quot;ciocore&quot;</span><span class="p">)</span>
1804
+
1805
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="o">.</span><span class="n">user_agent_header</span>
1806
+
1807
+ <span class="c1"># Construct URL</span>
1808
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">conductor_url</span><span class="p">:</span>
1809
+ <span class="n">conductor_url</span> <span class="o">=</span> <span class="n">parse</span><span class="o">.</span><span class="n">urljoin</span><span class="p">(</span><span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">],</span> <span class="n">uri_path</span><span class="p">)</span>
1810
+
1811
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">verb</span><span class="p">:</span>
1812
+ <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
1813
+ <span class="n">verb</span> <span class="o">=</span> <span class="s2">&quot;POST&quot;</span>
1814
+ <span class="k">else</span><span class="p">:</span>
1815
+ <span class="n">verb</span> <span class="o">=</span> <span class="s2">&quot;GET&quot;</span>
1816
+
1817
+ <span class="k">assert</span> <span class="n">verb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_verbs</span><span class="p">,</span> <span class="s2">&quot;Invalid http verb: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">verb</span>
1818
+
1819
+ <span class="c1"># Create a retry wrapper function</span>
1820
+ <span class="n">retry_wrapper</span> <span class="o">=</span> <span class="n">common</span><span class="o">.</span><span class="n">DecRetry</span><span class="p">(</span>
1821
+ <span class="n">retry_exceptions</span><span class="o">=</span><span class="n">CONNECTION_EXCEPTIONS</span><span class="p">,</span> <span class="n">tries</span><span class="o">=</span><span class="n">tries</span>
1822
+ <span class="p">)</span>
1823
+
1824
+ <span class="c1"># wrap the request function with the retry wrapper</span>
1825
+ <span class="n">wrapped_func</span> <span class="o">=</span> <span class="n">retry_wrapper</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_make_request</span><span class="p">)</span>
1826
+
1827
+ <span class="c1"># call the wrapped request function</span>
1828
+ <span class="n">response</span> <span class="o">=</span> <span class="n">wrapped_func</span><span class="p">(</span>
1829
+ <span class="n">verb</span><span class="p">,</span> <span class="n">conductor_url</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="n">raise_on_error</span>
1830
+ <span class="p">)</span>
1831
+
1832
+ <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span>
1833
+ </code></pre></div>
1834
+ </details>
1835
+ </div>
1836
+
1837
+ </div>
1838
+
1839
+
1840
+
1841
+ <div class="doc doc-object doc-method">
1842
+
1843
+
1844
+
1845
+ <h3 id="ciocore.api_client.ApiClient.register_client" class="doc doc-heading">
1846
+ <code class="highlight language-python"><span class="n">register_client</span><span class="p">(</span><span class="n">client_name</span><span class="p">,</span> <span class="n">client_version</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
1847
+
1848
+ <span class="doc doc-properties">
1849
+ <small class="doc doc-property doc-property-classmethod"><code>classmethod</code></small>
1850
+ </span>
1851
+
1852
+ </h3>
1853
+
1854
+ <div class="doc doc-contents ">
1855
+
1856
+ <p>Generates the http User Agent header that includes helpful debug info.</p>
1857
+
1858
+ <details class="quote">
1859
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
1860
+ <div class="highlight"><pre><span></span><code><span class="nd">@classmethod</span>
1861
+ <span class="k">def</span><span class="w"> </span><span class="nf">register_client</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">client_name</span><span class="p">,</span> <span class="n">client_version</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
1862
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1863
+ <span class="sd"> Generates the http User Agent header that includes helpful debug info.</span>
1864
+ <span class="sd"> &quot;&quot;&quot;</span>
1865
+
1866
+ <span class="c1"># Use the provided client_version.</span>
1867
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">client_version</span><span class="p">:</span>
1868
+ <span class="n">client_version</span> <span class="o">=</span> <span class="s1">&#39;unknown&#39;</span>
1869
+
1870
+ <span class="n">python_version</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">python_version</span><span class="p">()</span>
1871
+ <span class="n">system_info</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span>
1872
+ <span class="n">release_info</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
1873
+
1874
+
1875
+ <span class="c1"># Get the MD5 hex digest of the path to the python executable</span>
1876
+ <span class="n">python_executable_path</span> <span class="o">=</span> <span class="n">truncate_middle</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">),</span> <span class="bp">cls</span><span class="o">.</span><span class="n">USER_AGENT_MAX_PATH_LENGTH</span><span class="p">)</span>
1877
+ <span class="n">md5_hash</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="n">python_executable_path</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
1878
+
1879
+ <span class="n">user_agent</span> <span class="o">=</span> <span class="p">(</span>
1880
+ <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">client_name</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">client_version</span><span class="si">}</span><span class="s2"> &quot;</span>
1881
+ <span class="sa">f</span><span class="s2">&quot;(python </span><span class="si">{</span><span class="n">python_version</span><span class="si">}</span><span class="s2">; </span><span class="si">{</span><span class="n">system_info</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">release_info</span><span class="si">}</span><span class="s2">; </span><span class="si">{</span><span class="n">md5_hash</span><span class="si">}</span><span class="s2">)&quot;</span>
1882
+ <span class="p">)</span>
1883
+ <span class="bp">cls</span><span class="o">.</span><span class="n">user_agent_header</span> <span class="o">=</span> <span class="n">user_agent</span>
1884
+
1885
+ <span class="k">return</span> <span class="n">user_agent</span>
1886
+ </code></pre></div>
1887
+ </details>
1888
+ </div>
1889
+
1890
+ </div>
1891
+
1892
+
1893
+
1894
+
1895
+
1896
+ </div>
1897
+
1898
+ </div>
1899
+
1900
+ </div>
1901
+
1902
+
1903
+
1904
+
1905
+ <div class="doc doc-object doc-function">
1906
+
1907
+
1908
+
1909
+ <h2 id="ciocore.api_client.truncate_middle" class="doc doc-heading">
1910
+ <code class="highlight language-python"><span class="n">truncate_middle</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">max_length</span><span class="p">)</span></code>
1911
+
1912
+
1913
+ </h2>
1914
+
1915
+ <div class="doc doc-contents ">
1916
+
1917
+ <p>Truncate the string <code>s</code> to <code>max_length</code> by removing characters from the middle.</p>
1918
+ <p>:param s: The original string to be truncated.
1919
+ :type s: str
1920
+ :param max_length: The maximum allowed length of the string after truncation.
1921
+ :type max_length: int
1922
+ :return: The truncated string.
1923
+ :rtype: str</p>
1924
+
1925
+ <details class="quote">
1926
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
1927
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">truncate_middle</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">max_length</span><span class="p">):</span>
1928
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1929
+ <span class="sd"> Truncate the string `s` to `max_length` by removing characters from the middle.</span>
1930
+
1931
+ <span class="sd"> :param s: The original string to be truncated.</span>
1932
+ <span class="sd"> :type s: str</span>
1933
+ <span class="sd"> :param max_length: The maximum allowed length of the string after truncation.</span>
1934
+ <span class="sd"> :type max_length: int</span>
1935
+ <span class="sd"> :return: The truncated string.</span>
1936
+ <span class="sd"> :rtype: str</span>
1937
+ <span class="sd"> &quot;&quot;&quot;</span>
1938
+
1939
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">max_length</span><span class="p">:</span>
1940
+ <span class="c1"># String is already at or below the maximum length, return it as is</span>
1941
+ <span class="k">return</span> <span class="n">s</span>
1942
+
1943
+ <span class="c1"># Calculate the number of characters to keep from the start and end of the string</span>
1944
+ <span class="n">num_keep_front</span> <span class="o">=</span> <span class="p">(</span><span class="n">max_length</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span>
1945
+ <span class="n">num_keep_end</span> <span class="o">=</span> <span class="n">max_length</span> <span class="o">-</span> <span class="n">num_keep_front</span> <span class="o">-</span> <span class="mi">1</span> <span class="c1"># -1 for the ellipsis</span>
1946
+
1947
+ <span class="c1"># Construct the truncated string</span>
1948
+ <span class="k">return</span> <span class="n">s</span><span class="p">[:</span><span class="n">num_keep_front</span><span class="p">]</span> <span class="o">+</span> <span class="s1">&#39;~&#39;</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="n">num_keep_end</span><span class="p">:]</span>
1949
+ </code></pre></div>
1950
+ </details>
1951
+ </div>
1952
+
1953
+ </div>
1954
+
1955
+
1956
+
1957
+ <div class="doc doc-object doc-function">
1958
+
1959
+
1960
+
1961
+ <h2 id="ciocore.api_client.read_conductor_credentials" class="doc doc-heading">
1962
+ <code class="highlight language-python"><span class="n">read_conductor_credentials</span><span class="p">(</span><span class="n">use_api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
1963
+
1964
+
1965
+ </h2>
1966
+
1967
+ <div class="doc doc-contents ">
1968
+
1969
+ <p>Read the conductor credentials file.</p>
1970
+ <p>If the credentials file exists, it will contain a bearer token from either
1971
+ the user or the API key.</p>
1972
+ <p>If the credentials file doesn't exist, or is
1973
+ expired, or is from a different domain, we try to fetch a new one in the API key scenario or
1974
+ prompt the user to log in. </p>
1975
+ <p>Args:
1976
+ use_api_key (bool): Whether or not to try to use the API key</p>
1977
+ <p>Returns:
1978
+ A Bearer token in the event of a success or None</p>
1979
+
1980
+ <details class="quote">
1981
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
1982
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">read_conductor_credentials</span><span class="p">(</span><span class="n">use_api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
1983
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1984
+ <span class="sd"> Read the conductor credentials file.</span>
1985
+
1986
+ <span class="sd"> If the credentials file exists, it will contain a bearer token from either</span>
1987
+ <span class="sd"> the user or the API key.</span>
1988
+
1989
+ <span class="sd"> If the credentials file doesn&#39;t exist, or is</span>
1990
+ <span class="sd"> expired, or is from a different domain, we try to fetch a new one in the API key scenario or</span>
1991
+ <span class="sd"> prompt the user to log in. </span>
1992
+
1993
+ <span class="sd"> Args: </span>
1994
+ <span class="sd"> use_api_key (bool): Whether or not to try to use the API key</span>
1995
+
1996
+ <span class="sd"> Returns: </span>
1997
+ <span class="sd"> A Bearer token in the event of a success or None</span>
1998
+
1999
+ <span class="sd"> &quot;&quot;&quot;</span>
2000
+
2001
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
2002
+
2003
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Reading conductor credentials...&quot;</span><span class="p">)</span>
2004
+ <span class="k">if</span> <span class="n">use_api_key</span><span class="p">:</span>
2005
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;api_key&quot;</span><span class="p">):</span>
2006
+ <span class="n">use_api_key</span> <span class="o">=</span> <span class="kc">False</span>
2007
+ <span class="k">if</span> <span class="n">use_api_key</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;api_key&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;client_id&quot;</span><span class="p">):</span>
2008
+ <span class="n">use_api_key</span> <span class="o">=</span> <span class="kc">False</span>
2009
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;use_api_key = </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">use_api_key</span><span class="p">)</span>
2010
+ <span class="n">creds_file</span> <span class="o">=</span> <span class="n">get_creds_path</span><span class="p">(</span><span class="n">use_api_key</span><span class="p">)</span>
2011
+
2012
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Creds file is </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">creds_file</span><span class="p">)</span>
2013
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Auth url is </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">])</span>
2014
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">creds_file</span><span class="p">):</span>
2015
+ <span class="k">if</span> <span class="n">use_api_key</span><span class="p">:</span>
2016
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;api_key&quot;</span><span class="p">]:</span>
2017
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Attempted to use API key, but no api key in in config!&quot;</span><span class="p">)</span>
2018
+ <span class="k">return</span> <span class="kc">None</span>
2019
+
2020
+ <span class="c1"># Exchange the API key for a bearer token</span>
2021
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Attempting to get API key bearer token&quot;</span><span class="p">)</span>
2022
+ <span class="n">get_api_key_bearer_token</span><span class="p">(</span><span class="n">creds_file</span><span class="p">)</span>
2023
+
2024
+ <span class="k">else</span><span class="p">:</span>
2025
+ <span class="n">auth</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">creds_file</span><span class="p">,</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">])</span>
2026
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">creds_file</span><span class="p">):</span>
2027
+ <span class="k">return</span> <span class="kc">None</span>
2028
+
2029
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Reading credentials file...&quot;</span><span class="p">)</span>
2030
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">creds_file</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>
2031
+ <span class="n">file_contents</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
2032
+ <span class="n">expiration</span> <span class="o">=</span> <span class="n">file_contents</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;expiration&quot;</span><span class="p">)</span>
2033
+ <span class="n">same_domain</span> <span class="o">=</span> <span class="n">creds_same_domain</span><span class="p">(</span><span class="n">file_contents</span><span class="p">)</span>
2034
+ <span class="k">if</span> <span class="n">same_domain</span> <span class="ow">and</span> <span class="n">expiration</span> <span class="ow">and</span> <span class="n">expiration</span> <span class="o">&gt;=</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()):</span>
2035
+ <span class="k">return</span> <span class="n">file_contents</span><span class="p">[</span><span class="s2">&quot;access_token&quot;</span><span class="p">]</span>
2036
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Credentials have expired or are from a different domain&quot;</span><span class="p">)</span>
2037
+ <span class="k">if</span> <span class="n">use_api_key</span><span class="p">:</span>
2038
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Refreshing API key bearer token!&quot;</span><span class="p">)</span>
2039
+ <span class="n">get_api_key_bearer_token</span><span class="p">(</span><span class="n">creds_file</span><span class="p">)</span>
2040
+ <span class="k">else</span><span class="p">:</span>
2041
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Sending to auth page...&quot;</span><span class="p">)</span>
2042
+ <span class="n">auth</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">creds_file</span><span class="p">,</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">])</span>
2043
+ <span class="c1"># Re-read the creds file, since it has been re-upped</span>
2044
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">creds_file</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>
2045
+ <span class="n">file_contents</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
2046
+ <span class="k">return</span> <span class="n">file_contents</span><span class="p">[</span><span class="s2">&quot;access_token&quot;</span><span class="p">]</span>
2047
+ </code></pre></div>
2048
+ </details>
2049
+ </div>
2050
+
2051
+ </div>
2052
+
2053
+
2054
+
2055
+ <div class="doc doc-object doc-function">
2056
+
2057
+
2058
+
2059
+ <h2 id="ciocore.api_client.get_api_key_bearer_token" class="doc doc-heading">
2060
+ <code class="highlight language-python"><span class="n">get_api_key_bearer_token</span><span class="p">(</span><span class="n">creds_file</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
2061
+
2062
+
2063
+ </h2>
2064
+
2065
+ <div class="doc doc-contents ">
2066
+
2067
+ <p>Get a bearer token from the API key.</p>
2068
+
2069
+ <p><strong>Parameters:</strong></p>
2070
+ <table>
2071
+ <thead>
2072
+ <tr>
2073
+ <th>Name</th>
2074
+ <th>Type</th>
2075
+ <th>Description</th>
2076
+ <th>Default</th>
2077
+ </tr>
2078
+ </thead>
2079
+ <tbody>
2080
+ <tr>
2081
+ <td><code>creds_file</code></td>
2082
+ <td><code>str</code></td>
2083
+ <td><p>The path to the credentials file. If not provided, the bearer token will not be written to disk.</p></td>
2084
+ <td><code>None</code></td>
2085
+ </tr>
2086
+ </tbody>
2087
+ </table>
2088
+ <p><strong>Returns:</strong></p>
2089
+ <table>
2090
+ <thead>
2091
+ <tr>
2092
+ <th>Type</th>
2093
+ <th>Description</th>
2094
+ </tr>
2095
+ </thead>
2096
+ <tbody>
2097
+ <tr>
2098
+ <td></td>
2099
+ <td><p>A dictionary containing the bearer token and other information.</p></td>
2100
+ </tr>
2101
+ </tbody>
2102
+ </table>
2103
+ <details class="quote">
2104
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2105
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_api_key_bearer_token</span><span class="p">(</span><span class="n">creds_file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
2106
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2107
+ <span class="sd"> Get a bearer token from the API key.</span>
2108
+
2109
+ <span class="sd"> Args:</span>
2110
+ <span class="sd"> creds_file (str): The path to the credentials file. If not provided, the bearer token will not be written to disk.</span>
2111
+
2112
+ <span class="sd"> Returns:</span>
2113
+ <span class="sd"> A dictionary containing the bearer token and other information.</span>
2114
+ <span class="sd"> &quot;&quot;&quot;</span>
2115
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
2116
+ <span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/api/oauth_jwt&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">])</span>
2117
+ <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
2118
+ <span class="n">url</span><span class="p">,</span>
2119
+ <span class="n">params</span><span class="o">=</span><span class="p">{</span>
2120
+ <span class="s2">&quot;grant_type&quot;</span><span class="p">:</span> <span class="s2">&quot;client_credentials&quot;</span><span class="p">,</span>
2121
+ <span class="s2">&quot;scope&quot;</span><span class="p">:</span> <span class="s2">&quot;owner admin user&quot;</span><span class="p">,</span>
2122
+ <span class="s2">&quot;client_id&quot;</span><span class="p">:</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;api_key&quot;</span><span class="p">][</span><span class="s2">&quot;client_id&quot;</span><span class="p">],</span>
2123
+ <span class="s2">&quot;client_secret&quot;</span><span class="p">:</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;api_key&quot;</span><span class="p">][</span><span class="s2">&quot;private_key&quot;</span><span class="p">],</span>
2124
+ <span class="p">},</span>
2125
+ <span class="p">)</span>
2126
+ <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
2127
+ <span class="n">response_dict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
2128
+ <span class="n">credentials_dict</span> <span class="o">=</span> <span class="p">{</span>
2129
+ <span class="s2">&quot;access_token&quot;</span><span class="p">:</span> <span class="n">response_dict</span><span class="p">[</span><span class="s2">&quot;access_token&quot;</span><span class="p">],</span>
2130
+ <span class="s2">&quot;token_type&quot;</span><span class="p">:</span> <span class="s2">&quot;Bearer&quot;</span><span class="p">,</span>
2131
+ <span class="s2">&quot;expiration&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">response_dict</span><span class="p">[</span><span class="s2">&quot;expires_in&quot;</span><span class="p">]),</span>
2132
+ <span class="s2">&quot;scope&quot;</span><span class="p">:</span> <span class="s2">&quot;user admin owner&quot;</span><span class="p">,</span>
2133
+ <span class="p">}</span>
2134
+
2135
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">creds_file</span><span class="p">:</span>
2136
+ <span class="k">return</span> <span class="n">credentials_dict</span>
2137
+
2138
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">creds_file</span><span class="p">)):</span>
2139
+ <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">creds_file</span><span class="p">))</span>
2140
+
2141
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">creds_file</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>
2142
+ <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">credentials_dict</span><span class="p">))</span>
2143
+ <span class="k">return</span>
2144
+ </code></pre></div>
2145
+ </details>
2146
+ </div>
2147
+
2148
+ </div>
2149
+
2150
+
2151
+
2152
+ <div class="doc doc-object doc-function">
2153
+
2154
+
2155
+
2156
+ <h2 id="ciocore.api_client.get_creds_path" class="doc doc-heading">
2157
+ <code class="highlight language-python"><span class="n">get_creds_path</span><span class="p">(</span><span class="n">api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
2158
+
2159
+
2160
+ </h2>
2161
+
2162
+ <div class="doc doc-contents ">
2163
+
2164
+ <p>Get the path to the credentials file.</p>
2165
+
2166
+ <p><strong>Parameters:</strong></p>
2167
+ <table>
2168
+ <thead>
2169
+ <tr>
2170
+ <th>Name</th>
2171
+ <th>Type</th>
2172
+ <th>Description</th>
2173
+ <th>Default</th>
2174
+ </tr>
2175
+ </thead>
2176
+ <tbody>
2177
+ <tr>
2178
+ <td><code>api_key</code></td>
2179
+ <td><code>bool</code></td>
2180
+ <td><p>Whether or not to use the API key.</p></td>
2181
+ <td><code>False</code></td>
2182
+ </tr>
2183
+ </tbody>
2184
+ </table>
2185
+ <p><strong>Returns:</strong></p>
2186
+ <table>
2187
+ <thead>
2188
+ <tr>
2189
+ <th>Type</th>
2190
+ <th>Description</th>
2191
+ </tr>
2192
+ </thead>
2193
+ <tbody>
2194
+ <tr>
2195
+ <td><code>str</code></td>
2196
+ <td><p>The path to the credentials file.</p></td>
2197
+ </tr>
2198
+ </tbody>
2199
+ </table>
2200
+ <details class="quote">
2201
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2202
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_creds_path</span><span class="p">(</span><span class="n">api_key</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
2203
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2204
+ <span class="sd"> Get the path to the credentials file.</span>
2205
+
2206
+ <span class="sd"> Args:</span>
2207
+ <span class="sd"> api_key (bool): Whether or not to use the API key.</span>
2208
+
2209
+ <span class="sd"> Returns:</span>
2210
+ <span class="sd"> str: The path to the credentials file.</span>
2211
+ <span class="sd"> &quot;&quot;&quot;</span>
2212
+ <span class="n">creds_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s2">&quot;~&quot;</span><span class="p">),</span> <span class="s2">&quot;.config&quot;</span><span class="p">,</span> <span class="s2">&quot;conductor&quot;</span><span class="p">)</span>
2213
+ <span class="k">if</span> <span class="n">api_key</span><span class="p">:</span>
2214
+ <span class="n">creds_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">creds_dir</span><span class="p">,</span> <span class="s2">&quot;api_key_credentials&quot;</span><span class="p">)</span>
2215
+ <span class="k">else</span><span class="p">:</span>
2216
+ <span class="n">creds_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">creds_dir</span><span class="p">,</span> <span class="s2">&quot;credentials&quot;</span><span class="p">)</span>
2217
+ <span class="k">return</span> <span class="n">creds_file</span>
2218
+ </code></pre></div>
2219
+ </details>
2220
+ </div>
2221
+
2222
+ </div>
2223
+
2224
+
2225
+
2226
+ <div class="doc doc-object doc-function">
2227
+
2228
+
2229
+
2230
+ <h2 id="ciocore.api_client.get_bearer_token" class="doc doc-heading">
2231
+ <code class="highlight language-python"><span class="n">get_bearer_token</span><span class="p">(</span><span class="n">refresh</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
2232
+
2233
+
2234
+ </h2>
2235
+
2236
+ <div class="doc doc-contents ">
2237
+
2238
+ <p>Return the bearer token.</p>
2239
+
2240
+ <p><strong>Parameters:</strong></p>
2241
+ <table>
2242
+ <thead>
2243
+ <tr>
2244
+ <th>Name</th>
2245
+ <th>Type</th>
2246
+ <th>Description</th>
2247
+ <th>Default</th>
2248
+ </tr>
2249
+ </thead>
2250
+ <tbody>
2251
+ <tr>
2252
+ <td><code>refresh</code></td>
2253
+ <td><code>bool</code></td>
2254
+ <td><p>Whether or not to refresh the token.</p></td>
2255
+ <td><code>False</code></td>
2256
+ </tr>
2257
+ </tbody>
2258
+ </table>
2259
+
2260
+ <details class="quote">
2261
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2262
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_bearer_token</span><span class="p">(</span><span class="n">refresh</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
2263
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2264
+ <span class="sd"> Return the bearer token.</span>
2265
+
2266
+ <span class="sd"> Args:</span>
2267
+ <span class="sd"> refresh (bool): Whether or not to refresh the token.</span>
2268
+
2269
+ <span class="sd"> TODO: Thread safe multiproc caching, like it used to be pre-python3.7.</span>
2270
+ <span class="sd"> &quot;&quot;&quot;</span>
2271
+ <span class="k">return</span> <span class="n">read_conductor_credentials</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
2272
+ </code></pre></div>
2273
+ </details>
2274
+ </div>
2275
+
2276
+ </div>
2277
+
2278
+
2279
+
2280
+ <div class="doc doc-object doc-function">
2281
+
2282
+
2283
+
2284
+ <h2 id="ciocore.api_client.creds_same_domain" class="doc doc-heading">
2285
+ <code class="highlight language-python"><span class="n">creds_same_domain</span><span class="p">(</span><span class="n">creds</span><span class="p">)</span></code>
2286
+
2287
+
2288
+ </h2>
2289
+
2290
+ <div class="doc doc-contents ">
2291
+
2292
+ <p>Check if the creds are for the same domain as the config.</p>
2293
+
2294
+ <p><strong>Parameters:</strong></p>
2295
+ <table>
2296
+ <thead>
2297
+ <tr>
2298
+ <th>Name</th>
2299
+ <th>Type</th>
2300
+ <th>Description</th>
2301
+ <th>Default</th>
2302
+ </tr>
2303
+ </thead>
2304
+ <tbody>
2305
+ <tr>
2306
+ <td><code>creds</code></td>
2307
+ <td><code>dict</code></td>
2308
+ <td><p>The credentials dictionary.</p></td>
2309
+ <td><em>required</em></td>
2310
+ </tr>
2311
+ </tbody>
2312
+ </table>
2313
+ <p><strong>Returns:</strong></p>
2314
+ <table>
2315
+ <thead>
2316
+ <tr>
2317
+ <th>Type</th>
2318
+ <th>Description</th>
2319
+ </tr>
2320
+ </thead>
2321
+ <tbody>
2322
+ <tr>
2323
+ <td><code>bool</code></td>
2324
+ <td><p>Whether or not the creds are for the same domain as the config.</p></td>
2325
+ </tr>
2326
+ </tbody>
2327
+ </table>
2328
+ <details class="quote">
2329
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2330
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">creds_same_domain</span><span class="p">(</span><span class="n">creds</span><span class="p">):</span>
2331
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2332
+ <span class="sd"> Check if the creds are for the same domain as the config.</span>
2333
+
2334
+ <span class="sd"> Args:</span>
2335
+ <span class="sd"> creds (dict): The credentials dictionary.</span>
2336
+
2337
+ <span class="sd"> Returns:</span>
2338
+ <span class="sd"> bool: Whether or not the creds are for the same domain as the config.</span>
2339
+ <span class="sd"> &quot;&quot;&quot;</span>
2340
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
2341
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Ensure the creds file refers to the domain in config&quot;&quot;&quot;</span>
2342
+ <span class="n">token</span> <span class="o">=</span> <span class="n">creds</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;access_token&quot;</span><span class="p">)</span>
2343
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">token</span><span class="p">:</span>
2344
+ <span class="k">return</span> <span class="kc">False</span>
2345
+
2346
+ <span class="n">decoded</span> <span class="o">=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">creds</span><span class="p">[</span><span class="s2">&quot;access_token&quot;</span><span class="p">],</span> <span class="n">algorithms</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;HS256&quot;</span><span class="p">],</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;verify_signature&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
2347
+ <span class="n">audience_domain</span> <span class="o">=</span> <span class="n">decoded</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;aud&quot;</span><span class="p">)</span>
2348
+ <span class="k">return</span> <span class="p">(</span>
2349
+ <span class="n">audience_domain</span>
2350
+ <span class="ow">and</span> <span class="n">audience_domain</span><span class="o">.</span><span class="n">rpartition</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;api_url&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">rpartition</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
2351
+ <span class="p">)</span>
2352
+ </code></pre></div>
2353
+ </details>
2354
+ </div>
2355
+
2356
+ </div>
2357
+
2358
+
2359
+
2360
+ <div class="doc doc-object doc-function">
2361
+
2362
+
2363
+
2364
+ <h2 id="ciocore.api_client.account_id_from_jwt" class="doc doc-heading">
2365
+ <code class="highlight language-python"><span class="n">account_id_from_jwt</span><span class="p">(</span><span class="n">token</span><span class="p">)</span></code>
2366
+
2367
+
2368
+ </h2>
2369
+
2370
+ <div class="doc doc-contents ">
2371
+
2372
+ <p>Fetch the accounts id from a jwt token value.</p>
2373
+
2374
+ <p><strong>Parameters:</strong></p>
2375
+ <table>
2376
+ <thead>
2377
+ <tr>
2378
+ <th>Name</th>
2379
+ <th>Type</th>
2380
+ <th>Description</th>
2381
+ <th>Default</th>
2382
+ </tr>
2383
+ </thead>
2384
+ <tbody>
2385
+ <tr>
2386
+ <td><code>token</code></td>
2387
+ <td><code>str</code></td>
2388
+ <td><p>The jwt token.</p></td>
2389
+ <td><em>required</em></td>
2390
+ </tr>
2391
+ </tbody>
2392
+ </table>
2393
+ <p><strong>Returns:</strong></p>
2394
+ <table>
2395
+ <thead>
2396
+ <tr>
2397
+ <th>Type</th>
2398
+ <th>Description</th>
2399
+ </tr>
2400
+ </thead>
2401
+ <tbody>
2402
+ <tr>
2403
+ <td><code>str</code></td>
2404
+ <td><p>The account id.</p></td>
2405
+ </tr>
2406
+ </tbody>
2407
+ </table>
2408
+ <details class="quote">
2409
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2410
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">account_id_from_jwt</span><span class="p">(</span><span class="n">token</span><span class="p">):</span>
2411
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2412
+ <span class="sd"> Fetch the accounts id from a jwt token value.</span>
2413
+
2414
+ <span class="sd"> Args:</span>
2415
+ <span class="sd"> token (str): The jwt token.</span>
2416
+
2417
+ <span class="sd"> Returns:</span>
2418
+ <span class="sd"> str: The account id.</span>
2419
+ <span class="sd"> &quot;&quot;&quot;</span>
2420
+ <span class="n">payload</span> <span class="o">=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">algorithms</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;HS256&quot;</span><span class="p">],</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;verify_signature&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">})</span>
2421
+
2422
+ <span class="k">return</span> <span class="n">payload</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;account&quot;</span><span class="p">)</span>
2423
+ </code></pre></div>
2424
+ </details>
2425
+ </div>
2426
+
2427
+ </div>
2428
+
2429
+
2430
+
2431
+ <div class="doc doc-object doc-function">
2432
+
2433
+
2434
+
2435
+ <h2 id="ciocore.api_client.account_name_from_jwt" class="doc doc-heading">
2436
+ <code class="highlight language-python"><span class="n">account_name_from_jwt</span><span class="p">(</span><span class="n">token</span><span class="p">)</span></code>
2437
+
2438
+
2439
+ </h2>
2440
+
2441
+ <div class="doc doc-contents ">
2442
+
2443
+ <p>Fetch the accounts name from a jwt token value.</p>
2444
+
2445
+ <p><strong>Parameters:</strong></p>
2446
+ <table>
2447
+ <thead>
2448
+ <tr>
2449
+ <th>Name</th>
2450
+ <th>Type</th>
2451
+ <th>Description</th>
2452
+ <th>Default</th>
2453
+ </tr>
2454
+ </thead>
2455
+ <tbody>
2456
+ <tr>
2457
+ <td><code>token</code></td>
2458
+ <td><code>str</code></td>
2459
+ <td><p>The jwt token.</p></td>
2460
+ <td><em>required</em></td>
2461
+ </tr>
2462
+ </tbody>
2463
+ </table>
2464
+ <p><strong>Returns:</strong></p>
2465
+ <table>
2466
+ <thead>
2467
+ <tr>
2468
+ <th>Type</th>
2469
+ <th>Description</th>
2470
+ </tr>
2471
+ </thead>
2472
+ <tbody>
2473
+ <tr>
2474
+ <td><code>str</code></td>
2475
+ <td><p>The account name.</p></td>
2476
+ </tr>
2477
+ </tbody>
2478
+ </table>
2479
+ <details class="quote">
2480
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2481
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">account_name_from_jwt</span><span class="p">(</span><span class="n">token</span><span class="p">):</span>
2482
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2483
+ <span class="sd"> Fetch the accounts name from a jwt token value.</span>
2484
+
2485
+ <span class="sd"> Args:</span>
2486
+ <span class="sd"> token (str): The jwt token.</span>
2487
+
2488
+ <span class="sd"> Returns:</span>
2489
+ <span class="sd"> str: The account name.</span>
2490
+ <span class="sd"> &quot;&quot;&quot;</span>
2491
+ <span class="n">account_id</span> <span class="o">=</span> <span class="n">account_id_from_jwt</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
2492
+ <span class="n">cfg</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
2493
+ <span class="k">if</span> <span class="n">account_id</span><span class="p">:</span>
2494
+ <span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/api/v1/accounts/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">cfg</span><span class="p">[</span><span class="s2">&quot;api_url&quot;</span><span class="p">],</span> <span class="n">account_id</span><span class="p">)</span>
2495
+ <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;authorization&quot;</span><span class="p">:</span> <span class="s2">&quot;Bearer </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">token</span><span class="p">})</span>
2496
+ <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
2497
+ <span class="n">response_dict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
2498
+ <span class="k">return</span> <span class="n">response_dict</span><span class="p">[</span><span class="s2">&quot;data&quot;</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
2499
+ <span class="k">return</span> <span class="kc">None</span>
2500
+ </code></pre></div>
2501
+ </details>
2502
+ </div>
2503
+
2504
+ </div>
2505
+
2506
+
2507
+
2508
+ <div class="doc doc-object doc-function">
2509
+
2510
+
2511
+
2512
+ <h2 id="ciocore.api_client.request_instance_types" class="doc doc-heading">
2513
+ <code class="highlight language-python"><span class="n">request_instance_types</span><span class="p">(</span><span class="n">as_dict</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">filter_param</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></code>
2514
+
2515
+
2516
+ </h2>
2517
+
2518
+ <div class="doc doc-contents ">
2519
+
2520
+ <p>Get the list of available instances types.</p>
2521
+
2522
+ <p><strong>Parameters:</strong></p>
2523
+ <table>
2524
+ <thead>
2525
+ <tr>
2526
+ <th>Name</th>
2527
+ <th>Type</th>
2528
+ <th>Description</th>
2529
+ <th>Default</th>
2530
+ </tr>
2531
+ </thead>
2532
+ <tbody>
2533
+ <tr>
2534
+ <td><code>as_dict</code></td>
2535
+ <td><code>bool</code></td>
2536
+ <td><p>Whether or not to return the instance types as a dictionary.</p></td>
2537
+ <td><code>False</code></td>
2538
+ </tr>
2539
+ <tr>
2540
+ <td><code>filter_param</code></td>
2541
+ <td><code>string</code></td>
2542
+ <td><p>complex RHS string query ex:
2543
+ "cpu=gte:8:int,operating_system=ne:windows,gpu.gpu_count=eq:1:int"</p></td>
2544
+ <td><code>&#39;&#39;</code></td>
2545
+ </tr>
2546
+ </tbody>
2547
+ </table>
2548
+ <p><strong>Returns:</strong></p>
2549
+ <table>
2550
+ <thead>
2551
+ <tr>
2552
+ <th>Type</th>
2553
+ <th>Description</th>
2554
+ </tr>
2555
+ </thead>
2556
+ <tbody>
2557
+ <tr>
2558
+ <td><code>list</code></td>
2559
+ <td><p>The list of instance types.</p></td>
2560
+ </tr>
2561
+ </tbody>
2562
+ </table>
2563
+ <details class="quote">
2564
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2565
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">request_instance_types</span><span class="p">(</span><span class="n">as_dict</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">filter_param</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
2566
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2567
+ <span class="sd"> Get the list of available instances types.</span>
2568
+
2569
+ <span class="sd"> Args:</span>
2570
+ <span class="sd"> as_dict (bool): Whether or not to return the instance types as a dictionary.</span>
2571
+ <span class="sd"> filter_param (string): complex RHS string query ex:</span>
2572
+ <span class="sd"> &quot;cpu=gte:8:int,operating_system=ne:windows,gpu.gpu_count=eq:1:int&quot;</span>
2573
+
2574
+ <span class="sd"> Returns:</span>
2575
+ <span class="sd"> list: The list of instance types.</span>
2576
+ <span class="sd"> &quot;&quot;&quot;</span>
2577
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
2578
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
2579
+ <span class="s2">&quot;api/v1/instance-types&quot;</span><span class="p">,</span> <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
2580
+ <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;filter&quot;</span><span class="p">:</span><span class="n">filter_param</span><span class="p">}</span>
2581
+ <span class="p">)</span>
2582
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">200</span><span class="p">,):</span>
2583
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Failed to get instance types&quot;</span>
2584
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">API responded with status code </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">)</span>
2585
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
2586
+
2587
+ <span class="n">instance_types</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="p">[])</span>
2588
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Found available instance types: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">instance_types</span><span class="p">)</span>
2589
+
2590
+ <span class="k">if</span> <span class="n">as_dict</span><span class="p">:</span>
2591
+ <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span>
2592
+ <span class="p">[(</span><span class="n">instance</span><span class="p">[</span><span class="s2">&quot;description&quot;</span><span class="p">],</span> <span class="n">instance</span><span class="p">)</span> <span class="k">for</span> <span class="n">instance</span> <span class="ow">in</span> <span class="n">instance_types</span><span class="p">]</span>
2593
+ <span class="p">)</span>
2594
+ <span class="k">return</span> <span class="n">instance_types</span>
2595
+ </code></pre></div>
2596
+ </details>
2597
+ </div>
2598
+
2599
+ </div>
2600
+
2601
+
2602
+
2603
+ <div class="doc doc-object doc-function">
2604
+
2605
+
2606
+
2607
+ <h2 id="ciocore.api_client.request_projects" class="doc doc-heading">
2608
+ <code class="highlight language-python"><span class="n">request_projects</span><span class="p">(</span><span class="n">statuses</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">,))</span></code>
2609
+
2610
+
2611
+ </h2>
2612
+
2613
+ <div class="doc doc-contents ">
2614
+
2615
+ <p>Query Conductor for all client Projects that are in the given status(es).</p>
2616
+
2617
+ <p><strong>Parameters:</strong></p>
2618
+ <table>
2619
+ <thead>
2620
+ <tr>
2621
+ <th>Name</th>
2622
+ <th>Type</th>
2623
+ <th>Description</th>
2624
+ <th>Default</th>
2625
+ </tr>
2626
+ </thead>
2627
+ <tbody>
2628
+ <tr>
2629
+ <td><code>statuses</code></td>
2630
+ <td><code>tuple</code></td>
2631
+ <td><p>The statuses to filter for.</p></td>
2632
+ <td><code>(&#39;active&#39;,)</code></td>
2633
+ </tr>
2634
+ </tbody>
2635
+ </table>
2636
+ <p><strong>Returns:</strong></p>
2637
+ <table>
2638
+ <thead>
2639
+ <tr>
2640
+ <th>Type</th>
2641
+ <th>Description</th>
2642
+ </tr>
2643
+ </thead>
2644
+ <tbody>
2645
+ <tr>
2646
+ <td><code>list</code></td>
2647
+ <td><p>The list of project names.</p></td>
2648
+ </tr>
2649
+ </tbody>
2650
+ </table>
2651
+ <details class="quote">
2652
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2653
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">request_projects</span><span class="p">(</span><span class="n">statuses</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;active&quot;</span><span class="p">,)):</span>
2654
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2655
+ <span class="sd"> Query Conductor for all client Projects that are in the given status(es).</span>
2656
+
2657
+ <span class="sd"> Args:</span>
2658
+ <span class="sd"> statuses (tuple): The statuses to filter for.</span>
2659
+
2660
+ <span class="sd"> Returns:</span>
2661
+ <span class="sd"> list: The list of project names.</span>
2662
+ <span class="sd"> &quot;&quot;&quot;</span>
2663
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
2664
+
2665
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;statuses: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">statuses</span><span class="p">)</span>
2666
+
2667
+ <span class="n">uri</span> <span class="o">=</span> <span class="s2">&quot;api/v1/projects/&quot;</span>
2668
+
2669
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
2670
+ <span class="n">uri_path</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span> <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span>
2671
+ <span class="p">)</span>
2672
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;response: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
2673
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;response: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">response_code</span><span class="p">)</span>
2674
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
2675
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Failed to get available projects from Conductor&quot;</span>
2676
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
2677
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
2678
+ <span class="n">projects</span> <span class="o">=</span> <span class="p">[]</span>
2679
+
2680
+ <span class="c1"># Filter for only projects of the proper status</span>
2681
+ <span class="k">for</span> <span class="n">project</span> <span class="ow">in</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
2682
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">statuses</span> <span class="ow">or</span> <span class="n">project</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;status&quot;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">statuses</span><span class="p">:</span>
2683
+ <span class="n">projects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">project</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">])</span>
2684
+ <span class="k">return</span> <span class="n">projects</span>
2685
+ </code></pre></div>
2686
+ </details>
2687
+ </div>
2688
+
2689
+ </div>
2690
+
2691
+
2692
+
2693
+ <div class="doc doc-object doc-function">
2694
+
2695
+
2696
+
2697
+ <h2 id="ciocore.api_client.request_software_packages" class="doc doc-heading">
2698
+ <code class="highlight language-python"><span class="n">request_software_packages</span><span class="p">()</span></code>
2699
+
2700
+
2701
+ </h2>
2702
+
2703
+ <div class="doc doc-contents ">
2704
+
2705
+ <p>Query Conductor for all software packages for the currently available sidecar.</p>
2706
+
2707
+ <p><strong>Returns:</strong></p>
2708
+ <table>
2709
+ <thead>
2710
+ <tr>
2711
+ <th>Type</th>
2712
+ <th>Description</th>
2713
+ </tr>
2714
+ </thead>
2715
+ <tbody>
2716
+ <tr>
2717
+ <td><code>list</code></td>
2718
+ <td><p>The list of software packages.</p></td>
2719
+ </tr>
2720
+ </tbody>
2721
+ </table>
2722
+ <details class="quote">
2723
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2724
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">request_software_packages</span><span class="p">():</span>
2725
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2726
+ <span class="sd"> Query Conductor for all software packages for the currently available sidecar.</span>
2727
+
2728
+ <span class="sd"> Returns:</span>
2729
+ <span class="sd"> list: The list of software packages.</span>
2730
+ <span class="sd"> &quot;&quot;&quot;</span>
2731
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
2732
+
2733
+ <span class="n">uri</span> <span class="o">=</span> <span class="s2">&quot;api/v1/ee/packages?all=true,&quot;</span>
2734
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
2735
+ <span class="n">uri_path</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span> <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span>
2736
+ <span class="p">)</span>
2737
+
2738
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
2739
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Failed to get software packages for latest sidecar&quot;</span>
2740
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
2741
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
2742
+
2743
+ <span class="n">software</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="p">[])</span>
2744
+ <span class="n">software</span> <span class="o">=</span> <span class="p">[</span><span class="n">sw</span> <span class="k">for</span> <span class="n">sw</span> <span class="ow">in</span> <span class="n">software</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="s2">&quot;3dsmax&quot;</span> <span class="ow">in</span> <span class="n">sw</span><span class="p">[</span><span class="s2">&quot;product&quot;</span><span class="p">]</span> <span class="ow">and</span> <span class="n">sw</span><span class="p">[</span><span class="s2">&quot;platform&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;linux&quot;</span><span class="p">)]</span>
2745
+ <span class="k">return</span> <span class="n">software</span>
2746
+ </code></pre></div>
2747
+ </details>
2748
+ </div>
2749
+
2750
+ </div>
2751
+
2752
+
2753
+
2754
+ <div class="doc doc-object doc-function">
2755
+
2756
+
2757
+
2758
+ <h2 id="ciocore.api_client.request_extra_environment" class="doc doc-heading">
2759
+ <code class="highlight language-python"><span class="n">request_extra_environment</span><span class="p">()</span></code>
2760
+
2761
+
2762
+ </h2>
2763
+
2764
+ <div class="doc doc-contents ">
2765
+
2766
+ <p>Query Conductor for extra environment.</p>
2767
+
2768
+ <details class="quote">
2769
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2770
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">request_extra_environment</span><span class="p">():</span>
2771
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2772
+ <span class="sd"> Query Conductor for extra environment.</span>
2773
+ <span class="sd"> &quot;&quot;&quot;</span>
2774
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
2775
+
2776
+ <span class="n">uri</span> <span class="o">=</span> <span class="s2">&quot;api/v1/integrations/env-vars-configs&quot;</span>
2777
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
2778
+ <span class="n">uri_path</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span> <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span>
2779
+ <span class="p">)</span>
2780
+
2781
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
2782
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Failed to get extra environment&quot;</span>
2783
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
2784
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
2785
+
2786
+ <span class="n">all_accounts</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="p">[])</span>
2787
+
2788
+ <span class="n">token</span> <span class="o">=</span> <span class="n">read_conductor_credentials</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
2789
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">token</span><span class="p">:</span>
2790
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Error: Could not get conductor credentials!&quot;</span><span class="p">)</span>
2791
+ <span class="n">account_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">account_id_from_jwt</span><span class="p">(</span><span class="n">token</span><span class="p">))</span>
2792
+
2793
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">account_id</span><span class="p">:</span>
2794
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Error: Could not get account id from jwt!&quot;</span><span class="p">)</span>
2795
+ <span class="n">account_env</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">account</span> <span class="k">for</span> <span class="n">account</span> <span class="ow">in</span> <span class="n">all_accounts</span> <span class="k">if</span> <span class="n">account</span><span class="p">[</span><span class="s2">&quot;account_id&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">account_id</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
2796
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">account_env</span><span class="p">:</span>
2797
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Error: Could not get account environment!&quot;</span><span class="p">)</span>
2798
+ <span class="k">return</span> <span class="n">account_env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;env&quot;</span><span class="p">,</span> <span class="p">[])</span>
2799
+ </code></pre></div>
2800
+ </details>
2801
+ </div>
2802
+
2803
+ </div>
2804
+
2805
+
2806
+
2807
+ <div class="doc doc-object doc-function">
2808
+
2809
+
2810
+
2811
+ <h2 id="ciocore.api_client.get_jobs" class="doc doc-heading">
2812
+ <code class="highlight language-python"><span class="n">get_jobs</span><span class="p">(</span><span class="n">first_jid</span><span class="p">,</span> <span class="n">last_jid</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
2813
+
2814
+
2815
+ </h2>
2816
+
2817
+ <div class="doc doc-contents ">
2818
+
2819
+ <p>Query Conductor for all jobs between the given job ids.</p>
2820
+
2821
+ <p><strong>Returns:</strong></p>
2822
+ <table>
2823
+ <thead>
2824
+ <tr>
2825
+ <th>Type</th>
2826
+ <th>Description</th>
2827
+ </tr>
2828
+ </thead>
2829
+ <tbody>
2830
+ <tr>
2831
+ <td><code>list</code></td>
2832
+ <td><p>The list of jobs.</p></td>
2833
+ </tr>
2834
+ </tbody>
2835
+ </table>
2836
+ <p><strong>Exceptions:</strong></p>
2837
+ <table>
2838
+ <thead>
2839
+ <tr>
2840
+ <th>Type</th>
2841
+ <th>Description</th>
2842
+ </tr>
2843
+ </thead>
2844
+ <tbody>
2845
+ <tr>
2846
+ <td><code>Exception</code></td>
2847
+ <td><p>If the request fails.</p></td>
2848
+ </tr>
2849
+ </tbody>
2850
+ </table>
2851
+ <p><strong>Examples:</strong></p>
2852
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span>
2853
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">jobs</span> <span class="o">=</span> <span class="n">api_client</span><span class="o">.</span><span class="n">get_jobs</span><span class="p">(</span><span class="mi">1959</span><span class="p">)</span>
2854
+ <span class="o">&gt;&gt;&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">jobs</span><span class="p">)</span>
2855
+ <span class="mi">1</span>
2856
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">jobs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;jid&quot;</span><span class="p">]</span>
2857
+ <span class="s1">&#39;01959&#39;</span>
2858
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">jobs</span> <span class="o">=</span> <span class="n">api_client</span><span class="o">.</span><span class="n">get_jobs</span><span class="p">(</span><span class="mi">1959</span><span class="p">,</span> <span class="mi">1961</span><span class="p">)</span>
2859
+ <span class="o">&gt;&gt;&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">jobs</span><span class="p">)</span>
2860
+ <span class="mi">3</span>
2861
+ </code></pre></div>
2862
+
2863
+ <details class="quote">
2864
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
2865
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_jobs</span><span class="p">(</span><span class="n">first_jid</span><span class="p">,</span> <span class="n">last_jid</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
2866
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
2867
+ <span class="sd"> Query Conductor for all jobs between the given job ids.</span>
2868
+
2869
+ <span class="sd"> Returns:</span>
2870
+ <span class="sd"> list: The list of jobs.</span>
2871
+
2872
+ <span class="sd"> Raises:</span>
2873
+ <span class="sd"> Exception: If the request fails.</span>
2874
+
2875
+ <span class="sd"> Examples:</span>
2876
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
2877
+ <span class="sd"> &gt;&gt;&gt; jobs = api_client.get_jobs(1959)</span>
2878
+ <span class="sd"> &gt;&gt;&gt; len(jobs)</span>
2879
+ <span class="sd"> 1</span>
2880
+ <span class="sd"> &gt;&gt;&gt; jobs[0][&quot;jid&quot;]</span>
2881
+ <span class="sd"> &#39;01959&#39;</span>
2882
+ <span class="sd"> &gt;&gt;&gt; jobs = api_client.get_jobs(1959, 1961)</span>
2883
+ <span class="sd"> &gt;&gt;&gt; len(jobs)</span>
2884
+ <span class="sd"> 3</span>
2885
+ <span class="sd"> &quot;&quot;&quot;</span>
2886
+ <span class="k">if</span> <span class="n">last_jid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
2887
+ <span class="n">last_jid</span> <span class="o">=</span> <span class="n">first_jid</span>
2888
+ <span class="n">low</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">first_jid</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
2889
+ <span class="n">high</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">last_jid</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
2890
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
2891
+ <span class="n">uri</span> <span class="o">=</span> <span class="s2">&quot;api/v1/jobs&quot;</span>
2892
+
2893
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
2894
+ <span class="n">uri_path</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span>
2895
+ <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span>
2896
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
2897
+ <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
2898
+ <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;filter&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;jid_gt_</span><span class="si">{</span><span class="n">low</span><span class="si">}</span><span class="s2">,jid_lt_</span><span class="si">{</span><span class="n">high</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">},</span>
2899
+ <span class="p">)</span>
2900
+
2901
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
2902
+ <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Failed to get jobs </span><span class="si">{</span><span class="n">first_jid</span><span class="si">}</span><span class="s2">-</span><span class="si">{</span><span class="n">last_jid</span><span class="si">}</span><span class="s2">&quot;</span>
2903
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
2904
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
2905
+ <span class="n">jobs</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">)</span>
2906
+ <span class="k">return</span> <span class="n">jobs</span>
2907
+ </code></pre></div>
2908
+ </details>
2909
+ </div>
2910
+
2911
+ </div>
2912
+
2913
+
2914
+
2915
+ <div class="doc doc-object doc-function">
2916
+
2917
+
2918
+
2919
+ <h2 id="ciocore.api_client.get_log" class="doc doc-heading">
2920
+ <code class="highlight language-python"><span class="n">get_log</span><span class="p">(</span><span class="n">job_id</span><span class="p">,</span> <span class="n">task_id</span><span class="p">)</span></code>
2921
+
2922
+
2923
+ </h2>
2924
+
2925
+ <div class="doc doc-contents ">
2926
+
2927
+ <p>Get the log for the given job and task.</p>
2928
+
2929
+ <p><strong>Parameters:</strong></p>
2930
+ <table>
2931
+ <thead>
2932
+ <tr>
2933
+ <th>Name</th>
2934
+ <th>Type</th>
2935
+ <th>Description</th>
2936
+ <th>Default</th>
2937
+ </tr>
2938
+ </thead>
2939
+ <tbody>
2940
+ <tr>
2941
+ <td><code>job_id</code></td>
2942
+ <td><code>str</code></td>
2943
+ <td><p>The job id.</p></td>
2944
+ <td><em>required</em></td>
2945
+ </tr>
2946
+ <tr>
2947
+ <td><code>task_id</code></td>
2948
+ <td><code>str</code></td>
2949
+ <td><p>The task id.</p></td>
2950
+ <td><em>required</em></td>
2951
+ </tr>
2952
+ </tbody>
2953
+ </table>
2954
+ <p><strong>Returns:</strong></p>
2955
+ <table>
2956
+ <thead>
2957
+ <tr>
2958
+ <th>Type</th>
2959
+ <th>Description</th>
2960
+ </tr>
2961
+ </thead>
2962
+ <tbody>
2963
+ <tr>
2964
+ <td><code>list</code></td>
2965
+ <td><p>A list of logs.</p></td>
2966
+ </tr>
2967
+ </tbody>
2968
+ </table>
2969
+ <p><strong>Exceptions:</strong></p>
2970
+ <table>
2971
+ <thead>
2972
+ <tr>
2973
+ <th>Type</th>
2974
+ <th>Description</th>
2975
+ </tr>
2976
+ </thead>
2977
+ <tbody>
2978
+ <tr>
2979
+ <td><code>Exception</code></td>
2980
+ <td><p>If the request fails.</p></td>
2981
+ </tr>
2982
+ </tbody>
2983
+ </table>
2984
+ <p><strong>Examples:</strong></p>
2985
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span>
2986
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">logs</span> <span class="o">=</span> <span class="n">api_client</span><span class="o">.</span><span class="n">get_log</span><span class="p">(</span><span class="mi">1959</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
2987
+ <span class="p">{</span>
2988
+ <span class="s2">&quot;logs&quot;</span><span class="p">:</span> <span class="p">[</span>
2989
+ <span class="p">{</span>
2990
+ <span class="s2">&quot;container_id&quot;</span><span class="p">:</span> <span class="s2">&quot;j-5669544198668288-5619559933149184-5095331660038144-stde&quot;</span><span class="p">,</span>
2991
+ <span class="s2">&quot;instance_name&quot;</span><span class="p">:</span> <span class="s2">&quot;renderer-5669544198668288-170062309438-62994&quot;</span><span class="p">,</span>
2992
+ <span class="s2">&quot;log&quot;</span><span class="p">:</span> <span class="p">[</span>
2993
+ <span class="s2">&quot;Blender 2.93.0 (hash 84da05a8b806 built 2021-06-02 11:29:24)&quot;</span><span class="p">,</span>
2994
+ <span class="o">...</span>
2995
+ <span class="o">...</span>
2996
+ <span class="s2">&quot;Saved: &#39;/var/folders/8r/46lmjdmj50x_0swd9klwptzm0000gq/T/blender_bmw/renders/render_0001.png&#39;&quot;</span><span class="p">,</span>
2997
+ <span class="s2">&quot; Time: 00:29.22 (Saving: 00:00.32)&quot;</span><span class="p">,</span>
2998
+ <span class="s2">&quot;&quot;</span><span class="p">,</span>
2999
+ <span class="s2">&quot;&quot;</span><span class="p">,</span>
3000
+ <span class="s2">&quot;Blender quit&quot;</span>
3001
+ <span class="p">],</span>
3002
+ <span class="s2">&quot;timestamp&quot;</span><span class="p">:</span> <span class="s2">&quot;1.700623521101516E9&quot;</span>
3003
+ <span class="p">}</span>
3004
+ <span class="p">],</span>
3005
+ <span class="s2">&quot;new_num_lines&quot;</span><span class="p">:</span> <span class="p">[</span>
3006
+ <span class="mi">144</span>
3007
+ <span class="p">],</span>
3008
+ <span class="s2">&quot;status_description&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
3009
+ <span class="s2">&quot;task_status&quot;</span><span class="p">:</span> <span class="s2">&quot;success&quot;</span>
3010
+ <span class="p">}</span>
3011
+ </code></pre></div>
3012
+
3013
+ <details class="quote">
3014
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
3015
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_log</span><span class="p">(</span><span class="n">job_id</span><span class="p">,</span> <span class="n">task_id</span><span class="p">):</span>
3016
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
3017
+ <span class="sd"> Get the log for the given job and task.</span>
3018
+
3019
+ <span class="sd"> Args:</span>
3020
+ <span class="sd"> job_id (str): The job id.</span>
3021
+ <span class="sd"> task_id (str): The task id.</span>
3022
+
3023
+ <span class="sd"> Returns:</span>
3024
+ <span class="sd"> list: A list of logs.</span>
3025
+
3026
+ <span class="sd"> Raises:</span>
3027
+ <span class="sd"> Exception: If the request fails.</span>
3028
+
3029
+ <span class="sd"> Examples:</span>
3030
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
3031
+ <span class="sd"> &gt;&gt;&gt; logs = api_client.get_log(1959, 0)</span>
3032
+ <span class="sd"> {</span>
3033
+ <span class="sd"> &quot;logs&quot;: [</span>
3034
+ <span class="sd"> {</span>
3035
+ <span class="sd"> &quot;container_id&quot;: &quot;j-5669544198668288-5619559933149184-5095331660038144-stde&quot;,</span>
3036
+ <span class="sd"> &quot;instance_name&quot;: &quot;renderer-5669544198668288-170062309438-62994&quot;,</span>
3037
+ <span class="sd"> &quot;log&quot;: [</span>
3038
+ <span class="sd"> &quot;Blender 2.93.0 (hash 84da05a8b806 built 2021-06-02 11:29:24)&quot;,</span>
3039
+ <span class="sd"> ...</span>
3040
+ <span class="sd"> ...</span>
3041
+ <span class="sd"> &quot;Saved: &#39;/var/folders/8r/46lmjdmj50x_0swd9klwptzm0000gq/T/blender_bmw/renders/render_0001.png&#39;&quot;,</span>
3042
+ <span class="sd"> &quot; Time: 00:29.22 (Saving: 00:00.32)&quot;,</span>
3043
+ <span class="sd"> &quot;&quot;,</span>
3044
+ <span class="sd"> &quot;&quot;,</span>
3045
+ <span class="sd"> &quot;Blender quit&quot;</span>
3046
+ <span class="sd"> ],</span>
3047
+ <span class="sd"> &quot;timestamp&quot;: &quot;1.700623521101516E9&quot;</span>
3048
+ <span class="sd"> }</span>
3049
+ <span class="sd"> ],</span>
3050
+ <span class="sd"> &quot;new_num_lines&quot;: [</span>
3051
+ <span class="sd"> 144</span>
3052
+ <span class="sd"> ],</span>
3053
+ <span class="sd"> &quot;status_description&quot;: &quot;&quot;,</span>
3054
+ <span class="sd"> &quot;task_status&quot;: &quot;success&quot;</span>
3055
+ <span class="sd"> }</span>
3056
+ <span class="sd"> &quot;&quot;&quot;</span>
3057
+ <span class="n">job_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
3058
+ <span class="n">task_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">task_id</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
3059
+
3060
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
3061
+ <span class="n">uri</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;get_log_file?job=</span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&amp;task=</span><span class="si">{</span><span class="n">task_id</span><span class="si">}</span><span class="s2">&amp;num_lines[]=0&quot;</span>
3062
+
3063
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
3064
+ <span class="n">uri_path</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span> <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span>
3065
+ <span class="p">)</span>
3066
+
3067
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
3068
+ <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Failed to get log for job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2"> task </span><span class="si">{</span><span class="n">task_id</span><span class="si">}</span><span class="s2">&quot;</span>
3069
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
3070
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
3071
+
3072
+ <span class="k">return</span> <span class="n">response</span>
3073
+ </code></pre></div>
3074
+ </details>
3075
+ </div>
3076
+
3077
+ </div>
3078
+
3079
+
3080
+
3081
+ <div class="doc doc-object doc-function">
3082
+
3083
+
3084
+
3085
+ <h2 id="ciocore.api_client.kill_jobs" class="doc doc-heading">
3086
+ <code class="highlight language-python"><span class="n">kill_jobs</span><span class="p">(</span><span class="o">*</span><span class="n">job_ids</span><span class="p">)</span></code>
3087
+
3088
+
3089
+ </h2>
3090
+
3091
+ <div class="doc doc-contents ">
3092
+
3093
+ <p>Kill the given jobs.</p>
3094
+
3095
+ <p><strong>Parameters:</strong></p>
3096
+ <table>
3097
+ <thead>
3098
+ <tr>
3099
+ <th>Name</th>
3100
+ <th>Type</th>
3101
+ <th>Description</th>
3102
+ <th>Default</th>
3103
+ </tr>
3104
+ </thead>
3105
+ <tbody>
3106
+ <tr>
3107
+ <td><code>job_ids</code></td>
3108
+ <td><code>list</code></td>
3109
+ <td><p>The list of job ids.</p></td>
3110
+ <td><code>()</code></td>
3111
+ </tr>
3112
+ </tbody>
3113
+ </table>
3114
+ <p><strong>Returns:</strong></p>
3115
+ <table>
3116
+ <thead>
3117
+ <tr>
3118
+ <th>Type</th>
3119
+ <th>Description</th>
3120
+ </tr>
3121
+ </thead>
3122
+ <tbody>
3123
+ <tr>
3124
+ <td><code>dict</code></td>
3125
+ <td><p>The response.</p></td>
3126
+ </tr>
3127
+ </tbody>
3128
+ </table>
3129
+ <p><strong>Examples:</strong></p>
3130
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span>
3131
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">api_client</span><span class="o">.</span><span class="n">kill_jobs</span><span class="p">(</span><span class="s2">&quot;03095&quot;</span><span class="p">,</span><span class="s2">&quot;03094&quot;</span><span class="p">)</span>
3132
+ <span class="p">{</span><span class="s1">&#39;body&#39;</span><span class="p">:</span> <span class="s1">&#39;success&#39;</span><span class="p">,</span> <span class="s1">&#39;message&#39;</span><span class="p">:</span> <span class="s2">&quot;Jobs [u&#39;03095&#39;, u&#39;03094&#39;] have been kill.&quot;</span><span class="p">}</span>
3133
+ </code></pre></div>
3134
+
3135
+ <details class="quote">
3136
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
3137
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">kill_jobs</span><span class="p">(</span><span class="o">*</span><span class="n">job_ids</span><span class="p">):</span>
3138
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
3139
+ <span class="sd"> Kill the given jobs.</span>
3140
+
3141
+ <span class="sd"> Args:</span>
3142
+ <span class="sd"> job_ids (list): The list of job ids.</span>
3143
+
3144
+ <span class="sd"> Returns:</span>
3145
+ <span class="sd"> dict: The response.</span>
3146
+
3147
+ <span class="sd"> Examples:</span>
3148
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
3149
+ <span class="sd"> &gt;&gt;&gt; api_client.kill_jobs(&quot;03095&quot;,&quot;03094&quot;)</span>
3150
+ <span class="sd"> {&#39;body&#39;: &#39;success&#39;, &#39;message&#39;: &quot;Jobs [u&#39;03095&#39;, u&#39;03094&#39;] have been kill.&quot;}</span>
3151
+
3152
+ <span class="sd"> &quot;&quot;&quot;</span>
3153
+ <span class="n">job_ids</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="k">for</span> <span class="n">job_id</span> <span class="ow">in</span> <span class="n">job_ids</span><span class="p">]</span>
3154
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
3155
+ <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
3156
+ <span class="s2">&quot;action&quot;</span><span class="p">:</span> <span class="s2">&quot;kill&quot;</span><span class="p">,</span>
3157
+ <span class="s2">&quot;jobids&quot;</span><span class="p">:</span> <span class="n">job_ids</span><span class="p">,</span>
3158
+ <span class="p">}</span>
3159
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
3160
+ <span class="n">uri_path</span><span class="o">=</span><span class="s2">&quot;jobs_multi&quot;</span><span class="p">,</span>
3161
+ <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;PUT&quot;</span><span class="p">,</span>
3162
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
3163
+ <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
3164
+ <span class="n">data</span><span class="o">=</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
3165
+ <span class="p">)</span>
3166
+
3167
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
3168
+ <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Failed to kill jobs </span><span class="si">{</span><span class="n">job_ids</span><span class="si">}</span><span class="s2">&quot;</span>
3169
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
3170
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
3171
+
3172
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
3173
+ </code></pre></div>
3174
+ </details>
3175
+ </div>
3176
+
3177
+ </div>
3178
+
3179
+
3180
+
3181
+ <div class="doc doc-object doc-function">
3182
+
3183
+
3184
+
3185
+ <h2 id="ciocore.api_client.kill_tasks" class="doc doc-heading">
3186
+ <code class="highlight language-python"><span class="n">kill_tasks</span><span class="p">(</span><span class="n">job_id</span><span class="p">,</span> <span class="o">*</span><span class="n">task_ids</span><span class="p">)</span></code>
3187
+
3188
+
3189
+ </h2>
3190
+
3191
+ <div class="doc doc-contents ">
3192
+
3193
+ <p>Kill the given tasks.</p>
3194
+
3195
+ <p><strong>Parameters:</strong></p>
3196
+ <table>
3197
+ <thead>
3198
+ <tr>
3199
+ <th>Name</th>
3200
+ <th>Type</th>
3201
+ <th>Description</th>
3202
+ <th>Default</th>
3203
+ </tr>
3204
+ </thead>
3205
+ <tbody>
3206
+ <tr>
3207
+ <td><code>job_id</code></td>
3208
+ <td><code>str</code></td>
3209
+ <td><p>The job id.</p></td>
3210
+ <td><em>required</em></td>
3211
+ </tr>
3212
+ <tr>
3213
+ <td><code>task_ids</code></td>
3214
+ <td><code>list</code></td>
3215
+ <td><p>The list of task ids.</p></td>
3216
+ <td><code>()</code></td>
3217
+ </tr>
3218
+ </tbody>
3219
+ </table>
3220
+ <p><strong>Returns:</strong></p>
3221
+ <table>
3222
+ <thead>
3223
+ <tr>
3224
+ <th>Type</th>
3225
+ <th>Description</th>
3226
+ </tr>
3227
+ </thead>
3228
+ <tbody>
3229
+ <tr>
3230
+ <td><code>dict</code></td>
3231
+ <td><p>The response.</p></td>
3232
+ </tr>
3233
+ </tbody>
3234
+ </table>
3235
+ <p><strong>Examples:</strong></p>
3236
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span>
3237
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">api_client</span><span class="o">.</span><span class="n">kill_tasks</span><span class="p">(</span><span class="s2">&quot;03096&quot;</span><span class="p">,</span> <span class="o">*</span><span class="nb">range</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span><span class="mi">56</span><span class="p">))</span>
3238
+ <span class="p">{</span><span class="s1">&#39;body&#39;</span><span class="p">:</span> <span class="s1">&#39;success&#39;</span><span class="p">,</span> <span class="s1">&#39;message&#39;</span><span class="p">:</span> <span class="s1">&#39; 6 Tasks set to &quot;kill&quot;</span>
3239
+ <span class="mi">050</span>
3240
+ <span class="mi">051</span>
3241
+ <span class="mi">052</span>
3242
+ <span class="mi">053</span>
3243
+ <span class="mi">054</span>
3244
+ <span class="mi">055</span><span class="s1">&#39;}</span>
3245
+ </code></pre></div>
3246
+
3247
+ <details class="quote">
3248
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
3249
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">kill_tasks</span><span class="p">(</span><span class="n">job_id</span><span class="p">,</span> <span class="o">*</span><span class="n">task_ids</span><span class="p">):</span>
3250
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
3251
+ <span class="sd"> Kill the given tasks.</span>
3252
+
3253
+ <span class="sd"> Args:</span>
3254
+ <span class="sd"> job_id (str): The job id.</span>
3255
+ <span class="sd"> task_ids (list): The list of task ids.</span>
3256
+
3257
+ <span class="sd"> Returns:</span>
3258
+ <span class="sd"> dict: The response.</span>
3259
+
3260
+ <span class="sd"> Examples:</span>
3261
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
3262
+ <span class="sd"> &gt;&gt;&gt; api_client.kill_tasks(&quot;03096&quot;, *range(50,56))</span>
3263
+ <span class="sd"> {&#39;body&#39;: &#39;success&#39;, &#39;message&#39;: &#39; 6 Tasks set to &quot;kill&quot;\n\t050\n\t051\n\t052\n\t053\n\t054\n\t055&#39;}</span>
3264
+ <span class="sd"> &quot;&quot;&quot;</span>
3265
+
3266
+ <span class="n">job_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">job_id</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
3267
+ <span class="n">task_ids</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">task_id</span><span class="p">)</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="k">for</span> <span class="n">task_id</span> <span class="ow">in</span> <span class="n">task_ids</span><span class="p">]</span>
3268
+ <span class="n">api</span> <span class="o">=</span> <span class="n">ApiClient</span><span class="p">()</span>
3269
+ <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
3270
+ <span class="s2">&quot;action&quot;</span><span class="p">:</span> <span class="s2">&quot;kill&quot;</span><span class="p">,</span>
3271
+ <span class="s2">&quot;jobid&quot;</span><span class="p">:</span> <span class="n">job_id</span><span class="p">,</span>
3272
+ <span class="s2">&quot;taskids&quot;</span><span class="p">:</span> <span class="n">task_ids</span><span class="p">,</span>
3273
+ <span class="p">}</span>
3274
+ <span class="n">response</span><span class="p">,</span> <span class="n">response_code</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">make_request</span><span class="p">(</span>
3275
+ <span class="n">uri_path</span><span class="o">=</span><span class="s2">&quot;tasks_multi&quot;</span><span class="p">,</span>
3276
+ <span class="n">verb</span><span class="o">=</span><span class="s2">&quot;PUT&quot;</span><span class="p">,</span>
3277
+ <span class="n">raise_on_error</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
3278
+ <span class="n">use_api_key</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
3279
+ <span class="n">data</span><span class="o">=</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
3280
+ <span class="p">)</span>
3281
+
3282
+ <span class="k">if</span> <span class="n">response_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">200</span><span class="p">]:</span>
3283
+ <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Failed to kill tasks </span><span class="si">{</span><span class="n">task_ids</span><span class="si">}</span><span class="s2"> of job </span><span class="si">{</span><span class="n">job_id</span><span class="si">}</span><span class="s2">&quot;</span>
3284
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Error </span><span class="si">%s</span><span class="s2"> ...</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">response_code</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
3285
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
3286
+
3287
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
3288
+ </code></pre></div>
3289
+ </details>
3290
+ </div>
3291
+
3292
+ </div>
3293
+
3294
+
3295
+
3296
+ <div class="doc doc-object doc-function">
3297
+
3298
+
3299
+
3300
+ <h2 id="ciocore.api_client.get_compute_usage" class="doc doc-heading">
3301
+ <code class="highlight language-python"><span class="n">get_compute_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">)</span></code>
3302
+
3303
+
3304
+ </h2>
3305
+
3306
+ <div class="doc doc-contents ">
3307
+
3308
+ <p>Query the compute usage for an account.</p>
3309
+ <p>Compute includes licenses, instances and Conductor cost. Everything involved
3310
+ with running a job. </p>
3311
+
3312
+ <p><strong>Parameters:</strong></p>
3313
+ <table>
3314
+ <thead>
3315
+ <tr>
3316
+ <th>Name</th>
3317
+ <th>Type</th>
3318
+ <th>Description</th>
3319
+ <th>Default</th>
3320
+ </tr>
3321
+ </thead>
3322
+ <tbody>
3323
+ <tr>
3324
+ <td><code>start_time</code></td>
3325
+ <td><code>datetime.datetime</code></td>
3326
+ <td><p>The first day to include in the report. Only the date is considered and it's assumed to be in UTC.</p></td>
3327
+ <td><em>required</em></td>
3328
+ </tr>
3329
+ <tr>
3330
+ <td><code>end_time</code></td>
3331
+ <td><code>datetime.datetime</code></td>
3332
+ <td><p>The last day to include in the report. Only the date is considered and it's assumed to be in UTC.</p></td>
3333
+ <td><em>required</em></td>
3334
+ </tr>
3335
+ </tbody>
3336
+ </table>
3337
+ <p><strong>Returns:</strong></p>
3338
+ <table>
3339
+ <thead>
3340
+ <tr>
3341
+ <th>Type</th>
3342
+ <th>Description</th>
3343
+ </tr>
3344
+ </thead>
3345
+ <tbody>
3346
+ <tr>
3347
+ <td><code>dict</code></td>
3348
+ <td><p>Each key is a date (UTC). The value is a dict with values for:
3349
+ - cost: The total accumulated compute cost for the day
3350
+ - corehours: The total accumulated core hours for the day
3351
+ - walltime: The number of minutes that instances (regardless of type) were running</p></td>
3352
+ </tr>
3353
+ </tbody>
3354
+ </table>
3355
+ <p><strong>Examples:</strong></p>
3356
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span>
3357
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">api_client</span><span class="o">.</span><span class="n">get_compute_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">)</span>
3358
+ <span class="p">{</span> <span class="s1">&#39;2024-01-09&#39;</span><span class="p">:</span> <span class="p">{</span> <span class="s1">&#39;cost&#39;</span><span class="p">:</span> <span class="mf">0.08</span><span class="p">,</span>
3359
+ <span class="s1">&#39;corehours&#39;</span><span class="p">:</span> <span class="mf">0.9</span><span class="p">,</span>
3360
+ <span class="s1">&#39;walltime&#39;</span><span class="p">:</span> <span class="mf">13.93</span><span class="p">},</span>
3361
+ <span class="s1">&#39;2024-01-16&#39;</span><span class="p">:</span> <span class="p">{</span> <span class="s1">&#39;cost&#39;</span><span class="p">:</span> <span class="mf">0.12</span><span class="p">,</span>
3362
+ <span class="s1">&#39;corehours&#39;</span><span class="p">:</span> <span class="mf">0.9613</span><span class="p">,</span>
3363
+ <span class="s1">&#39;walltime&#39;</span><span class="p">:</span> <span class="mf">7.21</span><span class="p">}}</span>
3364
+ </code></pre></div>
3365
+
3366
+ <details class="quote">
3367
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
3368
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_compute_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">):</span>
3369
+ <span class="w"> </span><span class="sd">&#39;&#39;&#39;</span>
3370
+ <span class="sd"> Query the compute usage for an account.</span>
3371
+
3372
+ <span class="sd"> Compute includes licenses, instances and Conductor cost. Everything involved</span>
3373
+ <span class="sd"> with running a job. </span>
3374
+
3375
+ <span class="sd"> Args:</span>
3376
+ <span class="sd"> start_time (datetime.datetime): The first day to include in the report. Only the date is considered and it&#39;s assumed to be in UTC.</span>
3377
+ <span class="sd"> end_time (datetime.datetime): The last day to include in the report. Only the date is considered and it&#39;s assumed to be in UTC.</span>
3378
+
3379
+ <span class="sd"> Returns:</span>
3380
+ <span class="sd"> dict: Each key is a date (UTC). The value is a dict with values for:</span>
3381
+ <span class="sd"> - cost: The total accumulated compute cost for the day</span>
3382
+ <span class="sd"> - corehours: The total accumulated core hours for the day</span>
3383
+ <span class="sd"> - walltime: The number of minutes that instances (regardless of type) were running</span>
3384
+
3385
+ <span class="sd"> Examples:</span>
3386
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
3387
+ <span class="sd"> &gt;&gt;&gt; api_client.get_compute_usage(start_time, end_time)</span>
3388
+ <span class="sd"> { &#39;2024-01-09&#39;: { &#39;cost&#39;: 0.08,</span>
3389
+ <span class="sd"> &#39;corehours&#39;: 0.9, </span>
3390
+ <span class="sd"> &#39;walltime&#39;: 13.93},</span>
3391
+ <span class="sd"> &#39;2024-01-16&#39;: { &#39;cost&#39;: 0.12,</span>
3392
+ <span class="sd"> &#39;corehours&#39;: 0.9613, </span>
3393
+ <span class="sd"> &#39;walltime&#39;: 7.21}}</span>
3394
+ <span class="sd"> &#39;&#39;&#39;</span>
3395
+ <span class="n">date_format</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%a</span><span class="s2">, </span><span class="si">%d</span><span class="s2"> %b %Y %H:%M:%S %Z&quot;</span>
3396
+ <span class="n">data</span> <span class="o">=</span> <span class="n">_get_compute_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">)</span>
3397
+
3398
+ <span class="c1"># Create a nested default dictionary with initial float values of 0.0</span>
3399
+ <span class="n">results</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">float</span><span class="p">))</span>
3400
+
3401
+ <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
3402
+ <span class="n">entry_start_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">entry</span><span class="p">[</span><span class="s1">&#39;start_time&#39;</span><span class="p">],</span> <span class="n">date_format</span><span class="p">)</span><span class="o">.</span><span class="n">date</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
3403
+
3404
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;walltime&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">entry</span><span class="p">[</span><span class="s1">&#39;minutes&#39;</span><span class="p">]</span>
3405
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;corehours&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">entry</span><span class="p">[</span><span class="s1">&#39;cores&#39;</span><span class="p">]</span>
3406
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;cost&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">entry</span><span class="p">[</span><span class="s1">&#39;license_cost&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">entry</span><span class="p">[</span><span class="s1">&#39;instance_cost&#39;</span><span class="p">]</span>
3407
+
3408
+ <span class="c1"># Round the data to avoid FP errors</span>
3409
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;walltime&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;walltime&#39;</span><span class="p">],</span> <span class="mi">4</span><span class="p">)</span>
3410
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;corehours&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;corehours&#39;</span><span class="p">],</span> <span class="mi">4</span><span class="p">)</span>
3411
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;cost&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">][</span><span class="s1">&#39;cost&#39;</span><span class="p">],</span> <span class="mi">4</span><span class="p">)</span>
3412
+
3413
+ <span class="k">return</span> <span class="n">results</span>
3414
+ </code></pre></div>
3415
+ </details>
3416
+ </div>
3417
+
3418
+ </div>
3419
+
3420
+
3421
+
3422
+ <div class="doc doc-object doc-function">
3423
+
3424
+
3425
+
3426
+ <h2 id="ciocore.api_client.get_storage_usage" class="doc doc-heading">
3427
+ <code class="highlight language-python"><span class="n">get_storage_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">)</span></code>
3428
+
3429
+
3430
+ </h2>
3431
+
3432
+ <div class="doc doc-contents ">
3433
+
3434
+ <p>Query the storage usage for an account.</p>
3435
+ <p>Storage is calculated twice a day (UTC) and the average is used.</p>
3436
+
3437
+ <p><strong>Parameters:</strong></p>
3438
+ <table>
3439
+ <thead>
3440
+ <tr>
3441
+ <th>Name</th>
3442
+ <th>Type</th>
3443
+ <th>Description</th>
3444
+ <th>Default</th>
3445
+ </tr>
3446
+ </thead>
3447
+ <tbody>
3448
+ <tr>
3449
+ <td><code>start_time</code></td>
3450
+ <td><code>datetime.datetime</code></td>
3451
+ <td><p>The first day to include in the report. Only the date is considered and it's assumed to be in UTC.</p></td>
3452
+ <td><em>required</em></td>
3453
+ </tr>
3454
+ <tr>
3455
+ <td><code>end_time</code></td>
3456
+ <td><code>datetime.datetime</code></td>
3457
+ <td><p>The last day to include in the report. Only the date is considered and it's assumed to be in UTC.</p></td>
3458
+ <td><em>required</em></td>
3459
+ </tr>
3460
+ </tbody>
3461
+ </table>
3462
+ <p><strong>Returns:</strong></p>
3463
+ <table>
3464
+ <thead>
3465
+ <tr>
3466
+ <th>Type</th>
3467
+ <th>Description</th>
3468
+ </tr>
3469
+ </thead>
3470
+ <tbody>
3471
+ <tr>
3472
+ <td><code>dict</code></td>
3473
+ <td><p>Each key is a date (UTC). The value is a dict with values for:
3474
+ - cost: The cost of accumulated storage for that one day
3475
+ - GiB: The total amount of storage used on that day</p></td>
3476
+ </tr>
3477
+ </tbody>
3478
+ </table>
3479
+ <p><strong>Examples:</strong></p>
3480
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span>
3481
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">api_client</span><span class="o">.</span><span class="n">get_storage_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">)</span>
3482
+ <span class="p">{</span> <span class="s1">&#39;2024-01-01&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;cost&#39;</span><span class="p">:</span> <span class="mf">4.022</span><span class="p">,</span> <span class="s1">&#39;GiB&#39;</span><span class="p">:</span> <span class="mf">679.714</span><span class="p">},</span>
3483
+ <span class="s1">&#39;2024-01-02&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;cost&#39;</span><span class="p">:</span> <span class="mf">4.502</span><span class="p">,</span> <span class="s1">&#39;GiB&#39;</span><span class="p">:</span> <span class="mf">750.34</span><span class="p">},</span>
3484
+ <span class="s1">&#39;2024-01-03&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;cost&#39;</span><span class="p">:</span> <span class="mf">4.502</span><span class="p">,</span> <span class="s1">&#39;GiB&#39;</span><span class="p">:</span> <span class="mf">750.34</span><span class="p">}}</span>
3485
+ </code></pre></div>
3486
+
3487
+ <details class="quote">
3488
+ <summary>Source code in <code>ciocore/api_client.py</code></summary>
3489
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">get_storage_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">):</span>
3490
+ <span class="w"> </span><span class="sd">&#39;&#39;&#39;</span>
3491
+ <span class="sd"> Query the storage usage for an account.</span>
3492
+
3493
+ <span class="sd"> Storage is calculated twice a day (UTC) and the average is used.</span>
3494
+
3495
+ <span class="sd"> Args:</span>
3496
+ <span class="sd"> start_time (datetime.datetime): The first day to include in the report. Only the date is considered and it&#39;s assumed to be in UTC.</span>
3497
+ <span class="sd"> end_time (datetime.datetime): The last day to include in the report. Only the date is considered and it&#39;s assumed to be in UTC.</span>
3498
+
3499
+ <span class="sd"> Returns:</span>
3500
+ <span class="sd"> dict: Each key is a date (UTC). The value is a dict with values for:</span>
3501
+ <span class="sd"> - cost: The cost of accumulated storage for that one day</span>
3502
+ <span class="sd"> - GiB: The total amount of storage used on that day</span>
3503
+
3504
+ <span class="sd"> Examples:</span>
3505
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client</span>
3506
+ <span class="sd"> &gt;&gt;&gt; api_client.get_storage_usage(start_time, end_time)</span>
3507
+ <span class="sd"> { &#39;2024-01-01&#39;: {&#39;cost&#39;: 4.022, &#39;GiB&#39;: 679.714},</span>
3508
+ <span class="sd"> &#39;2024-01-02&#39;: {&#39;cost&#39;: 4.502, &#39;GiB&#39;: 750.34},</span>
3509
+ <span class="sd"> &#39;2024-01-03&#39;: {&#39;cost&#39;: 4.502, &#39;GiB&#39;: 750.34}}</span>
3510
+ <span class="sd"> &#39;&#39;&#39;</span>
3511
+ <span class="n">one_day</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
3512
+
3513
+ <span class="n">data</span> <span class="o">=</span> <span class="n">_get_storage_usage</span><span class="p">(</span><span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">)</span>
3514
+
3515
+ <span class="n">results</span> <span class="o">=</span> <span class="p">{}</span>
3516
+
3517
+ <span class="n">entry_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;start_date&#39;</span><span class="p">])</span>
3518
+
3519
+ <span class="k">for</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s2">&quot;cost_per_day&quot;</span><span class="p">]):</span>
3520
+
3521
+ <span class="n">entry_start_date</span> <span class="o">=</span> <span class="n">entry_date</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
3522
+ <span class="n">results</span><span class="p">[</span><span class="n">entry_start_date</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;cost&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">entry</span><span class="p">),</span> <span class="s1">&#39;GiB&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;gibs_per_day&#39;</span><span class="p">][</span><span class="n">cnt</span><span class="p">])}</span>
3523
+ <span class="n">entry_date</span> <span class="o">+=</span> <span class="n">one_day</span>
3524
+
3525
+ <span class="k">return</span> <span class="n">results</span>
3526
+ </code></pre></div>
3527
+ </details>
3528
+ </div>
3529
+
3530
+ </div>
3531
+
3532
+
3533
+
3534
+
3535
+
3536
+
3537
+ </div>
3538
+
3539
+ </div>
3540
+
3541
+ </div>
3542
+
3543
+
3544
+
3545
+
3546
+
3547
+
3548
+
3549
+
3550
+
3551
+
3552
+
3553
+
3554
+
3555
+ </article>
3556
+ </div>
3557
+
3558
+
3559
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
3560
+ </div>
3561
+
3562
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
3563
+
3564
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
3565
+ Back to top
3566
+ </button>
3567
+
3568
+ </main>
3569
+
3570
+ <footer class="md-footer">
3571
+
3572
+ <div class="md-footer-meta md-typeset">
3573
+ <div class="md-footer-meta__inner md-grid">
3574
+ <div class="md-copyright">
3575
+
3576
+ <div class="md-copyright__highlight">
3577
+ Copyright &copy; 2023, CoreWeave.
3578
+ </div>
3579
+
3580
+
3581
+ Made with
3582
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
3583
+ Material for MkDocs
3584
+ </a>
3585
+
3586
+ </div>
3587
+
3588
+ </div>
3589
+ </div>
3590
+ </footer>
3591
+
3592
+ </div>
3593
+ <div class="md-dialog" data-md-component="dialog">
3594
+ <div class="md-dialog__inner md-typeset"></div>
3595
+ </div>
3596
+
3597
+
3598
+ <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.expand", "navigation.instant", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "navigation.top"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
3599
+
3600
+
3601
+ <script src="../../assets/javascripts/bundle.471ce7a9.min.js"></script>
3602
+
3603
+
3604
+ </body>
3605
+ </html>