at 25.11-pre 5.3 kB view raw
1import ./make-test-python.nix ( 2 { pkgs, lib, ... }: 3 let 4 initiatorName = "iqn.2020-08.org.linux-iscsi.initiatorhost:example"; 5 targetName = "iqn.2003-01.org.linux-iscsi.target.x8664:sn.acf8fd9c23af"; 6 in 7 { 8 name = "iscsi"; 9 meta = { 10 maintainers = lib.teams.deshaw.members ++ lib.teams.helsinki-systems.members; 11 }; 12 13 nodes = { 14 target = 15 { 16 config, 17 pkgs, 18 lib, 19 ... 20 }: 21 { 22 services.target = { 23 enable = true; 24 config = { 25 fabric_modules = [ ]; 26 storage_objects = [ 27 { 28 dev = "/dev/vdb"; 29 name = "test"; 30 plugin = "block"; 31 write_back = true; 32 wwn = "92b17c3f-6b40-4168-b082-ceeb7b495522"; 33 } 34 ]; 35 targets = [ 36 { 37 fabric = "iscsi"; 38 tpgs = [ 39 { 40 enable = true; 41 attributes = { 42 authentication = 0; 43 generate_node_acls = 1; 44 }; 45 luns = [ 46 { 47 alias = "94dfe06967"; 48 alua_tg_pt_gp_name = "default_tg_pt_gp"; 49 index = 0; 50 storage_object = "/backstores/block/test"; 51 } 52 ]; 53 node_acls = [ 54 { 55 mapped_luns = [ 56 { 57 alias = "d42f5bdf8a"; 58 index = 0; 59 tpg_lun = 0; 60 write_protect = false; 61 } 62 ]; 63 node_wwn = initiatorName; 64 } 65 ]; 66 portals = [ 67 { 68 ip_address = "[::]"; 69 iser = false; 70 offload = false; 71 port = 3260; 72 } 73 ]; 74 tag = 1; 75 } 76 ]; 77 wwn = targetName; 78 } 79 ]; 80 }; 81 }; 82 83 networking.firewall.allowedTCPPorts = [ 3260 ]; 84 networking.firewall.allowedUDPPorts = [ 3260 ]; 85 86 virtualisation.memorySize = 2048; 87 virtualisation.emptyDiskImages = [ 2048 ]; 88 }; 89 90 initiatorAuto = 91 { 92 nodes, 93 config, 94 pkgs, 95 ... 96 }: 97 { 98 services.openiscsi = { 99 enable = true; 100 enableAutoLoginOut = true; 101 discoverPortal = "target"; 102 name = initiatorName; 103 }; 104 105 environment.systemPackages = with pkgs; [ 106 xfsprogs 107 ]; 108 109 system.extraDependencies = [ nodes.initiatorRootDisk.system.build.toplevel ]; 110 111 nix.settings = { 112 substituters = lib.mkForce [ ]; 113 hashed-mirrors = null; 114 connect-timeout = 1; 115 }; 116 }; 117 118 initiatorRootDisk = 119 { 120 config, 121 pkgs, 122 modulesPath, 123 lib, 124 ... 125 }: 126 { 127 boot.loader.grub.enable = false; 128 boot.kernelParams = lib.mkOverride 5 ([ 129 "boot.shell_on_fail" 130 "console=tty1" 131 "ip=${config.networking.primaryIPAddress}:::255.255.255.0::eth1:none" 132 ]); 133 134 # defaults to true, puts some code in the initrd that tries to mount an overlayfs on /nix/store 135 virtualisation.writableStore = false; 136 137 fileSystems = lib.mkOverride 5 { 138 "/" = { 139 fsType = "xfs"; 140 device = "/dev/sda"; 141 options = [ "_netdev" ]; 142 }; 143 }; 144 145 boot.iscsi-initiator = { 146 discoverPortal = "target"; 147 name = initiatorName; 148 target = targetName; 149 }; 150 }; 151 }; 152 153 testScript = 154 { nodes, ... }: 155 '' 156 target.start() 157 target.wait_for_unit("iscsi-target.service") 158 159 initiatorAuto.start() 160 161 initiatorAuto.wait_for_unit("iscsid.service") 162 initiatorAuto.wait_for_unit("iscsi.service") 163 initiatorAuto.get_unit_info("iscsi") 164 165 initiatorAuto.succeed("set -x; while ! test -e /dev/sda; do sleep 1; done") 166 167 initiatorAuto.succeed("mkfs.xfs /dev/sda") 168 initiatorAuto.succeed("mkdir /mnt && mount /dev/sda /mnt") 169 initiatorAuto.succeed( 170 "nixos-install --no-bootloader --no-root-passwd --system ${nodes.initiatorRootDisk.config.system.build.toplevel}" 171 ) 172 initiatorAuto.succeed("umount /mnt && rmdir /mnt") 173 initiatorAuto.shutdown() 174 175 initiatorRootDisk.start() 176 initiatorRootDisk.wait_for_unit("multi-user.target") 177 initiatorRootDisk.wait_for_unit("iscsid") 178 initiatorRootDisk.succeed("touch test") 179 initiatorRootDisk.shutdown() 180 ''; 181 } 182)