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()
 | 
						|
        '';
 | 
						|
      }
 | 
						|
)
 |