1#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
4pub struct HttpHeadersItem {
5 pub name: String,
6 #[serde(default)]
7 pub value: Option<String>,
8}
9impl HttpHeadersItem {
10 pub fn new(name: String) -> Self {
11 Self { name, value: None }
12 }
13}
14pub type HttpHeaders = Vec<HttpHeadersItem>;
15#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
16#[serde(rename = "ignition-config")]
17pub struct IgnitionConfig {
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub merge: Option<Vec<Resource>>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub replace: Option<Resource>,
22}
23#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
24#[serde(rename = "proxy")]
25pub struct Proxy {
26 #[serde(default)]
27 #[serde(rename = "httpProxy")]
28 pub http_proxy: Option<String>,
29 #[serde(default)]
30 #[serde(rename = "httpsProxy")]
31 pub https_proxy: Option<String>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 #[serde(rename = "noProxy")]
34 pub no_proxy: Option<Vec<Option<String>>>,
35}
36#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
37pub struct SecurityTls {
38 #[serde(skip_serializing_if = "Option::is_none")]
39 #[serde(rename = "certificateAuthorities")]
40 pub certificate_authorities: Option<Vec<Resource>>,
41}
42#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
43#[serde(rename = "security")]
44pub struct Security {
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub tls: Option<SecurityTls>,
47}
48#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
49#[serde(rename = "timeouts")]
50pub struct Timeouts {
51 #[serde(default)]
52 #[serde(rename = "httpResponseHeaders")]
53 pub http_response_headers: Option<i64>,
54 #[serde(default)]
55 #[serde(rename = "httpTotal")]
56 pub http_total: Option<i64>,
57}
58#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
59#[serde(rename = "ignition")]
60pub struct Ignition {
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub config: Option<IgnitionConfig>,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub proxy: Option<Proxy>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub security: Option<Security>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub timeouts: Option<Timeouts>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub version: Option<String>,
71}
72#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
73#[serde(rename = "group")]
74pub struct Group {
75 #[serde(default)]
76 pub gid: Option<i64>,
77 pub name: String,
78 #[serde(default)]
79 #[serde(rename = "passwordHash")]
80 pub password_hash: Option<String>,
81 #[serde(default)]
82 #[serde(rename = "shouldExist")]
83 pub should_exist: Option<bool>,
84 #[serde(default)]
85 pub system: Option<bool>,
86}
87impl Group {
88 pub fn new(name: String) -> Self {
89 Self {
90 gid: None,
91 name,
92 password_hash: None,
93 should_exist: None,
94 system: None,
95 }
96 }
97}
98#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
99#[serde(rename = "user")]
100pub struct User {
101 #[serde(default)]
102 pub gecos: Option<String>,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub groups: Option<Vec<String>>,
105 #[serde(default)]
106 #[serde(rename = "homeDir")]
107 pub home_dir: Option<String>,
108 pub name: String,
109 #[serde(default)]
110 #[serde(rename = "noCreateHome")]
111 pub no_create_home: Option<bool>,
112 #[serde(default)]
113 #[serde(rename = "noLogInit")]
114 pub no_log_init: Option<bool>,
115 #[serde(default)]
116 #[serde(rename = "noUserGroup")]
117 pub no_user_group: Option<bool>,
118 #[serde(default)]
119 #[serde(rename = "passwordHash")]
120 pub password_hash: Option<String>,
121 #[serde(default)]
122 #[serde(rename = "primaryGroup")]
123 pub primary_group: Option<String>,
124 #[serde(default)]
125 pub shell: Option<String>,
126 #[serde(default)]
127 #[serde(rename = "shouldExist")]
128 pub should_exist: Option<bool>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 #[serde(rename = "sshAuthorizedKeys")]
131 pub ssh_authorized_keys: Option<Vec<String>>,
132 #[serde(default)]
133 pub system: Option<bool>,
134 #[serde(default)]
135 pub uid: Option<i64>,
136}
137impl User {
138 pub fn new(name: String) -> Self {
139 Self {
140 gecos: None,
141 groups: None,
142 home_dir: None,
143 name,
144 no_create_home: None,
145 no_log_init: None,
146 no_user_group: None,
147 password_hash: None,
148 primary_group: None,
149 shell: None,
150 should_exist: None,
151 ssh_authorized_keys: None,
152 system: None,
153 uid: None,
154 }
155 }
156}
157#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
158#[serde(rename = "passwd")]
159pub struct Passwd {
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub groups: Option<Vec<Group>>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub users: Option<Vec<User>>,
164}
165#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
166#[serde(rename = "resource")]
167pub struct Resource {
168 #[serde(default)]
169 pub compression: Option<String>,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 #[serde(rename = "httpHeaders")]
172 pub http_headers: Option<HttpHeaders>,
173 #[serde(default)]
174 pub source: Option<String>,
175 #[serde(skip_serializing_if = "Option::is_none")]
176 pub verification: Option<Verification>,
177}
178#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
179#[serde(rename = "directory")]
180pub struct Directory {
181 #[serde(skip_serializing_if = "Option::is_none")]
182 pub group: Option<NodeGroup>,
183 #[serde(default)]
184 pub mode: Option<i64>,
185 #[serde(default)]
186 pub overwrite: Option<bool>,
187 pub path: String,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub user: Option<NodeUser>,
190}
191impl Directory {
192 pub fn new(path: String) -> Self {
193 Self {
194 group: None,
195 mode: None,
196 overwrite: None,
197 path,
198 user: None,
199 }
200 }
201}
202#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
203#[serde(rename = "disk")]
204pub struct Disk {
205 pub device: String,
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub partitions: Option<Vec<Partition>>,
208 #[serde(default)]
209 #[serde(rename = "wipeTable")]
210 pub wipe_table: Option<bool>,
211}
212impl Disk {
213 pub fn new(device: String) -> Self {
214 Self {
215 device,
216 partitions: None,
217 wipe_table: None,
218 }
219 }
220}
221#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
222#[serde(rename = "file")]
223pub struct File {
224 #[serde(skip_serializing_if = "Option::is_none")]
225 pub append: Option<Vec<Resource>>,
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub contents: Option<Resource>,
228 #[serde(skip_serializing_if = "Option::is_none")]
229 pub group: Option<NodeGroup>,
230 #[serde(default)]
231 pub mode: Option<i64>,
232 #[serde(default)]
233 pub overwrite: Option<bool>,
234 pub path: String,
235 #[serde(skip_serializing_if = "Option::is_none")]
236 pub user: Option<NodeUser>,
237}
238impl File {
239 pub fn new(path: String) -> Self {
240 Self {
241 append: None,
242 contents: None,
243 group: None,
244 mode: None,
245 overwrite: None,
246 path,
247 user: None,
248 }
249 }
250}
251#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
252#[serde(rename = "filesystem")]
253pub struct Filesystem {
254 pub device: String,
255 #[serde(default)]
256 pub format: Option<String>,
257 #[serde(default)]
258 pub label: Option<String>,
259 #[serde(skip_serializing_if = "Option::is_none")]
260 #[serde(rename = "mountOptions")]
261 pub mount_options: Option<Vec<String>>,
262 #[serde(skip_serializing_if = "Option::is_none")]
263 pub options: Option<Vec<String>>,
264 #[serde(default)]
265 pub path: Option<String>,
266 #[serde(default)]
267 pub uuid: Option<String>,
268 #[serde(default)]
269 #[serde(rename = "wipeFilesystem")]
270 pub wipe_filesystem: Option<bool>,
271}
272impl Filesystem {
273 pub fn new(device: String) -> Self {
274 Self {
275 device,
276 format: None,
277 label: None,
278 mount_options: None,
279 options: None,
280 path: None,
281 uuid: None,
282 wipe_filesystem: None,
283 }
284 }
285}
286#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
287#[serde(rename = "link")]
288pub struct Link {
289 #[serde(skip_serializing_if = "Option::is_none")]
290 pub group: Option<NodeGroup>,
291 #[serde(default)]
292 pub hard: Option<bool>,
293 #[serde(default)]
294 pub overwrite: Option<bool>,
295 pub path: String,
296 pub target: String,
297 #[serde(skip_serializing_if = "Option::is_none")]
298 pub user: Option<NodeUser>,
299}
300impl Link {
301 pub fn new(path: String, target: String) -> Self {
302 Self {
303 group: None,
304 hard: None,
305 overwrite: None,
306 path,
307 target,
308 user: None,
309 }
310 }
311}
312#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
313pub struct LuksClevisCustom {
314 pub config: String,
315 #[serde(default)]
316 #[serde(rename = "needsNetwork")]
317 pub needs_network: Option<bool>,
318 pub pin: String,
319}
320impl LuksClevisCustom {
321 pub fn new(config: String, pin: String) -> Self {
322 Self {
323 config,
324 needs_network: None,
325 pin,
326 }
327 }
328}
329#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
330pub struct LuksClevis {
331 #[serde(default)]
332 pub custom: Option<LuksClevisCustom>,
333 #[serde(skip_serializing_if = "Option::is_none")]
334 pub tang: Option<Vec<Tang>>,
335 #[serde(default)]
336 pub threshold: Option<i64>,
337 #[serde(default)]
338 #[serde(rename = "tpm2")]
339 pub tpm2: Option<bool>,
340}
341#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
342#[serde(rename = "luks")]
343pub struct Luks {
344 #[serde(default)]
345 pub clevis: Option<LuksClevis>,
346 #[serde(default)]
347 pub device: Option<String>,
348 #[serde(skip_serializing_if = "Option::is_none")]
349 #[serde(rename = "keyFile")]
350 pub key_file: Option<Resource>,
351 #[serde(default)]
352 pub label: Option<String>,
353 pub name: String,
354 #[serde(skip_serializing_if = "Option::is_none")]
355 pub options: Option<Vec<String>>,
356 #[serde(default)]
357 pub uuid: Option<String>,
358 #[serde(default)]
359 #[serde(rename = "wipeVolume")]
360 pub wipe_volume: Option<bool>,
361}
362impl Luks {
363 pub fn new(name: String) -> Self {
364 Self {
365 clevis: None,
366 device: None,
367 key_file: None,
368 label: None,
369 name,
370 options: None,
371 uuid: None,
372 wipe_volume: None,
373 }
374 }
375}
376#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
377pub struct NodeGroup {
378 #[serde(default)]
379 pub id: Option<i64>,
380 #[serde(default)]
381 pub name: Option<String>,
382}
383#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
384pub struct NodeUser {
385 #[serde(default)]
386 pub id: Option<i64>,
387 #[serde(default)]
388 pub name: Option<String>,
389}
390#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
391#[serde(rename = "node")]
392pub struct Node {
393 #[serde(skip_serializing_if = "Option::is_none")]
394 pub group: Option<NodeGroup>,
395 #[serde(default)]
396 pub overwrite: Option<bool>,
397 pub path: String,
398 #[serde(skip_serializing_if = "Option::is_none")]
399 pub user: Option<NodeUser>,
400}
401impl Node {
402 pub fn new(path: String) -> Self {
403 Self {
404 group: None,
405 overwrite: None,
406 path,
407 user: None,
408 }
409 }
410}
411#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
412#[serde(rename = "partition")]
413pub struct Partition {
414 #[serde(default)]
415 pub guid: Option<String>,
416 #[serde(default)]
417 pub label: Option<String>,
418 #[serde(skip_serializing_if = "Option::is_none")]
419 pub number: Option<i64>,
420 #[serde(default)]
421 pub resize: Option<bool>,
422 #[serde(default)]
423 #[serde(rename = "shouldExist")]
424 pub should_exist: Option<bool>,
425 #[serde(default)]
426 #[serde(rename = "sizeMiB")]
427 pub size_mib: Option<i64>,
428 #[serde(default)]
429 #[serde(rename = "startMiB")]
430 pub start_mib: Option<i64>,
431 #[serde(default)]
432 #[serde(rename = "typeGuid")]
433 pub type_guid: Option<String>,
434 #[serde(default)]
435 #[serde(rename = "wipePartitionEntry")]
436 pub wipe_partition_entry: Option<bool>,
437}
438#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
439#[serde(rename = "raid")]
440pub struct Raid {
441 pub devices: Vec<String>,
442 pub level: String,
443 pub name: String,
444 #[serde(skip_serializing_if = "Option::is_none")]
445 pub options: Option<Vec<String>>,
446 #[serde(default)]
447 pub spares: Option<i64>,
448}
449impl Raid {
450 pub fn new(devices: Vec<String>, level: String, name: String) -> Self {
451 Self {
452 devices,
453 level,
454 name,
455 options: None,
456 spares: None,
457 }
458 }
459}
460#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
461#[serde(rename = "tang")]
462pub struct Tang {
463 #[serde(default)]
464 pub thumbprint: Option<String>,
465 #[serde(skip_serializing_if = "Option::is_none")]
466 pub url: Option<String>,
467}
468#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
469#[serde(rename = "storage")]
470pub struct Storage {
471 #[serde(skip_serializing_if = "Option::is_none")]
472 pub directories: Option<Vec<Directory>>,
473 #[serde(skip_serializing_if = "Option::is_none")]
474 pub disks: Option<Vec<Disk>>,
475 #[serde(skip_serializing_if = "Option::is_none")]
476 pub files: Option<Vec<File>>,
477 #[serde(skip_serializing_if = "Option::is_none")]
478 pub filesystems: Option<Vec<Filesystem>>,
479 #[serde(skip_serializing_if = "Option::is_none")]
480 pub links: Option<Vec<Link>>,
481 #[serde(skip_serializing_if = "Option::is_none")]
482 pub luks: Option<Vec<Luks>>,
483 #[serde(skip_serializing_if = "Option::is_none")]
484 pub raid: Option<Vec<Raid>>,
485}
486#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
487#[serde(rename = "dropin")]
488pub struct Dropin {
489 #[serde(default)]
490 pub contents: Option<String>,
491 pub name: String,
492}
493impl Dropin {
494 pub fn new(name: String) -> Self {
495 Self {
496 contents: None,
497 name,
498 }
499 }
500}
501#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
502#[serde(rename = "unit")]
503pub struct Unit {
504 #[serde(default)]
505 pub contents: Option<String>,
506 #[serde(skip_serializing_if = "Option::is_none")]
507 pub dropins: Option<Vec<Dropin>>,
508 #[serde(default)]
509 pub enabled: Option<bool>,
510 #[serde(default)]
511 pub mask: Option<bool>,
512 pub name: String,
513}
514impl Unit {
515 pub fn new(name: String) -> Self {
516 Self {
517 contents: None,
518 dropins: None,
519 enabled: None,
520 mask: None,
521 name,
522 }
523 }
524}
525#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
526#[serde(rename = "systemd")]
527pub struct Systemd {
528 #[serde(skip_serializing_if = "Option::is_none")]
529 pub units: Option<Vec<Unit>>,
530}
531#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
532#[serde(rename = "verification")]
533pub struct Verification {
534 #[serde(default)]
535 pub hash: Option<String>,
536}
537#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
538pub struct Config {
539 pub ignition: Ignition,
540 #[serde(skip_serializing_if = "Option::is_none")]
541 pub passwd: Option<Passwd>,
542 #[serde(skip_serializing_if = "Option::is_none")]
543 pub storage: Option<Storage>,
544 #[serde(skip_serializing_if = "Option::is_none")]
545 pub systemd: Option<Systemd>,
546}
547impl Config {
548 pub fn new(ignition: Ignition) -> Self {
549 Self {
550 ignition,
551 passwd: None,
552 storage: None,
553 systemd: None,
554 }
555 }
556}