From f6c94430c8d71b95660ffff2ef621d2747a08cad Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Sat, 23 Dec 2023 23:50:29 +0200 Subject: feat(tvix/build/protos): add some missing fields - directory in which the castore input nodes are mounted - working directory for the build command - scratch paths - network access y/n - whether a (static) /bin/sh should be provided Populate these fields appropriately, and extend the tests in tvix-glue with a FOD example. Change-Id: I4f9de1483d6696d74694a09784910c407acb0be0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10412 Autosubmit: flokli Tested-by: BuildkiteCI Reviewed-by: sterni --- tvix/glue/src/tvix_build.rs | 107 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 12 deletions(-) (limited to 'tvix/glue/src/tvix_build.rs') diff --git a/tvix/glue/src/tvix_build.rs b/tvix/glue/src/tvix_build.rs index e939abf3cc..a0ebf49e12 100644 --- a/tvix/glue/src/tvix_build.rs +++ b/tvix/glue/src/tvix_build.rs @@ -134,12 +134,19 @@ where .cmp(b.node.as_ref().unwrap().get_name()) }); - // Produce constraints. We currently only put platform in here. - // Maybe more things need to be added here in the future. + // Produce constraints. let constraints = Some(BuildConstraints { system: derivation.system.clone(), min_memory: 0, available_ro_paths: vec![], + // in case this is a fixed-output derivation, allow network access. + network_access: derivation.outputs.len() == 1 + && derivation + .outputs + .get("out") + .expect("invalid derivation") + .is_fixed(), + provide_bin_sh: true, }); BuildRequest { @@ -148,6 +155,9 @@ where environment_vars, inputs, constraints, + working_dir: "build".into(), + scratch_paths: vec!["build".into()], + store_dir: nix_compat::store_path::STORE_DIR.into(), } } @@ -205,24 +215,24 @@ mod test { let mut expected_environment_vars = vec![ EnvVar { - key: "bar".to_string(), - value: Bytes::from("/nix/store/mp57d33657rf34lzvlbpfa1gjfv5gmpg-bar"), + key: "bar".into(), + value: "/nix/store/mp57d33657rf34lzvlbpfa1gjfv5gmpg-bar".into(), }, EnvVar { - key: "builder".to_string(), - value: Bytes::from(":"), + key: "builder".into(), + value: ":".into(), }, EnvVar { - key: "name".to_string(), - value: Bytes::from("foo"), + key: "name".into(), + value: "foo".into(), }, EnvVar { - key: "out".to_string(), - value: Bytes::from("/nix/store/fhaj6gmwns62s6ypkcldbaj2ybvkhx3p-foo"), + key: "out".into(), + value: "/nix/store/fhaj6gmwns62s6ypkcldbaj2ybvkhx3p-foo".into(), }, EnvVar { - key: "system".to_string(), - value: Bytes::from(":"), + key: "system".into(), + value: ":".into(), }, ]; @@ -242,8 +252,81 @@ mod test { constraints: Some(BuildConstraints { system: derivation.system.clone(), min_memory: 0, + network_access: false, available_ro_paths: vec![], + provide_bin_sh: true, }), + working_dir: "build".to_string(), + scratch_paths: vec!["build".to_string()], + store_dir: nix_compat::store_path::STORE_DIR.to_string(), + }, + build_request + ); + } + + #[test] + fn test_fod_to_build_request() { + let aterm_bytes = include_bytes!("tests/0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv"); + + let derivation = Derivation::from_aterm_bytes(aterm_bytes).expect("must parse"); + + let build_request = + derivation_to_build_request(&derivation, |_| unreachable!(), |_, _| unreachable!()); + + let mut expected_environment_vars = vec![ + EnvVar { + key: "builder".into(), + value: ":".into(), + }, + EnvVar { + key: "name".into(), + value: "bar".into(), + }, + EnvVar { + key: "out".into(), + value: "/nix/store/4q0pg5zpfmznxscq3avycvf9xdvx50n3-bar".into(), + }, + EnvVar { + key: "outputHash".into(), + value: "08813cbee9903c62be4c5027726a418a300da4500b2d369d3af9286f4815ceba".into(), + }, + EnvVar { + key: "outputHashAlgo".into(), + value: "sha256".into(), + }, + EnvVar { + key: "outputHashMode".into(), + value: "recursive".into(), + }, + EnvVar { + key: "system".into(), + value: ":".into(), + }, + ]; + + expected_environment_vars.extend(NIX_ENVIRONMENT_VARS.iter().map(|(k, v)| EnvVar { + key: k.to_string(), + value: Bytes::from_static(v.as_bytes()), + })); + + expected_environment_vars.sort_unstable_by_key(|e| e.key.to_owned()); + + assert_eq!( + BuildRequest { + command_args: vec![":".to_string()], + outputs: vec!["4q0pg5zpfmznxscq3avycvf9xdvx50n3-bar".to_string()], + environment_vars: expected_environment_vars, + inputs: vec![], + constraints: Some(BuildConstraints { + system: derivation.system.clone(), + min_memory: 0, + network_access: true, + available_ro_paths: vec![], + provide_bin_sh: true, + }), + working_dir: "build".to_string(), + scratch_paths: vec!["build".to_string()], + store_dir: nix_compat::store_path::STORE_DIR.to_string(), }, build_request ); -- cgit 1.4.1