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