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