aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/main.rs b/src/main.rs
index 303d4f3..9f50595 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -114,6 +114,9 @@ struct NetUpArgs {
114 /// 99.91315 110.71518 93.90618 84.67561 0.0 {n} 114 /// 99.91315 110.71518 93.90618 84.67561 0.0 {n}
115 #[clap(long)] 115 #[clap(long)]
116 latency_matrix: PathBuf, 116 latency_matrix: PathBuf,
117
118 #[clap(long)]
119 matrix_wrap: bool,
117} 120}
118 121
119#[derive(Debug, Args)] 122#[derive(Debug, Args)]
@@ -141,6 +144,9 @@ struct NetPreviewArgs {
141 144
142 #[clap(long)] 145 #[clap(long)]
143 latency_matrix: PathBuf, 146 latency_matrix: PathBuf,
147
148 #[clap(long)]
149 matrix_wrap: bool,
144} 150}
145 151
146#[derive(Debug, Args)] 152#[derive(Debug, Args)]
@@ -245,7 +251,7 @@ async fn cmd_net_up(args: NetUpArgs) -> Result<()> {
245 let matrix = LatencyMatrix::parse(&matrix_content, latency_matrix::TimeUnit::Milliseconds) 251 let matrix = LatencyMatrix::parse(&matrix_content, latency_matrix::TimeUnit::Milliseconds)
246 .context("parsing latency matrix")?; 252 .context("parsing latency matrix")?;
247 let machines = oar::job_list_machines(&context).await?; 253 let machines = oar::job_list_machines(&context).await?;
248 let configs = machine_generate_configs(&matrix, &machines, &args.addresses)?; 254 let configs = machine_generate_configs(&matrix, args.matrix_wrap, &machines, &args.addresses)?;
249 machines_net_container_build(&context, &machines).await?; 255 machines_net_container_build(&context, &machines).await?;
250 machines_clean(&context, &machines).await?; 256 machines_clean(&context, &machines).await?;
251 machines_configure(&context, &configs).await?; 257 machines_configure(&context, &configs).await?;
@@ -307,7 +313,7 @@ async fn cmd_net_preview(args: NetPreviewArgs) -> Result<()> {
307 let matrix = LatencyMatrix::parse(&matrix_content, latency_matrix::TimeUnit::Milliseconds) 313 let matrix = LatencyMatrix::parse(&matrix_content, latency_matrix::TimeUnit::Milliseconds)
308 .context("parsing latency matrix")?; 314 .context("parsing latency matrix")?;
309 let machines = args.machine; 315 let machines = args.machine;
310 let configs = machine_generate_configs(&matrix, &machines, &args.addresses)?; 316 let configs = machine_generate_configs(&matrix, args.matrix_wrap, &machines, &args.addresses)?;
311 317
312 for config in configs { 318 for config in configs {
313 (0..20).for_each(|_| print!("-")); 319 (0..20).for_each(|_| print!("-"));
@@ -955,6 +961,7 @@ fn machine_address_for_idx(machine: Machine, idx: u32) -> Ipv4Addr {
955 961
956fn machine_generate_configs( 962fn machine_generate_configs(
957 matrix: &LatencyMatrix, 963 matrix: &LatencyMatrix,
964 matrix_wrap: bool,
958 machines: &[Machine], 965 machines: &[Machine],
959 addr_policy: &AddressAllocationPolicy, 966 addr_policy: &AddressAllocationPolicy,
960) -> Result<Vec<MachineConfig>> { 967) -> Result<Vec<MachineConfig>> {
@@ -1003,12 +1010,14 @@ fn machine_generate_configs(
1003 .push(address); 1010 .push(address);
1004 } 1011 }
1005 1012
1006 if addresses.len() > matrix.dimension() { 1013 if !matrix_wrap {
1007 return Err(eyre::eyre!( 1014 if addresses.len() > matrix.dimension() {
1008 "latency matrix is too small, size is {} but {} was required", 1015 return Err(eyre::eyre!(
1009 matrix.dimension(), 1016 "latency matrix is too small, size is {} but {} was required",
1010 addresses.len() 1017 matrix.dimension(),
1011 )); 1018 addresses.len()
1019 ));
1020 }
1012 } 1021 }
1013 1022
1014 for &machine in machines { 1023 for &machine in machines {
@@ -1029,7 +1038,13 @@ fn machine_generate_configs(
1029 let addr_idx = address_to_index[&addr]; 1038 let addr_idx = address_to_index[&addr];
1030 for other_idx in (0..addresses.len()).filter(|i| *i != addr_idx) { 1039 for other_idx in (0..addresses.len()).filter(|i| *i != addr_idx) {
1031 let other = addresses[other_idx]; 1040 let other = addresses[other_idx];
1032 let latency = matrix.latency(addr_idx, other_idx); 1041 let latency = match matrix_wrap {
1042 true => matrix.latency(
1043 addr_idx % matrix.dimension(),
1044 other_idx % matrix.dimension(),
1045 ),
1046 false => matrix.latency(addr_idx, other_idx),
1047 };
1033 let latency_millis = u32::try_from(latency.as_millis()).unwrap(); 1048 let latency_millis = u32::try_from(latency.as_millis()).unwrap();
1034 if !latencies_set.contains(&latency_millis) { 1049 if !latencies_set.contains(&latency_millis) {
1035 latencies_set.insert(latency_millis); 1050 latencies_set.insert(latency_millis);