162 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| import ./make-test-python.nix (
 | |
|   { pkgs, lib, ... }:
 | |
|     let
 | |
|       initiatorName = "iqn.2020-08.org.linux-iscsi.initiatorhost:example";
 | |
|       targetName = "iqn.2003-01.org.linux-iscsi.target.x8664:sn.acf8fd9c23af";
 | |
|     in
 | |
|       {
 | |
|         name = "iscsi";
 | |
|         meta = {
 | |
|           maintainers = pkgs.lib.teams.deshaw.members
 | |
|           ++ (with pkgs.lib.maintainers; [ ajs124 ]);
 | |
|         };
 | |
| 
 | |
|         nodes = {
 | |
|           target = { config, pkgs, lib, ... }: {
 | |
|             services.target = {
 | |
|               enable = true;
 | |
|               config = {
 | |
|                 fabric_modules = [];
 | |
|                 storage_objects = [
 | |
|                   {
 | |
|                     dev = "/dev/vdb";
 | |
|                     name = "test";
 | |
|                     plugin = "block";
 | |
|                     write_back = true;
 | |
|                     wwn = "92b17c3f-6b40-4168-b082-ceeb7b495522";
 | |
|                   }
 | |
|                 ];
 | |
|                 targets = [
 | |
|                   {
 | |
|                     fabric = "iscsi";
 | |
|                     tpgs = [
 | |
|                       {
 | |
|                         enable = true;
 | |
|                         attributes = {
 | |
|                           authentication = 0;
 | |
|                           generate_node_acls = 1;
 | |
|                         };
 | |
|                         luns = [
 | |
|                           {
 | |
|                             alias = "94dfe06967";
 | |
|                             alua_tg_pt_gp_name = "default_tg_pt_gp";
 | |
|                             index = 0;
 | |
|                             storage_object = "/backstores/block/test";
 | |
|                           }
 | |
|                         ];
 | |
|                         node_acls = [
 | |
|                           {
 | |
|                             mapped_luns = [
 | |
|                               {
 | |
|                                 alias = "d42f5bdf8a";
 | |
|                                 index = 0;
 | |
|                                 tpg_lun = 0;
 | |
|                                 write_protect = false;
 | |
|                               }
 | |
|                             ];
 | |
|                             node_wwn = initiatorName;
 | |
|                           }
 | |
|                         ];
 | |
|                         portals = [
 | |
|                           {
 | |
|                             ip_address = "0.0.0.0";
 | |
|                             iser = false;
 | |
|                             offload = false;
 | |
|                             port = 3260;
 | |
|                           }
 | |
|                         ];
 | |
|                         tag = 1;
 | |
|                       }
 | |
|                     ];
 | |
|                     wwn = targetName;
 | |
|                   }
 | |
|                 ];
 | |
|               };
 | |
|             };
 | |
| 
 | |
|             networking.firewall.allowedTCPPorts = [ 3260 ];
 | |
|             networking.firewall.allowedUDPPorts = [ 3260 ];
 | |
| 
 | |
|             virtualisation.memorySize = 2048;
 | |
|             virtualisation.emptyDiskImages = [ 2048 ];
 | |
|           };
 | |
| 
 | |
|           initiatorAuto = { nodes, config, pkgs, ... }: {
 | |
|             services.openiscsi = {
 | |
|               enable = true;
 | |
|               enableAutoLoginOut = true;
 | |
|               discoverPortal = "target";
 | |
|               name = initiatorName;
 | |
|             };
 | |
| 
 | |
|             environment.systemPackages = with pkgs; [
 | |
|               xfsprogs
 | |
|             ];
 | |
| 
 | |
|             system.extraDependencies = [ nodes.initiatorRootDisk.config.system.build.toplevel ];
 | |
| 
 | |
|             nix.binaryCaches = lib.mkForce [];
 | |
|             nix.extraOptions = ''
 | |
|               hashed-mirrors =
 | |
|               connect-timeout = 1
 | |
|             '';
 | |
|           };
 | |
| 
 | |
|           initiatorRootDisk = { config, pkgs, modulesPath, lib, ... }: {
 | |
|             boot.loader.grub.enable = false;
 | |
|             boot.kernelParams = lib.mkOverride 5 (
 | |
|               [
 | |
|                 "boot.shell_on_fail"
 | |
|                 "console=tty1"
 | |
|                 "ip=${config.networking.primaryIPAddress}:::255.255.255.0::ens9:none"
 | |
|               ]
 | |
|             );
 | |
| 
 | |
|             # defaults to true, puts some code in the initrd that tries to mount an overlayfs on /nix/store
 | |
|             virtualisation.writableStore = false;
 | |
| 
 | |
|             fileSystems = lib.mkOverride 5 {
 | |
|               "/" = {
 | |
|                 fsType = "xfs";
 | |
|                 device = "/dev/sda";
 | |
|                 options = [ "_netdev" ];
 | |
|               };
 | |
|             };
 | |
| 
 | |
|             boot.iscsi-initiator = {
 | |
|               discoverPortal = "target";
 | |
|               name = initiatorName;
 | |
|               target = targetName;
 | |
|             };
 | |
|           };
 | |
|         };
 | |
| 
 | |
|         testScript = { nodes, ... }: ''
 | |
|           target.start()
 | |
|           target.wait_for_unit("iscsi-target.service")
 | |
| 
 | |
|           initiatorAuto.start()
 | |
| 
 | |
|           initiatorAuto.wait_for_unit("iscsid.service")
 | |
|           initiatorAuto.wait_for_unit("iscsi.service")
 | |
|           initiatorAuto.get_unit_info("iscsi")
 | |
| 
 | |
|           initiatorAuto.succeed("set -x; while ! test -e /dev/sda; do sleep 1; done")
 | |
| 
 | |
|           initiatorAuto.succeed("mkfs.xfs /dev/sda")
 | |
|           initiatorAuto.succeed("mkdir /mnt && mount /dev/sda /mnt")
 | |
|           initiatorAuto.succeed(
 | |
|               "nixos-install --no-bootloader --no-root-passwd --system ${nodes.initiatorRootDisk.config.system.build.toplevel}"
 | |
|           )
 | |
|           initiatorAuto.succeed("umount /mnt && rmdir /mnt")
 | |
|           initiatorAuto.shutdown()
 | |
| 
 | |
|           initiatorRootDisk.start()
 | |
|           initiatorRootDisk.wait_for_unit("multi-user.target")
 | |
|           initiatorRootDisk.wait_for_unit("iscsid")
 | |
|           initiatorRootDisk.succeed("touch test")
 | |
|           initiatorRootDisk.shutdown()
 | |
|         '';
 | |
|       }
 | |
| )
 | 
