Mercurial > sci
annotate lib/apic.c @ 23:2cb228f23f53
misc: rework todo/jobs HTTP requests
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 21 Jul 2022 21:55:02 +0200 |
parents | dd078aea5d02 |
children | 34cbbd215ef7 |
rev | line source |
---|---|
19 | 1 #include <assert.h> |
2 #include <errno.h> | |
3 #include <stdarg.h> | |
4 #include <stdio.h> | |
5 #include <string.h> | |
6 | |
7 #include <curl/curl.h> | |
8 | |
9 #include "apic.h" | |
20 | 10 #include "types.h" |
19 | 11 #include "util.h" |
12 | |
13 struct curlpack { | |
14 CURL *curl; | |
15 CURLcode code; | |
16 struct curl_slist *headers; | |
17 }; | |
18 | |
20 | 19 struct converter { |
20 void *data; | |
21 size_t datasz; | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
22 ssize_t (*unpack)(void *, size_t, json_t *); |
20 | 23 json_t *(*pack)(const void *, size_t); |
24 }; | |
25 | |
26 struct apiconf apiconf = { | |
27 .baseurl = "http://127.0.0.1" | |
28 }; | |
29 | |
19 | 30 static size_t |
31 writer(char *in, size_t n, size_t w, FILE *fp) | |
32 { | |
33 if (fwrite(in, n, w, fp) != w) | |
34 return 0; | |
35 | |
36 return w; | |
37 } | |
38 | |
39 static inline char * | |
40 create_url(const char *fmt, va_list args) | |
41 { | |
42 static _Thread_local char ret[256]; | |
20 | 43 char page[128]; |
19 | 44 va_list ap; |
45 | |
46 ret[0] = 0; | |
47 va_copy(ap, args); | |
20 | 48 vsnprintf(page, sizeof (page), fmt, ap); |
19 | 49 va_end(ap); |
50 | |
20 | 51 snprintf(ret, sizeof (ret), "%s/%s", apiconf.baseurl, page); |
52 | |
19 | 53 return ret; |
54 } | |
55 | |
56 static inline FILE * | |
57 create_file(char **buf, size_t *bufsz) | |
58 { | |
59 FILE *fp; | |
60 | |
61 *buf = NULL; | |
62 *bufsz = 0; | |
63 | |
64 if (!(fp = open_memstream(buf, bufsz))) | |
65 util_die("open_memstream: %s\n", strerror(errno)); | |
66 | |
67 return fp; | |
68 } | |
69 | |
70 static struct curlpack | |
71 create_curl(FILE *fp, const char *body, const char *url) | |
72 { | |
73 struct curlpack pack = {0}; | |
74 | |
75 pack.headers = curl_slist_append(pack.headers, "Content-Type: application/json"); | |
76 pack.curl = curl_easy_init(); | |
77 curl_easy_setopt(pack.curl, CURLOPT_HTTPHEADER, pack.headers); | |
78 curl_easy_setopt(pack.curl, CURLOPT_URL, url); | |
79 curl_easy_setopt(pack.curl, CURLOPT_FOLLOWLOCATION, 1L); | |
80 curl_easy_setopt(pack.curl, CURLOPT_TIMEOUT, 3L); | |
81 curl_easy_setopt(pack.curl, CURLOPT_WRITEFUNCTION, writer); | |
82 curl_easy_setopt(pack.curl, CURLOPT_WRITEDATA, fp); | |
83 curl_easy_setopt(pack.curl, CURLOPT_NOSIGNAL, 1L); | |
84 | |
85 /* Assume POST request if there is a body. */ | |
86 if (body) { | |
87 curl_easy_setopt(pack.curl, CURLOPT_POSTFIELDS, body); | |
88 curl_easy_setopt(pack.curl, CURLOPT_POSTFIELDSIZE, strlen(body)); | |
89 } | |
90 | |
91 pack.code = curl_easy_perform(pack.curl); | |
92 | |
93 return pack; | |
94 } | |
95 | |
96 static int | |
20 | 97 perform(struct apic *req, const char *body, const char *fmt, va_list ap) |
19 | 98 { |
99 FILE *fp; | |
100 char *response, *url; | |
101 size_t responsesz; | |
102 json_error_t error; | |
103 int ret = -1; | |
104 struct curlpack curl; | |
105 | |
106 memset(req, 0, sizeof (*req)); | |
107 | |
108 url = create_url(fmt, ap); | |
109 fp = create_file(&response, &responsesz); | |
110 curl = create_curl(fp, body, url); | |
111 | |
112 /* Perform that request now. */ | |
113 fclose(fp); | |
114 | |
115 if (curl.code != CURLE_OK) | |
116 snprintf(req->error, sizeof (req->error), "%s", curl_easy_strerror(curl.code)); | |
117 else { | |
118 curl_easy_getinfo(curl.curl, CURLINFO_RESPONSE_CODE, &req->status); | |
119 | |
120 if (req->status != 200) | |
121 snprintf(req->error, sizeof (req->error), "HTTP returned %ld", req->status); | |
122 if (response[0] && !(req->doc = json_loads(response, 0, &error))) | |
123 snprintf(req->error, sizeof (req->error), "JSON parse error: %s", error.text); | |
124 else | |
125 ret = 0; | |
126 } | |
127 | |
128 curl_easy_cleanup(curl.curl); | |
129 curl_slist_free_all(curl.headers); | |
130 | |
131 free(response); | |
132 | |
133 return ret; | |
134 } | |
135 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
136 static ssize_t |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
137 get(struct apic *req, const struct converter *cv, const char *fmt, ...) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
138 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
139 va_list ap; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
140 ssize_t ret; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
141 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
142 va_start(ap, fmt); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
143 ret = perform(req, NULL, fmt, ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
144 va_end(ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
145 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
146 if (ret < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
147 return -1; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
148 if (!req->doc || (!json_is_object(req->doc) && !json_is_array(req->doc))) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
149 return snprintf(req->error, sizeof (req->error), "invalid JSON document received"), -1; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
150 if ((ret = cv->unpack(cv->data, cv->datasz, req->doc)) < 0) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
151 return snprintf(req->error, sizeof (req->error), "%s", strerror(errno)); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
152 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
153 return ret; |
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 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
156 static int |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
157 create(struct apic *req, const struct converter *cv, const char *fmt, ...) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
158 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
159 va_list ap; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
160 int ret; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
161 json_t *doc; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
162 char *body; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
163 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
164 memset(req, 0, sizeof (*req)); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
165 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
166 if (!(doc = cv->pack(cv->data, cv->datasz))) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
167 return snprintf(req->error, sizeof (req->error), "%s", strerror(errno)); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
168 if (!(body = json_dumps(doc, JSON_COMPACT))) { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
169 json_decref(doc); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
170 return snprintf(req->error, sizeof (req->error), "%s", strerror(errno)); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
171 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
172 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
173 va_start(ap, fmt); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
174 ret = perform(req, body, fmt, ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
175 va_end(ap); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
176 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
177 json_decref(doc); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
178 free(body); |
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 return 0; |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
181 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
182 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
183 static json_t * |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
184 wrap_job_to(const void *data, size_t datasz) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
185 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
186 return job_to(data, datasz); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
187 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
188 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
189 static ssize_t |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
190 wrap_job_from(void *data, size_t datasz, json_t *doc) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
191 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
192 return job_from(data, datasz, doc); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
193 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
194 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
195 static json_t * |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
196 wrap_jobresult_to(const void *data, size_t datasz) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
197 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
198 return jobresult_to(data, datasz); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
199 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
200 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
201 static ssize_t |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
202 wrap_project_from(void *data, size_t datasz, json_t *doc) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
203 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
204 return project_from(data, datasz, doc); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
205 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
206 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
207 static json_t * |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
208 wrap_project_to(const void *data, size_t datasz) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
209 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
210 return project_to(data, datasz); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
211 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
212 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
213 static ssize_t |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
214 wrap_worker_from(void *data, size_t datasz, json_t *doc) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
215 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
216 return worker_from(data, datasz, doc); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
217 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
218 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
219 static json_t * |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
220 wrap_worker_to(const void *data, size_t datasz) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
221 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
222 return worker_to(data, datasz); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
223 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
224 |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
225 static ssize_t |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
226 wrap_jobresult_from(void *data, size_t datasz, json_t *doc) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
227 { |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
228 return jobresult_from(data, datasz, doc); |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
229 } |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
230 |
19 | 231 int |
20 | 232 apic_get(struct apic *req, const char *fmt, ...) |
19 | 233 { |
234 assert(req); | |
235 assert(fmt); | |
236 | |
237 va_list ap; | |
238 int ret; | |
239 | |
240 va_start(ap, fmt); | |
241 ret = perform(req, NULL, fmt, ap); | |
242 va_end(ap); | |
243 | |
244 return ret; | |
245 } | |
246 | |
247 int | |
20 | 248 apic_post(struct apic *req, const json_t *doc, const char *fmt, ...) |
19 | 249 { |
250 assert(req); | |
251 assert(fmt); | |
252 | |
253 va_list ap; | |
254 int ret; | |
255 char *body; | |
256 | |
257 if (!(body = json_dumps(doc, JSON_COMPACT))) | |
258 util_die("%s", strerror(ENOMEM)); | |
259 | |
260 va_start(ap, fmt); | |
261 ret = perform(req, body, fmt, ap); | |
262 va_end(ap); | |
263 | |
264 free(body); | |
265 | |
266 return ret; | |
267 } | |
20 | 268 |
269 int | |
270 apic_job_add(struct apic *req, struct job *job) | |
271 { | |
272 assert(req); | |
273 assert(job); | |
274 | |
275 const struct converter cv = { | |
276 .data = job, | |
277 .datasz = 1, | |
278 .pack = wrap_job_to, | |
279 .unpack = wrap_job_from | |
280 }; | |
281 | |
282 return create(req, &cv, "api/v1/jobs"); | |
283 } | |
284 | |
285 ssize_t | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
22
diff
changeset
|
286 apic_job_todo(struct apic *req, struct job *jobs, size_t jobsz, const char *worker_name) |
20 | 287 { |
288 assert(req); | |
289 assert(jobs); | |
290 | |
291 struct converter cv = { | |
292 .data = jobs, | |
293 .datasz = 1, | |
294 .unpack = wrap_job_from | |
295 }; | |
296 | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
22
diff
changeset
|
297 return get(req, &cv, "api/v1/todo/%s", worker_name); |
20 | 298 } |
299 | |
300 int | |
301 apic_jobresult_add(struct apic *req, struct jobresult *result) | |
302 { | |
303 assert(req); | |
304 assert(result); | |
305 | |
306 struct converter cv = { | |
307 .data = result, | |
308 .datasz = 1, | |
309 .pack = wrap_jobresult_to, | |
310 .unpack = wrap_jobresult_from | |
311 }; | |
312 | |
313 return create(req, &cv, "api/v1/jobresults"); | |
314 } | |
315 | |
316 int | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
317 apic_project_save(struct apic *req, struct project *project) |
20 | 318 { |
319 assert(req); | |
320 assert(project); | |
321 | |
322 struct converter cv = { | |
323 .data = project, | |
324 .datasz = 1, | |
325 .pack = wrap_project_to, | |
326 .unpack = wrap_project_from | |
327 }; | |
328 | |
329 return create(req, &cv, "api/v1/projects"); | |
330 } | |
331 | |
332 int | |
333 apic_project_update(struct apic *req, struct project *project) | |
334 { | |
335 assert(req); | |
336 assert(project); | |
337 | |
338 struct converter cv = { | |
339 .data = project, | |
340 .datasz = 1, | |
341 .pack = wrap_project_to, | |
342 .unpack = wrap_project_from | |
343 }; | |
344 | |
345 return create(req, &cv, "api/v1/projects"); | |
346 } | |
347 | |
348 ssize_t | |
349 apic_project_list(struct apic *req, struct project *projects, size_t projectsz) | |
350 { | |
351 assert(req); | |
352 assert(projects); | |
353 | |
354 struct converter cv = { | |
355 .data = projects, | |
356 .datasz = projectsz, | |
357 .unpack = wrap_project_from | |
358 }; | |
359 | |
360 return get(req, &cv, "api/v1/projects"); | |
361 } | |
362 | |
363 int | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
364 apic_project_find(struct apic *req, struct project *project, const char *name) |
20 | 365 { |
366 assert(req); | |
367 assert(project); | |
368 | |
369 struct converter cv = { | |
370 .data = project, | |
371 .datasz = 1, | |
372 .unpack = wrap_project_from | |
373 }; | |
374 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
375 return get(req, &cv, "api/v1/projects/%s", name); |
20 | 376 } |
377 | |
378 int | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
379 apic_worker_save(struct apic *req, struct worker *wk) |
20 | 380 { |
381 assert(req); | |
382 assert(wk); | |
383 | |
384 struct converter cv = { | |
385 .data = wk, | |
386 .datasz = 1, | |
387 .pack = wrap_worker_to | |
388 }; | |
389 | |
390 return create(req, &cv, "api/v1/workers"); | |
391 } | |
392 | |
393 ssize_t | |
394 apic_worker_list(struct apic *req, struct worker *wk, size_t wksz) | |
395 { | |
396 assert(req); | |
397 assert(wk); | |
398 assert(wksz); | |
399 | |
400 struct converter cv = { | |
401 .data = wk, | |
402 .datasz = wksz, | |
403 .unpack = wrap_worker_from | |
404 }; | |
405 | |
406 return get(req, &cv, "api/v1/workers"); | |
407 } | |
408 | |
409 int | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
410 apic_worker_find(struct apic *req, struct worker *wk, const char *name) |
20 | 411 { |
412 assert(req); | |
413 assert(wk); | |
414 | |
415 struct converter cv = { | |
416 .data = wk, | |
417 .datasz = 1, | |
418 .unpack = wrap_worker_from | |
419 }; | |
420 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
421 return get(req, &cv, "api/v1/workers/%s", name); |
20 | 422 } |
423 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
424 void |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
425 apic_finish(struct apic *req) |
20 | 426 { |
427 assert(req); | |
428 | |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
429 if (req->doc) |
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
430 json_decref(req->doc); |
20 | 431 |
22
dd078aea5d02
misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
432 memset(req, 0, sizeof (*req)); |
20 | 433 } |