Mercurial > sci
annotate libsci/apic.c @ 50:b474f0985e39
scictl: add API key support
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 17 Aug 2022 09:11:58 +0200 |
parents | 1d0ddf9e6efd |
children | 38901547a76c |
rev | line source |
---|---|
33
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
1 /* |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
2 * apic.c -- synchronous HTTP request |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
3 * |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
4 * Copyright (c) 2021-2022 David Demelier <markand@malikania.fr> |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
5 * |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
9 * |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
17 */ |
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
18 |
19 | 19 #include <assert.h> |
20 #include <errno.h> | |
21 #include <stdarg.h> | |
22 #include <stdio.h> | |
23 #include <string.h> | |
24 | |
25 #include <curl/curl.h> | |
26 | |
27 #include "apic.h" | |
28 #include "util.h" | |
29 | |
30 struct curlpack { | |
31 CURL *curl; | |
32 CURLcode code; | |
33 struct curl_slist *headers; | |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
34 char keyhdr[128]; |
19 | 35 }; |
36 | |
20 | 37 struct apiconf apiconf = { |
38 .baseurl = "http://127.0.0.1" | |
39 }; | |
40 | |
19 | 41 static size_t |
42 writer(char *in, size_t n, size_t w, FILE *fp) | |
43 { | |
44 if (fwrite(in, n, w, fp) != w) | |
45 return 0; | |
46 | |
47 return w; | |
48 } | |
49 | |
50 static inline char * | |
51 create_url(const char *fmt, va_list args) | |
52 { | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
53 static _Thread_local char ret[1024]; |
20 | 54 char page[128]; |
19 | 55 va_list ap; |
56 | |
57 ret[0] = 0; | |
58 va_copy(ap, args); | |
20 | 59 vsnprintf(page, sizeof (page), fmt, ap); |
19 | 60 va_end(ap); |
61 | |
20 | 62 snprintf(ret, sizeof (ret), "%s/%s", apiconf.baseurl, page); |
63 | |
19 | 64 return ret; |
65 } | |
66 | |
67 static inline FILE * | |
68 create_file(char **buf, size_t *bufsz) | |
69 { | |
70 FILE *fp; | |
71 | |
72 *buf = NULL; | |
73 *bufsz = 0; | |
74 | |
75 if (!(fp = open_memstream(buf, bufsz))) | |
76 util_die("open_memstream: %s\n", strerror(errno)); | |
77 | |
78 return fp; | |
79 } | |
80 | |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
81 static void |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
82 create_curl(struct curlpack *pack, FILE *fp, const char *body, const char *url) |
19 | 83 { |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
84 /* Create API key string. */ |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
85 snprintf(pack->keyhdr, sizeof (pack->keyhdr), "X-Api-Key: %s", apiconf.key); |
19 | 86 |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
87 pack->headers = curl_slist_append(pack->headers, "Content-Type: application/json"); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
88 pack->headers = curl_slist_append(pack->headers, pack->keyhdr); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
89 pack->curl = curl_easy_init(); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
90 curl_easy_setopt(pack->curl, CURLOPT_HTTPHEADER, pack->headers); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
91 curl_easy_setopt(pack->curl, CURLOPT_URL, url); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
92 curl_easy_setopt(pack->curl, CURLOPT_FOLLOWLOCATION, 1L); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
93 curl_easy_setopt(pack->curl, CURLOPT_TIMEOUT, 3L); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
94 curl_easy_setopt(pack->curl, CURLOPT_WRITEFUNCTION, writer); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
95 curl_easy_setopt(pack->curl, CURLOPT_WRITEDATA, fp); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
96 curl_easy_setopt(pack->curl, CURLOPT_NOSIGNAL, 1L); |
19 | 97 |
98 /* Assume POST request if there is a body. */ | |
99 if (body) { | |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
100 curl_easy_setopt(pack->curl, CURLOPT_POSTFIELDS, body); |
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
101 curl_easy_setopt(pack->curl, CURLOPT_POSTFIELDSIZE, strlen(body)); |
19 | 102 } |
103 | |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
104 pack->code = curl_easy_perform(pack->curl); |
19 | 105 } |
106 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
107 static json_t * |
20 | 108 perform(struct apic *req, const char *body, const char *fmt, va_list ap) |
19 | 109 { |
110 FILE *fp; | |
111 char *response, *url; | |
112 size_t responsesz; | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
113 json_t *doc = NULL; |
19 | 114 json_error_t error; |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
115 struct curlpack curl = {0}; |
19 | 116 |
117 memset(req, 0, sizeof (*req)); | |
118 | |
119 url = create_url(fmt, ap); | |
120 fp = create_file(&response, &responsesz); | |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
121 create_curl(&curl, fp, body, url); |
19 | 122 |
123 /* Perform that request now. */ | |
124 fclose(fp); | |
125 | |
126 if (curl.code != CURLE_OK) | |
127 snprintf(req->error, sizeof (req->error), "%s", curl_easy_strerror(curl.code)); | |
128 else { | |
129 curl_easy_getinfo(curl.curl, CURLINFO_RESPONSE_CODE, &req->status); | |
130 | |
131 if (req->status != 200) | |
132 snprintf(req->error, sizeof (req->error), "HTTP returned %ld", req->status); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
133 if (response[0] && !(doc = json_loads(response, 0, &error))) |
19 | 134 snprintf(req->error, sizeof (req->error), "JSON parse error: %s", error.text); |
135 } | |
136 | |
137 curl_easy_cleanup(curl.curl); | |
138 curl_slist_free_all(curl.headers); | |
139 | |
140 free(response); | |
141 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
142 return doc; |
19 | 143 } |
144 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
145 static json_t * |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
146 get(struct apic *req, const char *fmt, ...) |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
147 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
148 va_list ap; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
149 json_t *ret; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
150 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
151 va_start(ap, fmt); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
152 ret = perform(req, NULL, fmt, ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
153 va_end(ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
154 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
155 return ret; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
156 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
157 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
158 static int |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
159 create(struct apic *req, json_t *doc, const char *fmt, ...) |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
160 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
161 va_list ap; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
162 json_t *ret; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
163 char *body; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
164 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
165 memset(req, 0, sizeof (*req)); |
33
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
166 body = util_json_dump(doc); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
167 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
168 va_start(ap, fmt); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
169 ret = perform(req, body, fmt, ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
170 va_end(ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
171 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
172 /* TODO: update id. */ |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
173 (void)ret; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
174 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
175 free(body); |
33
1d0ddf9e6efd
misc: general documentation
David Demelier <markand@malikania.fr>
parents:
27
diff
changeset
|
176 json_decref(ret); |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
177 |
50
b474f0985e39
scictl: add API key support
David Demelier <markand@malikania.fr>
parents:
33
diff
changeset
|
178 return req->error[0] ? -1 : 0; |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
179 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
180 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
181 json_t * |
20 | 182 apic_get(struct apic *req, const char *fmt, ...) |
19 | 183 { |
184 assert(req); | |
185 assert(fmt); | |
186 | |
187 va_list ap; | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
188 json_t *ret; |
19 | 189 |
190 va_start(ap, fmt); | |
191 ret = perform(req, NULL, fmt, ap); | |
192 va_end(ap); | |
193 | |
194 return ret; | |
195 } | |
196 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
197 json_t * |
20 | 198 apic_post(struct apic *req, const json_t *doc, const char *fmt, ...) |
19 | 199 { |
200 assert(req); | |
201 assert(fmt); | |
202 | |
203 va_list ap; | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
204 json_t *ret; |
19 | 205 char *body; |
206 | |
207 if (!(body = json_dumps(doc, JSON_COMPACT))) | |
208 util_die("%s", strerror(ENOMEM)); | |
209 | |
210 va_start(ap, fmt); | |
211 ret = perform(req, body, fmt, ap); | |
212 va_end(ap); | |
213 | |
214 free(body); | |
215 | |
216 return ret; | |
217 } | |
20 | 218 |
219 int | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
220 apic_job_add(struct apic *req, json_t *job) |
20 | 221 { |
222 assert(req); | |
223 assert(job); | |
224 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
225 return create(req, job, "api/v1/jobs"); |
20 | 226 } |
227 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
228 json_t * |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
229 apic_job_todo(struct apic *req, const char *worker_name) |
20 | 230 { |
231 assert(req); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
232 assert(worker_name); |
20 | 233 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
234 return get(req, "api/v1/todo/%s", worker_name); |
20 | 235 } |
236 | |
237 int | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
238 apic_jobresult_add(struct apic *req, json_t *res) |
20 | 239 { |
240 assert(req); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
241 assert(res); |
20 | 242 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
243 return create(req, res, "api/v1/jobresults"); |
20 | 244 } |
245 | |
246 int | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
247 apic_project_save(struct apic *req, json_t *p) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
248 { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
249 assert(req); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
250 assert(p); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
251 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
252 return create(req, p, "api/v1/projects"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
253 } |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
254 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
255 json_t * |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
256 apic_project_list(struct apic *req) |
20 | 257 { |
258 assert(req); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
259 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
260 return get(req, "api/v1/projects"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
261 } |
20 | 262 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
263 json_t * |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
264 apic_project_find(struct apic *req, const char *name) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
265 { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
266 assert(req); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
267 assert(name); |
20 | 268 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
269 return get(req, "api/v1/projects/%s", name); |
20 | 270 } |
271 | |
272 int | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
273 apic_worker_save(struct apic *req, json_t *wk) |
20 | 274 { |
275 assert(req); | |
276 assert(wk); | |
277 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
278 return create(req, wk, "api/v1/workers"); |
20 | 279 } |
280 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
281 json_t * |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
282 apic_worker_list(struct apic *req) |
20 | 283 { |
284 assert(req); | |
285 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
286 return get(req, "api/v1/workers"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
287 } |
20 | 288 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
289 json_t * |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
290 apic_worker_find(struct apic *req, const char *name) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
291 { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
292 assert(req); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
293 assert(name); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
294 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
295 return get(req, "api/v1/workers/%s", name); |
20 | 296 } |