Skip to content

Commit 0b406d1

Browse files
DAG-1940 Generate tasks separately for Windows, MacOS, Linux distro groups (#43)
1 parent 0babc64 commit 0b406d1

File tree

13 files changed

+192
-38
lines changed

13 files changed

+192
-38
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 0.5.0 - 2022-08-01
4+
5+
* Generate tasks separately for Windows, MacOS, Linux distro groups.
6+
37
## 0.4.7 - 2022-07-14
48

59
* Add support for burn_in_tags generation.

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mongo-task-generator"
3-
version = "0.4.7"
3+
version = "0.5.0"
44
repository = "https://github.com/mongodb/mongo-task-generator"
55
authors = ["Decision Automation Group <[email protected]>"]
66
edition = "2018"

src/evergreen/evg_config_utils.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::collections::{HashMap, HashSet};
2+
use std::vec;
23

34
use anyhow::{bail, Result};
45
use lazy_static::lazy_static;
@@ -7,7 +8,9 @@ use shrub_rs::models::commands::EvgCommand::Function;
78
use shrub_rs::models::params::ParamValue;
89
use shrub_rs::models::{commands::FunctionCall, task::EvgTask, variant::BuildVariant};
910

10-
use crate::evergreen_names::{ENTERPRISE_MODULE, GENERATE_RESMOKE_TASKS, IS_FUZZER};
11+
use crate::evergreen_names::{
12+
ENTERPRISE_MODULE, GENERATE_RESMOKE_TASKS, IS_FUZZER, LINUX, MACOS, WINDOWS,
13+
};
1114
use crate::utils::task_name::remove_gen_suffix;
1215

1316
lazy_static! {
@@ -229,6 +232,17 @@ pub trait EvgConfigUtils: Sync + Send {
229232
///
230233
/// true if given build variant includes the enterprise module.
231234
fn is_enterprise_build_variant(&self, build_variant: &BuildVariant) -> bool;
235+
236+
/// Infer platform that build variant will be running on.
237+
///
238+
/// # Arguments
239+
///
240+
/// * `build_variant` - Build variant to query.
241+
///
242+
/// # Returns
243+
///
244+
/// Linux, or Mac, or Windows platform that build variant will be running on.
245+
fn infer_build_variant_platform(&self, build_variant: &BuildVariant) -> String;
232246
}
233247

234248
/// Service for utilities to help interpret evergreen configuration.
@@ -581,6 +595,33 @@ impl EvgConfigUtils for EvgConfigUtilsImpl {
581595
false
582596
}
583597
}
598+
599+
/// Infer platform that build variant will run on.
600+
///
601+
/// # Arguments
602+
///
603+
/// * `build_variant` - Build variant to query.
604+
///
605+
/// # Returns
606+
///
607+
/// linux, or mac, or windows platform that build variant will run on.
608+
fn infer_build_variant_platform(&self, build_variant: &BuildVariant) -> String {
609+
let distro = build_variant
610+
.run_on
611+
.as_ref()
612+
.unwrap_or(&vec!["".to_string()])
613+
.first()
614+
.unwrap_or(&"".to_string())
615+
.to_lowercase();
616+
617+
if distro.contains(MACOS) {
618+
MACOS.to_string()
619+
} else if distro.contains(WINDOWS) {
620+
WINDOWS.to_string()
621+
} else {
622+
LINUX.to_string()
623+
}
624+
}
584625
}
585626

586627
/// Get the shrub function make the 'generate resmoke task' call in the given task.
@@ -1271,4 +1312,27 @@ mod tests {
12711312

12721313
assert!(!evg_config_utils.is_enterprise_build_variant(&build_variant));
12731314
}
1315+
1316+
// tests for infer_build_variant_platform
1317+
#[rstest]
1318+
#[case(Some(vec!["rhel80-small".to_string()]), "linux".to_string())]
1319+
#[case(Some(vec!["windows-vsCurrent-small".to_string()]), "windows".to_string())]
1320+
#[case(Some(vec!["macos-1100".to_string()]), "macos".to_string())]
1321+
#[case(Some(vec!["rhel80-small".to_string(), "macos-1100".to_string()]), "linux".to_string())]
1322+
#[case(Some(vec![]), "linux".to_string())]
1323+
fn test_infer_build_variant_platform(
1324+
#[case] distros: Option<Vec<String>>,
1325+
#[case] platform: String,
1326+
) {
1327+
let build_variant = BuildVariant {
1328+
run_on: distros,
1329+
..Default::default()
1330+
};
1331+
let evg_config_utils = EvgConfigUtilsImpl::new();
1332+
1333+
assert_eq!(
1334+
evg_config_utils.infer_build_variant_platform(&build_variant),
1335+
platform
1336+
);
1337+
}
12741338
}

src/evergreen_names.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,11 @@ pub const MULTIVERSION_LAST_CONTINUOUS: &str = "last_continuous";
111111
// Distros
112112
/// Name of compile task distro for burn_in_tags.
113113
pub const COMPILE_TASK_DISTRO: &str = "rhel80-xlarge";
114+
115+
// Distro group names
116+
/// Windows distro group name.
117+
pub const WINDOWS: &str = "windows";
118+
/// MacOS distro group name.
119+
pub const MACOS: &str = "macos";
120+
/// Linux distro group name.
121+
pub const LINUX: &str = "linux";

src/lib.rs

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,9 @@ impl GenerateTasksService for GenerateTasksServiceImpl {
461461
let is_enterprise = self
462462
.evg_config_utils
463463
.is_enterprise_build_variant(build_variant);
464+
let platform = self
465+
.evg_config_utils
466+
.infer_build_variant_platform(build_variant);
464467
for task in &build_variant.tasks {
465468
// Burn in tasks could be different for each build variant, so we will always
466469
// handle them.
@@ -502,7 +505,7 @@ impl GenerateTasksService for GenerateTasksServiceImpl {
502505
}
503506

504507
// Skip tasks that have already been seen.
505-
let task_name = lookup_task_name(is_enterprise, &task.name);
508+
let task_name = lookup_task_name(is_enterprise, &task.name, &platform);
506509
if seen_tasks.contains(&task_name) {
507510
continue;
508511
}
@@ -553,13 +556,24 @@ impl GenerateTasksService for GenerateTasksServiceImpl {
553556

554557
Some(self.gen_fuzzer_service.generate_fuzzer_task(&params)?)
555558
} else {
556-
event!(Level::INFO, "Generating resmoke task: {}", task_def.name);
557559
let is_enterprise = self
558560
.evg_config_utils
559561
.is_enterprise_build_variant(build_variant);
560-
let params = self
561-
.config_extraction_service
562-
.task_def_to_resmoke_params(task_def, is_enterprise)?;
562+
let platform = self
563+
.evg_config_utils
564+
.infer_build_variant_platform(build_variant);
565+
event!(
566+
Level::INFO,
567+
"Generating resmoke task: {}, is_enterprise: {}, platform: {}",
568+
task_def.name,
569+
is_enterprise,
570+
platform
571+
);
572+
let params = self.config_extraction_service.task_def_to_resmoke_params(
573+
task_def,
574+
is_enterprise,
575+
Some(platform),
576+
)?;
563577
Some(
564578
self.gen_resmoke_service
565579
.generate_resmoke_task(&params, &build_variant.name)
@@ -593,6 +607,9 @@ impl GenerateTasksService for GenerateTasksServiceImpl {
593607
let is_enterprise = self
594608
.evg_config_utils
595609
.is_enterprise_build_variant(build_variant);
610+
let platform = self
611+
.evg_config_utils
612+
.infer_build_variant_platform(build_variant);
596613
let mut gen_config = GeneratedConfig::new();
597614
let mut generating_tasks = vec![];
598615
let large_distro_name = self
@@ -617,7 +634,7 @@ impl GenerateTasksService for GenerateTasksServiceImpl {
617634
let task_name = if task.name == BURN_IN_TESTS {
618635
format!("{}-{}", BURN_IN_PREFIX, build_variant.name)
619636
} else {
620-
lookup_task_name(is_enterprise, &task.name)
637+
lookup_task_name(is_enterprise, &task.name, &platform)
621638
};
622639

623640
if let Some(generated_task) = generated_tasks.get(&task_name) {
@@ -687,20 +704,17 @@ impl GenerateTasksService for GenerateTasksServiceImpl {
687704
/// # Arguments
688705
///
689706
/// * `is_enterprise` - Whether the task is for an enterprise build variant.
690-
/// * `task` - Evergreen definition of task.
707+
/// * `task` - Name of task.
708+
/// * `platform` - Platform that task will run on.
691709
///
692710
/// # Returns
693711
///
694712
/// Name to use for task.
695-
fn lookup_task_name(is_enterprise: bool, task_name: &str) -> String {
696-
if task_name == BURN_IN_TESTS {
697-
return task_name.to_string();
698-
}
699-
713+
fn lookup_task_name(is_enterprise: bool, task_name: &str, platform: &str) -> String {
700714
if is_enterprise {
701-
format!("{}-{}", task_name, ENTERPRISE_MODULE)
715+
format!("{}-{}-{}", task_name, platform, ENTERPRISE_MODULE)
702716
} else {
703-
task_name.to_string()
717+
format!("{}-{}", task_name, platform)
704718
}
705719
}
706720

@@ -735,7 +749,8 @@ fn create_task_worker(
735749
.unwrap();
736750

737751
let is_enterprise = evg_config_utils.is_enterprise_build_variant(&build_variant);
738-
let task_name = lookup_task_name(is_enterprise, &task_def.name);
752+
let platform = evg_config_utils.infer_build_variant_platform(&build_variant);
753+
let task_name = lookup_task_name(is_enterprise, &task_def.name, &platform);
739754

740755
if let Some(generated_task) = generated_task {
741756
let mut generated_tasks = generated_tasks.lock().unwrap();
@@ -933,15 +948,16 @@ mod tests {
933948

934949
// tests for lookup_task_name.
935950
#[rstest]
936-
#[case(false, "my_task", "my_task")]
937-
#[case(true, "my_task", "my_task-enterprise")]
951+
#[case(false, "my_task", "my_platform", "my_task-my_platform")]
952+
#[case(true, "my_task", "my_platform", "my_task-my_platform-enterprise")]
938953
fn test_lookup_task_name_should_use_enterprise_when_specified(
939954
#[case] is_enterprise: bool,
940955
#[case] task_name: &str,
956+
#[case] platform: &str,
941957
#[case] expected_task_name: &str,
942958
) {
943959
assert_eq!(
944-
lookup_task_name(is_enterprise, task_name),
960+
lookup_task_name(is_enterprise, task_name, platform),
945961
expected_task_name.to_string()
946962
);
947963
}
@@ -1048,6 +1064,10 @@ mod tests {
10481064
fn is_enterprise_build_variant(&self, _build_variant: &BuildVariant) -> bool {
10491065
todo!()
10501066
}
1067+
1068+
fn infer_build_variant_platform(&self, _build_variant: &BuildVariant) -> String {
1069+
todo!()
1070+
}
10511071
}
10521072

10531073
struct MockResmokeConfigActorService {}
@@ -1083,6 +1103,7 @@ mod tests {
10831103
&self,
10841104
_task_def: &EvgTask,
10851105
_is_enterprise: bool,
1106+
_platform: Option<String>,
10861107
) -> Result<ResmokeGenParams> {
10871108
todo!()
10881109
}

src/services/config_extraction.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ pub trait ConfigExtractionService: Sync + Send {
3737
/// # Arguments
3838
///
3939
/// * `task-def` - Task definition of task to generate.
40+
/// * `is_enterprise` - Is this being generated for an enterprise build variant.
41+
/// * `platform` - Platform that task will run on.
4042
///
4143
/// # Returns
4244
///
@@ -45,6 +47,7 @@ pub trait ConfigExtractionService: Sync + Send {
4547
&self,
4648
task_def: &EvgTask,
4749
is_enterprise: bool,
50+
platform: Option<String>,
4851
) -> Result<ResmokeGenParams>;
4952
}
5053

@@ -160,6 +163,7 @@ impl ConfigExtractionService for ConfigExtractionServiceImpl {
160163
config_location: self.config_location.clone(),
161164
dependencies: self.determine_task_dependencies(task_def),
162165
is_enterprise,
166+
platform: Some(evg_config_utils.infer_build_variant_platform(build_variant)),
163167
})
164168
}
165169

@@ -169,6 +173,7 @@ impl ConfigExtractionService for ConfigExtractionServiceImpl {
169173
///
170174
/// * `task_def` - Task definition of task to generate.
171175
/// * `is_enterprise` - Is this being generated for an enterprise build variant.
176+
/// * `platform` - Platform that task will run on.
172177
///
173178
/// # Returns
174179
///
@@ -177,6 +182,7 @@ impl ConfigExtractionService for ConfigExtractionServiceImpl {
177182
&self,
178183
task_def: &EvgTask,
179184
is_enterprise: bool,
185+
platform: Option<String>,
180186
) -> Result<ResmokeGenParams> {
181187
let task_name = remove_gen_suffix(&task_def.name).to_string();
182188
let suite = self.evg_config_utils.find_suite_name(task_def).to_string();
@@ -209,6 +215,7 @@ impl ConfigExtractionService for ConfigExtractionServiceImpl {
209215
dependencies: self.determine_task_dependencies(task_def),
210216
is_enterprise,
211217
pass_through_vars: self.evg_config_utils.get_gen_task_vars(task_def),
218+
platform,
212219
})
213220
}
214221
}

src/task_types/burn_in_tests.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ impl BurnInServiceImpl {
169169
for (index, test) in discovered_task.test_list.iter().enumerate() {
170170
let mut params = self
171171
.config_extraction_service
172-
.task_def_to_resmoke_params(task_def, false)?;
172+
.task_def_to_resmoke_params(task_def, false, None)?;
173173
update_resmoke_params_for_burn_in(&mut params, test);
174174

175175
if params.generate_multiversion_combos {
@@ -238,6 +238,7 @@ impl BurnInServiceImpl {
238238
origin_suite: origin_suite.clone(),
239239
mv_exclude_tags: suite_info.multiversion_tags.clone(),
240240
is_enterprise: false,
241+
platform: None,
241242
};
242243

243244
self.gen_resmoke_task_service.build_resmoke_sub_task(
@@ -513,6 +514,7 @@ mod tests {
513514
&self,
514515
_task_def: &EvgTask,
515516
_is_enterprise: bool,
517+
_platform: Option<String>,
516518
) -> Result<ResmokeGenParams> {
517519
Ok(ResmokeGenParams {
518520
generate_multiversion_combos: self.is_multiversion,

src/task_types/fuzzer_tasks.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ pub struct FuzzerGenTaskParams {
5757
pub dependencies: Vec<String>,
5858
/// Is this task for enterprise builds.
5959
pub is_enterprise: bool,
60+
/// Name of platform the task will run on.
61+
pub platform: Option<String>,
6062
}
6163

6264
impl FuzzerGenTaskParams {
@@ -273,6 +275,7 @@ fn build_fuzzer_sub_task(
273275
Some(sub_task_index),
274276
params.num_tasks as usize,
275277
params.is_enterprise,
278+
params.platform.as_deref(),
276279
);
277280

278281
let mut commands = vec![];

src/task_types/resmoke_config_writer.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,13 @@ impl WriteConfigActorImpl {
148148

149149
let filename = format!(
150150
"{}.yml",
151-
name_generated_task(&s.name, s.index, total_tasks, s.is_enterprise)
151+
name_generated_task(
152+
&s.name,
153+
s.index,
154+
total_tasks,
155+
s.is_enterprise,
156+
s.platform.as_deref()
157+
)
152158
);
153159
let mut path = PathBuf::from(&self.target_dir);
154160
path.push(filename);
@@ -182,7 +188,13 @@ impl WriteConfigActorImpl {
182188
let misc_config = origin_config.with_new_tests(None, Some(&test_list));
183189
let filename = format!(
184190
"{}.yml",
185-
name_generated_task(&s.name, s.index, total_tasks, s.is_enterprise)
191+
name_generated_task(
192+
&s.name,
193+
s.index,
194+
total_tasks,
195+
s.is_enterprise,
196+
s.platform.as_deref()
197+
)
186198
);
187199
let mut path = PathBuf::from(&self.target_dir);
188200
path.push(filename);

0 commit comments

Comments
 (0)