1use crate::models::params::{KeyValueParam, S3CopyFile};
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Serialize, Deserialize, Debug, Clone)]
8#[serde(rename_all = "lowercase")]
9pub enum EvgCommandType {
10 Test,
12 System,
14 Setup,
16}
17
18#[derive(Serialize, Deserialize, Debug, Clone)]
20#[serde(rename_all = "lowercase")]
21pub enum S3Visibility {
22 Public,
24
25 Private,
27
28 Signed,
30
31 None,
33}
34
35#[derive(Serialize, Deserialize, Debug, Clone)]
37#[serde(rename_all = "lowercase")]
38pub enum CloudProvider {
39 EC2,
41 Docker,
43}
44
45#[derive(Serialize, Deserialize, Debug, Clone)]
46#[serde(rename_all = "lowercase")]
47pub enum ScriptingHarness {
48 Python,
49 Python2,
50 Golang,
51 Roswell,
52}
53
54#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
55#[serde(untagged)]
56pub enum TimeoutValue {
57 Int(u64),
58 Expansion(String),
59}
60
61impl From<u64> for TimeoutValue {
62 fn from(item: u64) -> TimeoutValue {
63 TimeoutValue::Int(item)
64 }
65}
66
67impl From<&str> for TimeoutValue {
68 fn from(item: &str) -> TimeoutValue {
69 TimeoutValue::Expansion(item.to_string())
70 }
71}
72
73#[cfg(test)]
74mod timeout_value_tests {
75 use super::*;
76
77 #[test]
78 fn test_int_to_timeout_value() {
79 let timeout = TimeoutValue::from(42);
80
81 assert_eq!(TimeoutValue::Int(42), timeout);
82 }
83
84 #[test]
85 fn test_string_to_timeout_value() {
86 let timeout = TimeoutValue::from("${timeout_expansion}");
87
88 assert_eq!(
89 TimeoutValue::Expansion(String::from("${timeout_expansion}")),
90 timeout
91 );
92 }
93}
94
95#[derive(Debug, Serialize, Deserialize, Clone)]
97pub struct ArchiveTargzExtractParams {
98 pub path: String,
100 pub destination: String,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub exclude_files: Option<Vec<String>>,
105}
106
107#[derive(Debug, Serialize, Deserialize, Clone)]
109pub struct ArchiveTargzPackParams {
110 pub target: String,
112 pub source_dir: String,
114 pub include: Vec<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub exclude_files: Option<Vec<String>>,
119}
120
121#[derive(Debug, Serialize, Deserialize, Clone)]
123pub struct AttachArtifactsParams {
124 pub files: Vec<String>,
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub prefix: Option<String>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub optional: Option<bool>,
133
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub ignore_artifacts_for_spawn: Option<bool>,
136}
137
138#[derive(Debug, Serialize, Deserialize, Clone)]
140pub struct AttachResultsParams {
141 pub file_location: String,
143}
144
145#[derive(Debug, Serialize, Deserialize, Clone)]
147pub struct AttachXUnitResultsParams {
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub file: Option<String>,
151
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub files: Option<Vec<String>>,
155}
156
157#[derive(Debug, Serialize, Deserialize, Clone)]
159pub struct ExpansionsUpdateParams {
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub updates: Option<Vec<KeyValueParam>>,
163
164 #[serde(skip_serializing_if = "Option::is_none")]
166 pub file: Option<String>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
170 pub ignore_missing_file: Option<bool>,
171
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub env: Option<HashMap<String, String>>,
174}
175
176#[derive(Debug, Serialize, Deserialize, Clone)]
178pub struct ExpansionsWriteParams {
179 pub file: String,
181
182 #[serde(skip_serializing_if = "Option::is_none")]
184 pub redacted: Option<bool>,
185}
186
187#[derive(Debug, Serialize, Deserialize, Clone)]
189pub struct GenerateTasksParams {
190 pub files: Vec<String>,
192}
193
194#[derive(Debug, Serialize, Deserialize, Clone)]
196pub struct GitGetProjectParams {
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub directory: Option<String>,
200
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub token: Option<String>,
204
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub revisions: Option<HashMap<String, String>>,
208}
209
210#[derive(Debug, Serialize, Deserialize, Clone)]
212pub struct GitHubGenerateTokenParams {
213 #[serde(skip_serializing_if = "Option::is_none")]
215 pub owner: Option<String>,
216
217 #[serde(skip_serializing_if = "Option::is_none")]
219 pub repo: Option<String>,
220
221 pub expansion_name: String,
223
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub permissions: Option<HashMap<String, String>>,
227}
228
229#[derive(Debug, Serialize, Deserialize, Clone)]
231pub struct GotestParseFilesParams {
232 pub files: Vec<String>,
234}
235
236#[derive(Debug, Serialize, Deserialize, Clone)]
237#[serde(rename_all = "lowercase")]
238pub enum HostScope {
239 Task,
241
242 Build,
244}
245
246#[derive(Debug, Serialize, Deserialize, Clone)]
248pub struct EbsDevice {
249 pub device_name: String,
250 pub ebs_iops: u64,
251 pub ebs_size: u64,
252 pub ebs_snapshot_id: String,
253}
254
255#[derive(Debug, Serialize, Deserialize, Clone)]
257pub struct RegistrySettings {
258 pub registry_name: String,
260
261 #[serde(skip_serializing_if = "Option::is_none")]
263 pub registry_username: Option<String>,
264
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub registry_password: Option<String>,
268}
269
270#[derive(Debug, Serialize, Deserialize, Clone)]
272pub struct HostCreateParams {
273 #[serde(skip_serializing_if = "Option::is_none")]
275 pub file: Option<String>,
276
277 #[serde(skip_serializing_if = "Option::is_none")]
280 pub num_hosts: Option<u16>,
281
282 pub provider: CloudProvider,
284
285 #[serde(skip_serializing_if = "Option::is_none")]
287 pub retries: Option<u64>,
288
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub scope: Option<HostScope>,
292
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub timeout_setup_secs: Option<u64>,
296
297 #[serde(skip_serializing_if = "Option::is_none")]
299 pub timeout_teardown_secs: Option<u64>,
300
301 #[serde(skip_serializing_if = "Option::is_none")]
304 pub ami: Option<String>,
305
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub aws_access_key_id: Option<String>,
309
310 #[serde(skip_serializing_if = "Option::is_none")]
312 pub aws_secret_access_key: Option<String>,
313
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub device_name: Option<String>,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub distro: Option<String>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub ebs_block_device: Option<EbsDevice>,
324
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub instance_type: Option<String>,
328
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub ipv6: Option<bool>,
332
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub region: Option<String>,
336
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub security_group_ids: Option<Vec<String>>,
340
341 #[serde(skip_serializing_if = "Option::is_none")]
343 pub spot: Option<bool>,
344
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub subnet_id: Option<String>,
348
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub userdata_file: Option<String>,
352
353 #[serde(skip_serializing_if = "Option::is_none")]
354 pub userdata_command: Option<String>,
355
356 #[serde(skip_serializing_if = "Option::is_none")]
358 pub key_name: Option<String>,
359
360 #[serde(skip_serializing_if = "Option::is_none")]
363 pub image: Option<String>,
364
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub command: Option<String>,
368
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub publish_ports: Option<bool>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub registry: Option<RegistrySettings>,
376
377 #[serde(skip_serializing_if = "Option::is_none")]
379 pub background: Option<bool>,
380
381 #[serde(skip_serializing_if = "Option::is_none")]
383 pub container_wait_timeout_secs: Option<u64>,
384
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub pool_frequency_secs: Option<u64>,
388
389 #[serde(skip_serializing_if = "Option::is_none")]
391 pub stdout_file_name: Option<String>,
392
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub stderr_file_name: Option<String>,
396
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub environment_vars: Option<HashMap<String, String>>,
400}
401
402#[derive(Debug, Serialize, Deserialize, Clone)]
404pub struct HostListParams {
405 pub num_hosts: u64,
407 #[serde(skip_serializing_if = "Option::is_none")]
409 pub path: Option<String>,
410 pub timeout_seconds: u64,
412 pub wait: bool,
414 #[serde(skip_serializing_if = "Option::is_none")]
416 pub silent: Option<bool>,
417}
418
419#[derive(Debug, Serialize, Deserialize, Clone)]
421pub struct JsonSendParams {
422 pub file: String,
424
425 pub name: String,
427}
428
429#[derive(Debug, Serialize, Deserialize, Clone)]
431pub struct KeyValIncParams {
432 pub destination: String,
433 pub key: String,
434}
435
436#[derive(Debug, Serialize, Deserialize, Clone)]
438pub struct PerfSendParams {
439 pub file: String,
441
442 pub aws_key: String,
444
445 pub aws_secret: String,
447
448 pub bucket: String,
450
451 pub prefix: String,
453
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub region: Option<String>,
457}
458
459#[derive(Debug, Serialize, Deserialize, Clone)]
461pub struct DownstreamExpansionsSetParams {
462 pub file: String,
464}
465
466#[derive(Debug, Serialize, Deserialize, Clone)]
468pub struct EC2AssumeRoleParams {
469 pub role_arn: String,
471
472 #[serde(skip_serializing_if = "Option::is_none")]
474 pub policy: Option<String>,
475
476 #[serde(skip_serializing_if = "Option::is_none")]
478 pub duration_seconds: Option<u64>,
479}
480
481#[derive(Debug, Serialize, Deserialize, Clone)]
483pub struct S3GetParams {
484 pub local_file: Option<String>,
486
487 pub extract_to: Option<String>,
489
490 pub remote_file: String,
492
493 pub bucket: String,
495
496 #[serde(skip_serializing_if = "Option::is_none")]
498 pub build_variants: Option<Vec<String>>,
499
500 #[serde(flatten)]
502 auth_mode: S3AuthMode,
503}
504
505#[derive(Debug, Serialize, Deserialize, Clone)]
507pub struct S3PutParams {
508 #[serde(skip_serializing_if = "Option::is_none")]
510 pub local_file: Option<String>,
511
512 #[serde(skip_serializing_if = "Option::is_none")]
514 pub local_files_include_filter: Option<Vec<String>>,
515
516 #[serde(skip_serializing_if = "Option::is_none")]
518 pub local_files_include_filter_prefix: Option<String>,
519
520 pub remote_file: String,
522
523 pub bucket: String,
525
526 pub permissions: String,
528
529 pub content_type: String,
531
532 #[serde(skip_serializing_if = "Option::is_none")]
534 pub display_name: Option<String>,
535
536 #[serde(skip_serializing_if = "Option::is_none")]
538 pub optional: Option<bool>,
539
540 #[serde(skip_serializing_if = "Option::is_none")]
542 pub region: Option<String>,
543
544 #[serde(skip_serializing_if = "Option::is_none")]
546 pub visibility: Option<String>,
547
548 #[serde(skip_serializing_if = "Option::is_none")]
550 pub skip_existing: Option<StringOrBool>,
551
552 #[serde(flatten)]
554 auth_mode: S3AuthMode,
555}
556
557#[derive(Clone, Debug, Serialize, Deserialize)]
558#[serde(untagged)]
559pub enum S3AuthMode {
560 AutomaticAssumeRole{
561 role_arn: String,
563 },
564 PreviouslyAssumedRole{
565 aws_key: String,
567
568 aws_secret: String,
570
571 aws_session_token: String,
573 },
574 StaticCredentials{
575 aws_key: String,
577
578 aws_secret: String,
580 },
581}
582
583#[derive(Debug, Serialize, Deserialize, Clone)]
586#[serde(untagged)]
587pub enum StringOrBool {
588 Bool(bool),
589 String(String),
590}
591
592#[derive(Debug, Serialize, Deserialize, Clone)]
594pub struct S3CopyParams {
595 pub s3_copy_files: Vec<S3CopyFile>,
597
598 pub aws_key: String,
600
601 pub aws_secret: String,
603}
604
605#[derive(Debug, Serialize, Deserialize, Clone)]
607pub struct ShellExecParams {
608 pub script: String,
610
611 #[serde(skip_serializing_if = "Option::is_none")]
613 pub working_dir: Option<String>,
614
615 #[serde(skip_serializing_if = "Option::is_none")]
617 pub env: Option<HashMap<String, String>>,
618
619 #[serde(skip_serializing_if = "Option::is_none")]
621 pub add_expansions_to_env: Option<bool>,
622
623 #[serde(skip_serializing_if = "Option::is_none")]
625 pub include_expansions_in_env: Option<Vec<String>>,
626
627 #[serde(skip_serializing_if = "Option::is_none")]
629 pub background: Option<bool>,
630
631 #[serde(skip_serializing_if = "Option::is_none")]
633 pub silent: Option<bool>,
634
635 #[serde(skip_serializing_if = "Option::is_none")]
637 pub continue_on_err: Option<bool>,
638
639 #[serde(skip_serializing_if = "Option::is_none")]
641 pub system_log: Option<bool>,
642
643 #[serde(skip_serializing_if = "Option::is_none")]
645 pub shell: Option<String>,
646
647 #[serde(skip_serializing_if = "Option::is_none")]
649 pub ignore_standard_out: Option<bool>,
650
651 #[serde(skip_serializing_if = "Option::is_none")]
653 pub ignore_standard_error: Option<bool>,
654
655 #[serde(skip_serializing_if = "Option::is_none")]
657 pub redirect_standard_error_to_output: Option<bool>,
658}
659
660#[derive(Debug, Serialize, Deserialize, Clone)]
662pub struct PapertrailTraceParams {
663 #[serde(skip_serializing_if = "Option::is_none")]
665 pub work_dir: Option<String>,
666
667 pub key_id: String,
669
670 pub secret_key: String,
672
673 pub product: String,
675
676 pub version: String,
678
679 pub filenames: Vec<String>,
681}
682
683#[derive(Debug, Serialize, Deserialize, Clone)]
685pub struct SubprocessExecutionConfig {
686 #[serde(skip_serializing_if = "Option::is_none")]
688 pub silent: Option<bool>,
689
690 #[serde(skip_serializing_if = "Option::is_none")]
692 pub continue_on_err: Option<bool>,
693
694 #[serde(skip_serializing_if = "Option::is_none")]
696 pub system_log: Option<bool>,
697
698 #[serde(skip_serializing_if = "Option::is_none")]
700 pub ignore_standard_out: Option<bool>,
701
702 #[serde(skip_serializing_if = "Option::is_none")]
704 pub ignore_standard_error: Option<bool>,
705
706 #[serde(skip_serializing_if = "Option::is_none")]
708 pub redirect_standard_error_to_output: Option<bool>,
709
710 #[serde(skip_serializing_if = "Option::is_none")]
712 pub add_to_path: Option<Vec<String>>,
713
714 #[serde(skip_serializing_if = "Option::is_none")]
716 pub add_expansions_to_env: Option<bool>,
717
718 #[serde(skip_serializing_if = "Option::is_none")]
720 pub include_expansions_in_env: Option<Vec<String>>,
721}
722
723#[derive(Debug, Serialize, Deserialize, Clone)]
725pub struct SubprocessExecParams {
726 #[serde(skip_serializing_if = "Option::is_none")]
728 pub binary: Option<String>,
729
730 #[serde(skip_serializing_if = "Option::is_none")]
732 pub args: Option<Vec<String>>,
733
734 #[serde(skip_serializing_if = "Option::is_none")]
736 pub command: Option<String>,
737
738 #[serde(skip_serializing_if = "Option::is_none")]
740 pub working_dir: Option<String>,
741
742 #[serde(skip_serializing_if = "Option::is_none")]
744 pub env: Option<HashMap<String, String>>,
745
746 #[serde(skip_serializing_if = "Option::is_none")]
748 pub background: Option<bool>,
749
750 #[serde(skip_serializing_if = "Option::is_none")]
752 pub shell: Option<String>,
753
754 #[serde(flatten)]
756 pub execution_config: SubprocessExecutionConfig,
757}
758
759#[derive(Debug, Serialize, Deserialize, Clone)]
760pub struct ScriptingTestOptions {
761 #[serde(skip_serializing_if = "Option::is_none")]
763 pub name: Option<String>,
764
765 #[serde(skip_serializing_if = "Option::is_none")]
767 pub args: Option<Vec<String>>,
768
769 #[serde(skip_serializing_if = "Option::is_none")]
771 pub pattern: Option<String>,
772
773 #[serde(skip_serializing_if = "Option::is_none")]
774 pub timeout_secs: Option<u64>,
775
776 #[serde(skip_serializing_if = "Option::is_none")]
778 pub count: Option<u64>,
779}
780
781#[derive(Debug, Serialize, Deserialize, Clone)]
783pub struct SubprocessScriptingParams {
784 pub harness: ScriptingHarness,
786
787 #[serde(skip_serializing_if = "Option::is_none")]
789 pub command: Option<String>,
790
791 #[serde(skip_serializing_if = "Option::is_none")]
793 pub args: Option<Vec<String>>,
794
795 #[serde(skip_serializing_if = "Option::is_none")]
797 pub test_dir: Option<String>,
798
799 #[serde(skip_serializing_if = "Option::is_none")]
801 pub test_options: Option<ScriptingTestOptions>,
802
803 #[serde(skip_serializing_if = "Option::is_none")]
805 pub cache_duration_secs: Option<u64>,
806
807 #[serde(skip_serializing_if = "Option::is_none")]
809 pub cleanup_harness: Option<bool>,
810
811 #[serde(skip_serializing_if = "Option::is_none")]
813 pub lock_file: Option<String>,
814
815 #[serde(skip_serializing_if = "Option::is_none")]
817 pub packages: Option<Vec<String>>,
818
819 #[serde(skip_serializing_if = "Option::is_none")]
821 pub harness_path: Option<String>,
822
823 #[serde(flatten)]
825 pub execution_config: SubprocessExecutionConfig,
826}
827
828#[derive(Debug, Serialize, Deserialize, Clone)]
830pub struct TimeoutUpdateParams {
831 #[serde(skip_serializing_if = "Option::is_none")]
833 pub exec_timeout_secs: Option<TimeoutValue>,
834
835 #[serde(skip_serializing_if = "Option::is_none")]
837 pub timeout_secs: Option<TimeoutValue>,
838}
839
840#[derive(Debug, Serialize, Deserialize, Clone)]
842#[serde(tag = "command", content = "params")]
843pub enum EvgCommandSpec {
844 #[serde(rename = "archive.targz_extract")]
846 ArchiveTargzExtract(ArchiveTargzExtractParams),
847
848 #[serde(rename = "archive.targz_pack")]
850 ArchiveTargzPack(ArchiveTargzPackParams),
851
852 #[serde(rename = "archive.auto_extract")]
853 ArchiveAutoExtract,
854
855 #[serde(rename = "attach.artifacts")]
857 AttachArtifacts(AttachArtifactsParams),
858
859 #[serde(rename = "attach.results")]
861 AttachResults(AttachResultsParams),
862
863 #[serde(rename = "attach.xunit_results")]
865 AttachXUnitResults(AttachXUnitResultsParams),
866
867 #[serde(rename = "expansions.update")]
869 ExpansionsUpdate(Option<ExpansionsUpdateParams>),
870
871 #[serde(rename = "expansions.write")]
873 ExpansionsWrite(ExpansionsWriteParams),
874
875 #[serde(rename = "generate.tasks")]
877 GenerateTasks(GenerateTasksParams),
878
879 #[serde(rename = "git.get_project")]
881 GitGetProject(Option<GitGetProjectParams>),
882
883 #[serde(rename = "github.generate_token")]
885 GitHubGenerateToken(GitHubGenerateTokenParams),
886
887 #[serde(rename = "gotest.parse_files")]
889 GotestParseFiles(GotestParseFilesParams),
890
891 #[serde(rename = "host.create")]
893 HostCreate(HostCreateParams),
894
895 #[serde(rename = "host.list")]
897 HostList(HostListParams),
898
899 #[serde(rename = "json.send")]
901 JsonSend(JsonSendParams),
902
903 #[serde(rename = "keyval.inc")]
904 KeyValInc(KeyValIncParams),
905
906 #[serde(rename = "manifest.load")]
908 ManifestLoad,
909
910 #[serde(rename = "perf.send")]
912 PerfSend(PerfSendParams),
913
914 #[serde(rename = "downstream_expansions.set")]
916 DownstreamExpansionsSet(DownstreamExpansionsSetParams),
917
918 #[serde(rename = "ec2.assume_role")]
920 EC2AssumeRole(EC2AssumeRoleParams),
921
922 #[serde(rename = "s3.get")]
924 S3Get(S3GetParams),
925
926 #[serde(rename = "s3.put")]
928 S3Put(S3PutParams),
929
930 #[serde(rename = "s3Copy.copy")]
932 S3Copy(S3CopyParams),
933
934 #[serde(rename = "shell.exec")]
936 ShellExec(ShellExecParams),
937
938 #[serde(rename = "papertrail.trace")]
940 PapertrailExec(PapertrailTraceParams),
941
942 #[serde(rename = "subprocess.exec")]
944 SubprocessExec(SubprocessExecParams),
945
946 #[serde(rename = "subprocess.scripting")]
948 SubprocessScripting(SubprocessScriptingParams),
949
950 #[serde(rename = "timeout.update")]
952 TimeoutUpdate(TimeoutUpdateParams),
953}
954
955#[derive(Debug, Serialize, Deserialize, Clone)]
956pub struct BuiltInCommand {
957 #[serde(flatten)]
959 pub command: EvgCommandSpec,
960
961 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
963 pub command_type: Option<EvgCommandType>,
964
965 #[serde(skip_serializing_if = "Option::is_none")]
966 pub params_yaml: Option<String>,
967}