diff --git a/modules/cluster/deployment.nix b/modules/cluster/deployment.nix new file mode 100644 index 00000000..7c4e190c --- /dev/null +++ b/modules/cluster/deployment.nix @@ -0,0 +1,53 @@ +{ config, lib, ... }: + +let + inherit (config.networking) hostName; + inherit (config.system.build.skyflake-deployment) user repo vmName; + + generateMacAddress = net: + let + hash = builtins.hashString "md5" "1-${net}-${hostName}"; + c = off: builtins.substring off 2 hash; + in + "${builtins.substring 0 1 hash}2:${c 2}:${c 4}:${c 6}:${c 8}:${c 10}"; + + withoutLeadingSlash = s: + let s' = lib.removePrefix "/" s; in + if s' == s + then s + else withoutLeadingSlash s'; + +in +{ + config.microvm = { + hypervisor = "cloud-hypervisor"; + vcpu = config.deployment.vcpu; + mem = config.deployment.mem; + + shares = [ { + proto = "virtiofs"; + tag = "ro-store"; + source = "/nix/store"; + mountPoint = "/nix/.ro-store"; + } ] ++ map (mountPoint: { + proto = "virtiofs"; + tag = builtins.replaceStrings [ "/" ] [ "-" ] ( + withoutLeadingSlash mountPoint + ); + source = "/storage/glusterfs/microvms/${user}/${repo}/${vmName}/${withoutLeadingSlash mountPoint}"; + inherit mountPoint; + }) config.deployment.persistedShares; + # volumes = [ { + # image = "/storage/glusterfs/microvms/${user}/${repo}/${vmName}/overlay.img"; + # mountPoint = "/"; + # size = 8 * 1024; + # } ]; + # writableStoreOverlay = "/nix/.rw-store"; + + interfaces = map (net: { + type = "tap"; + id = builtins.substring 0 15 "${net}-${hostName}"; + mac = generateMacAddress net; + }) config.deployment.networks; + }; +}