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