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 = "clevis")]
201pub struct Clevis {
202 #[serde(skip_serializing_if = "Option::is_none")]
203 pub custom: Option<ClevisCustom>,
204 #[serde(skip_serializing_if = "Option::is_none")]
205 pub tang: Option<Vec<Tang>>,
206 #[serde(default)]
207 pub threshold: Option<i64>,
208 #[serde(default)]
209 #[serde(rename = "tpm2")]
210 pub tpm2: Option<bool>,
211}
212#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
213#[serde(rename = "clevisCustom")]
214pub struct ClevisCustom {
215 #[serde(default)]
216 pub config: Option<String>,
217 #[serde(default)]
218 #[serde(rename = "needsNetwork")]
219 pub needs_network: Option<bool>,
220 #[serde(default)]
221 pub pin: Option<String>,
222}
223#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
224#[serde(rename = "directory")]
225pub struct Directory {
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub group: Option<NodeGroup>,
228 #[serde(default)]
229 pub mode: Option<i64>,
230 #[serde(default)]
231 pub overwrite: Option<bool>,
232 pub path: String,
233 #[serde(skip_serializing_if = "Option::is_none")]
234 pub user: Option<NodeUser>,
235}
236impl Directory {
237 pub fn new(path: String) -> Self {
238 Self {
239 group: None,
240 mode: None,
241 overwrite: None,
242 path,
243 user: None,
244 }
245 }
246}
247#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
248#[serde(rename = "disk")]
249pub struct Disk {
250 pub device: String,
251 #[serde(skip_serializing_if = "Option::is_none")]
252 pub partitions: Option<Vec<Partition>>,
253 #[serde(default)]
254 #[serde(rename = "wipeTable")]
255 pub wipe_table: Option<bool>,
256}
257impl Disk {
258 pub fn new(device: String) -> Self {
259 Self {
260 device,
261 partitions: None,
262 wipe_table: None,
263 }
264 }
265}
266#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
267#[serde(rename = "file")]
268pub struct File {
269 #[serde(skip_serializing_if = "Option::is_none")]
270 pub append: Option<Vec<Resource>>,
271 #[serde(skip_serializing_if = "Option::is_none")]
272 pub contents: Option<Resource>,
273 #[serde(skip_serializing_if = "Option::is_none")]
274 pub group: Option<NodeGroup>,
275 #[serde(default)]
276 pub mode: Option<i64>,
277 #[serde(default)]
278 pub overwrite: Option<bool>,
279 pub path: String,
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub user: Option<NodeUser>,
282}
283impl File {
284 pub fn new(path: String) -> Self {
285 Self {
286 append: None,
287 contents: None,
288 group: None,
289 mode: None,
290 overwrite: None,
291 path,
292 user: None,
293 }
294 }
295}
296#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
297#[serde(rename = "filesystem")]
298pub struct Filesystem {
299 pub device: String,
300 #[serde(default)]
301 pub format: Option<String>,
302 #[serde(default)]
303 pub label: Option<String>,
304 #[serde(skip_serializing_if = "Option::is_none")]
305 #[serde(rename = "mountOptions")]
306 pub mount_options: Option<Vec<String>>,
307 #[serde(skip_serializing_if = "Option::is_none")]
308 pub options: Option<Vec<String>>,
309 #[serde(default)]
310 pub path: Option<String>,
311 #[serde(default)]
312 pub uuid: Option<String>,
313 #[serde(default)]
314 #[serde(rename = "wipeFilesystem")]
315 pub wipe_filesystem: Option<bool>,
316}
317impl Filesystem {
318 pub fn new(device: String) -> Self {
319 Self {
320 device,
321 format: None,
322 label: None,
323 mount_options: None,
324 options: None,
325 path: None,
326 uuid: None,
327 wipe_filesystem: None,
328 }
329 }
330}
331#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
332#[serde(rename = "link")]
333pub struct Link {
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub group: Option<NodeGroup>,
336 #[serde(default)]
337 pub hard: Option<bool>,
338 #[serde(default)]
339 pub overwrite: Option<bool>,
340 pub path: String,
341 #[serde(default)]
342 pub target: Option<String>,
343 #[serde(skip_serializing_if = "Option::is_none")]
344 pub user: Option<NodeUser>,
345}
346impl Link {
347 pub fn new(path: String) -> Self {
348 Self {
349 group: None,
350 hard: None,
351 overwrite: None,
352 path,
353 target: None,
354 user: None,
355 }
356 }
357}
358#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
359#[serde(rename = "luks")]
360pub struct Luks {
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub clevis: Option<Clevis>,
363 #[serde(default)]
364 pub device: Option<String>,
365 #[serde(default)]
366 pub discard: Option<bool>,
367 #[serde(skip_serializing_if = "Option::is_none")]
368 #[serde(rename = "keyFile")]
369 pub key_file: Option<Resource>,
370 #[serde(default)]
371 pub label: Option<String>,
372 pub name: String,
373 #[serde(skip_serializing_if = "Option::is_none")]
374 #[serde(rename = "openOptions")]
375 pub open_options: Option<Vec<String>>,
376 #[serde(skip_serializing_if = "Option::is_none")]
377 pub options: Option<Vec<String>>,
378 #[serde(default)]
379 pub uuid: Option<String>,
380 #[serde(default)]
381 #[serde(rename = "wipeVolume")]
382 pub wipe_volume: Option<bool>,
383}
384impl Luks {
385 pub fn new(name: String) -> Self {
386 Self {
387 clevis: None,
388 device: None,
389 discard: None,
390 key_file: None,
391 label: None,
392 name,
393 open_options: None,
394 options: None,
395 uuid: None,
396 wipe_volume: None,
397 }
398 }
399}
400#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
401pub struct NodeGroup {
402 #[serde(default)]
403 pub id: Option<i64>,
404 #[serde(default)]
405 pub name: Option<String>,
406}
407#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
408pub struct NodeUser {
409 #[serde(default)]
410 pub id: Option<i64>,
411 #[serde(default)]
412 pub name: Option<String>,
413}
414#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
415#[serde(rename = "node")]
416pub struct Node {
417 #[serde(skip_serializing_if = "Option::is_none")]
418 pub group: Option<NodeGroup>,
419 #[serde(default)]
420 pub overwrite: Option<bool>,
421 pub path: String,
422 #[serde(skip_serializing_if = "Option::is_none")]
423 pub user: Option<NodeUser>,
424}
425impl Node {
426 pub fn new(path: String) -> Self {
427 Self {
428 group: None,
429 overwrite: None,
430 path,
431 user: None,
432 }
433 }
434}
435#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
436#[serde(rename = "partition")]
437pub struct Partition {
438 #[serde(default)]
439 pub guid: Option<String>,
440 #[serde(default)]
441 pub label: Option<String>,
442 #[serde(skip_serializing_if = "Option::is_none")]
443 pub number: Option<i64>,
444 #[serde(default)]
445 pub resize: Option<bool>,
446 #[serde(default)]
447 #[serde(rename = "shouldExist")]
448 pub should_exist: Option<bool>,
449 #[serde(default)]
450 #[serde(rename = "sizeMiB")]
451 pub size_mib: Option<i64>,
452 #[serde(default)]
453 #[serde(rename = "startMiB")]
454 pub start_mib: Option<i64>,
455 #[serde(default)]
456 #[serde(rename = "typeGuid")]
457 pub type_guid: Option<String>,
458 #[serde(default)]
459 #[serde(rename = "wipePartitionEntry")]
460 pub wipe_partition_entry: Option<bool>,
461}
462#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
463#[serde(rename = "raid")]
464pub struct Raid {
465 #[serde(skip_serializing_if = "Option::is_none")]
466 pub devices: Option<Vec<String>>,
467 #[serde(default)]
468 pub level: Option<String>,
469 pub name: String,
470 #[serde(skip_serializing_if = "Option::is_none")]
471 pub options: Option<Vec<String>>,
472 #[serde(default)]
473 pub spares: Option<i64>,
474}
475impl Raid {
476 pub fn new(name: String) -> Self {
477 Self {
478 devices: None,
479 level: None,
480 name,
481 options: None,
482 spares: None,
483 }
484 }
485}
486#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
487#[serde(rename = "tang")]
488pub struct Tang {
489 #[serde(default)]
490 pub advertisement: Option<String>,
491 #[serde(default)]
492 pub thumbprint: Option<String>,
493 #[serde(skip_serializing_if = "Option::is_none")]
494 pub url: Option<String>,
495}
496#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
497#[serde(rename = "storage")]
498pub struct Storage {
499 #[serde(skip_serializing_if = "Option::is_none")]
500 pub directories: Option<Vec<Directory>>,
501 #[serde(skip_serializing_if = "Option::is_none")]
502 pub disks: Option<Vec<Disk>>,
503 #[serde(skip_serializing_if = "Option::is_none")]
504 pub files: Option<Vec<File>>,
505 #[serde(skip_serializing_if = "Option::is_none")]
506 pub filesystems: Option<Vec<Filesystem>>,
507 #[serde(skip_serializing_if = "Option::is_none")]
508 pub links: Option<Vec<Link>>,
509 #[serde(skip_serializing_if = "Option::is_none")]
510 pub luks: Option<Vec<Luks>>,
511 #[serde(skip_serializing_if = "Option::is_none")]
512 pub raid: Option<Vec<Raid>>,
513}
514#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
515#[serde(rename = "dropin")]
516pub struct Dropin {
517 #[serde(default)]
518 pub contents: Option<String>,
519 pub name: String,
520}
521impl Dropin {
522 pub fn new(name: String) -> Self {
523 Self {
524 contents: None,
525 name,
526 }
527 }
528}
529#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
530#[serde(rename = "unit")]
531pub struct Unit {
532 #[serde(default)]
533 pub contents: Option<String>,
534 #[serde(skip_serializing_if = "Option::is_none")]
535 pub dropins: Option<Vec<Dropin>>,
536 #[serde(default)]
537 pub enabled: Option<bool>,
538 #[serde(default)]
539 pub mask: Option<bool>,
540 pub name: String,
541}
542impl Unit {
543 pub fn new(name: String) -> Self {
544 Self {
545 contents: None,
546 dropins: None,
547 enabled: None,
548 mask: None,
549 name,
550 }
551 }
552}
553#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
554#[serde(rename = "systemd")]
555pub struct Systemd {
556 #[serde(skip_serializing_if = "Option::is_none")]
557 pub units: Option<Vec<Unit>>,
558}
559#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
560#[serde(rename = "verification")]
561pub struct Verification {
562 #[serde(default)]
563 pub hash: Option<String>,
564}
565#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
566pub struct Config {
567 pub ignition: Ignition,
568 #[serde(skip_serializing_if = "Option::is_none")]
569 #[serde(rename = "kernelArguments")]
570 pub kernel_arguments: Option<KernelArguments>,
571 #[serde(skip_serializing_if = "Option::is_none")]
572 pub passwd: Option<Passwd>,
573 #[serde(skip_serializing_if = "Option::is_none")]
574 pub storage: Option<Storage>,
575 #[serde(skip_serializing_if = "Option::is_none")]
576 pub systemd: Option<Systemd>,
577}
578impl Config {
579 pub fn new(ignition: Ignition) -> Self {
580 Self {
581 ignition,
582 kernel_arguments: None,
583 passwd: None,
584 storage: None,
585 systemd: None,
586 }
587 }
588}