Deployment and lifecycle management for Nix
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

services: successful e2e test run

+110 -13
+7 -7
cmd/client/services.go
··· 104 104 if err != nil { 105 105 return fmt.Errorf("unable to create fake old profile: %v", err) 106 106 } 107 - err = os.Mkdir(filepath.Join(oldProfile, "systemd"), 0700) 107 + err = os.MkdirAll(filepath.Join(oldProfile, "systemd", "system"), 0755) 108 108 if err != nil { 109 109 return fmt.Errorf("failed to create fake systemd dir: %v", err) 110 110 } ··· 120 120 return nil 121 121 } 122 122 123 - oldUnits := filepath.Join(oldProfile, "systemd") 124 - newUnits := filepath.Join(storePath, "systemd") 123 + oldUnits := filepath.Join(oldProfile, "systemd", "system") 124 + newUnits := filepath.Join(storePath, "systemd", "system") 125 125 126 - err = commands.SimpleRun(exec.Command("sd-switch", "--verbose", "--system", "--old-units", oldUnits, "--new-units", newUnits)) 126 + err = setProfile(profile, storePath) 127 127 if err != nil { 128 - return fmt.Errorf("failed to run sd-switch: %v", err) 128 + return fmt.Errorf("failed to set services profile: %v", err) 129 129 } 130 130 131 - err = setProfile(profile, storePath) 131 + err = commands.SimpleRun(exec.Command("sd-switch", "--verbose", "--system", "--old-units", oldUnits, "--new-units", newUnits)) 132 132 if err != nil { 133 - return fmt.Errorf("failed to set services profile: %v", err) 133 + return fmt.Errorf("failed to run sd-switch: %v", err) 134 134 } 135 135 136 136 return nil
+13 -2
nix/nixos/client.nix
··· 56 56 default = "nixos"; 57 57 }; 58 58 }; 59 + 60 + services.services = lib.mkOption { 61 + type = lib.types.listOf lib.types.str; 62 + description = "services to be managed by client"; 63 + default = [ ]; 64 + }; 59 65 }; 60 66 }; 61 67 description = "Sower configuration file"; ··· 65 71 }; 66 72 67 73 config = lib.mkIf cfg.enable { 68 - boot.extraSystemdUnitPaths = [ 69 - "/etc/sower/systemd" 74 + boot.extraSystemdUnitPaths = lib.optionals (cfg.settings.services.services != [ ]) [ 75 + "/etc/sower/systemd/system" 70 76 ]; 71 77 72 78 environment.etc."sower/client.json".source = lib.mkIf (cfg.settings != null) ( ··· 104 110 Persistent = true; 105 111 }; 106 112 }; 113 + 114 + systemd.tmpfiles.rules = lib.optionals (cfg.settings.services.services != [ ]) [ 115 + "d /etc/sower 0755 root root" 116 + "L /etc/sower/systemd - - - - /nix/var/nix/profiles/sower/services-units/systemd" 117 + ]; 107 118 }; 108 119 }
+9 -1
nix/packages/client.nix
··· 1 1 { 2 2 lib, 3 3 buildGoModule, 4 + makeWrapper, 5 + sd-switch, 4 6 version, 5 7 }: 6 8 let ··· 8 10 in 9 11 10 12 buildGoModule rec { 11 - pname = "sower"; 13 + pname = "sower-client"; 12 14 inherit version; 13 15 14 16 src = ··· 24 26 ]; 25 27 }; 26 28 29 + nativeBuildInputs = [ 30 + makeWrapper 31 + ]; 32 + 27 33 env.CGO_ENABLED = 0; 28 34 29 35 ldflags = [ ··· 33 39 34 40 postInstall = '' 35 41 mv $out/bin/client $out/bin/sower 42 + 43 + wrapProgram $out/bin/sower --prefix PATH : ${lib.makeBinPath [ sd-switch ]} 36 44 ''; 37 45 38 46 # disable checks for now until better fleshed out
+1 -1
nix/packages/server.nix
··· 17 17 os = if stdenv.isDarwin then "darwin" else "linux"; 18 18 in 19 19 beamPackages.mixRelease rec { 20 - pname = "sower"; 20 + pname = "sower-server"; 21 21 inherit version; 22 22 23 23 inherit elixir;
+36 -2
nix/tests/e2e.nix
··· 8 8 pkgs, 9 9 testers, 10 10 }: 11 + let 12 + simple-service = flake.packages.${pkgs.system}.tests-simple-service; 13 + in 11 14 testers.runNixOSTest { 12 15 name = "sower"; 13 16 14 17 nodes = { 15 18 server = 16 - { lib, pkgs, ... }: 17 19 { 18 - imports = [ ../nixos/module.nix ]; 20 + lib, 21 + pkgs, 22 + ... 23 + }: 24 + { 25 + imports = [ 26 + ../nixos/module.nix 27 + 28 + # service building needs a channel 29 + "${flake.inputs.nixpkgs}/nixos/modules/installer/cd-dvd/channel.nix" 30 + ]; 19 31 20 32 config = { 21 33 # need switch-to-configuration ··· 23 35 # without trying to install grub 24 36 boot.loader.grub.enable = false; 25 37 38 + # expose more paths to test vm 39 + virtualisation.additionalPaths = [ 40 + simple-service 41 + 42 + # service building needs a stdenv 43 + pkgs.stdenv 44 + pkgs.stdenv.bootstrapTools 45 + ]; 46 + 26 47 environment.systemPackages = [ 27 48 flake.packages.${pkgs.system}.seed-ci 49 + 28 50 ]; 29 51 30 52 networking.firewall.allowedTCPPorts = [ 4000 ]; ··· 32 54 nix.settings = { 33 55 experimental-features = "flakes nix-command"; 34 56 substituters = lib.mkForce [ ]; 57 + hashed-mirrors = null; 58 + connect-timeout = 1; 35 59 }; 36 60 37 61 services.sower.client = { ··· 42 66 api-token-file = "/run/sower/test_token"; 43 67 debug = true; 44 68 endpoint = "http://localhost:4000"; 69 + 70 + services.services = [ 71 + "simple-service" 72 + ]; 45 73 }; 46 74 }; 47 75 ··· 110 138 server.succeed(f"sower seed submit --create --name client --type nixos --path {client_profile} --debug") 111 139 token = server.succeed("cat /run/sower/test_token") 112 140 client.succeed(f"curl http://server:4000/client/bootstrap | bash -s seed info --api-token {token} --name client --type nixos") 141 + 142 + with subtest("client can manage services"): 143 + server.succeed("sower seed submit --create --name simple-service --type service --path ${simple-service} --debug") 144 + server.succeed("sower services upgrade --debug") 145 + server.wait_for_unit("simple-oneshot.service") 146 + server.wait_for_unit("simple-sleep.service") 113 147 ''; 114 148 }
+44
nix/tests/simple-service.nix
··· 1 + { 2 + bash, 3 + lib, 4 + pkgs, 5 + runCommand, 6 + sowerLib, 7 + sowerServicesHook, 8 + }: 9 + runCommand "simple-service" 10 + { 11 + nativeBuildInputs = [ sowerServicesHook ]; 12 + 13 + sowerServices = sowerLib.generateUnitFiles { 14 + inherit pkgs; 15 + config = { 16 + services.simple-oneshot = { 17 + wantedBy = [ 18 + "multi-user.target" 19 + ]; 20 + 21 + serviceConfig = { 22 + Type = "oneshot"; 23 + ExecStart = "${pkgs.coreutils}/bin/true"; 24 + RemainAfterExit = true; 25 + }; 26 + }; 27 + 28 + services.simple-sleep = { 29 + wantedBy = [ 30 + "multi-user.target" 31 + ]; 32 + 33 + script = '' 34 + #!${lib.getExe bash} 35 + sleep 86400 36 + ''; 37 + }; 38 + }; 39 + }; 40 + } 41 + '' 42 + mkdir $out 43 + _sowerServicesHook 44 + ''