at 18.03-beta 5.4 kB view raw
1import ./make-test.nix ({ pkgs, ...}: 2 3let 4 adminPrivateKey = pkgs.writeText "id_ed25519" '' 5 -----BEGIN OPENSSH PRIVATE KEY----- 6 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 7 QyNTUxOQAAACDu7qxYQAPdAU6RrhB3llk2N1v4PTwcVzcX1oX265uC3gAAAJBJiYxDSYmM 8 QwAAAAtzc2gtZWQyNTUxOQAAACDu7qxYQAPdAU6RrhB3llk2N1v4PTwcVzcX1oX265uC3g 9 AAAEDE1W6vMwSEUcF1r7Hyypm/+sCOoDmKZgPxi3WOa1mD2u7urFhAA90BTpGuEHeWWTY3 10 W/g9PBxXNxfWhfbrm4LeAAAACGJmb0BtaW5pAQIDBAU= 11 -----END OPENSSH PRIVATE KEY----- 12 ''; 13 14 adminPublicKey = '' 15 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO7urFhAA90BTpGuEHeWWTY3W/g9PBxXNxfWhfbrm4Le root@client 16 ''; 17 18 alicePrivateKey = pkgs.writeText "id_ed25519" '' 19 -----BEGIN OPENSSH PRIVATE KEY----- 20 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 21 QyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQAAAJAwVQ5VMFUO 22 VQAAAAtzc2gtZWQyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQ 23 AAAEB7lbfkkdkJoE+4TKHPdPQWBKLSx+J54Eg8DaTr+3KoSlt5a8eH8BYZYjoQhzXGVKKH 24 Je1pw1D0p7O2Vb9VTLzBAAAACGJmb0BtaW5pAQIDBAU= 25 -----END OPENSSH PRIVATE KEY----- 26 ''; 27 28 alicePublicKey = pkgs.writeText "id_ed25519.pub" '' 29 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFt5a8eH8BYZYjoQhzXGVKKHJe1pw1D0p7O2Vb9VTLzB alice@client 30 ''; 31 32 bobPrivateKey = pkgs.writeText "id_ed25519" '' 33 -----BEGIN OPENSSH PRIVATE KEY----- 34 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 35 QyNTUxOQAAACCWTaJ1D9Xjxy6759FvQ9oXTes1lmWBciXPkEeqTikBMAAAAJDQBmNV0AZj 36 VQAAAAtzc2gtZWQyNTUxOQAAACCWTaJ1D9Xjxy6759FvQ9oXTes1lmWBciXPkEeqTikBMA 37 AAAEDM1IYYFUwk/IVxauha9kuR6bbRtT3gZ6ZA0GLb9txb/pZNonUP1ePHLrvn0W9D2hdN 38 6zWWZYFyJc+QR6pOKQEwAAAACGJmb0BtaW5pAQIDBAU= 39 -----END OPENSSH PRIVATE KEY----- 40 ''; 41 42 bobPublicKey = pkgs.writeText "id_ed25519.pub" '' 43 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJZNonUP1ePHLrvn0W9D2hdN6zWWZYFyJc+QR6pOKQEw bob@client 44 ''; 45 46 gitoliteAdminConfSnippet = '' 47 repo alice-project 48 RW+ = alice 49 ''; 50in 51{ 52 name = "gitolite"; 53 54 meta = with pkgs.stdenv.lib.maintainers; { 55 maintainers = [ bjornfor ]; 56 }; 57 58 nodes = { 59 60 server = 61 { config, pkgs, lib, ... }: 62 { 63 services.gitolite = { 64 enable = true; 65 adminPubkey = adminPublicKey; 66 }; 67 services.openssh.enable = true; 68 }; 69 70 client = 71 { config, pkgs, lib, ... }: 72 { 73 environment.systemPackages = [ pkgs.git ]; 74 programs.ssh.extraConfig = '' 75 Host * 76 UserKnownHostsFile /dev/null 77 StrictHostKeyChecking no 78 # there's nobody around that can input password 79 PreferredAuthentications publickey 80 ''; 81 users.extraUsers.alice = { isNormalUser = true; }; 82 users.extraUsers.bob = { isNormalUser = true; }; 83 }; 84 85 }; 86 87 testScript = '' 88 startAll; 89 90 subtest "can setup ssh keys on system", sub { 91 $client->mustSucceed("mkdir -p ~root/.ssh"); 92 $client->mustSucceed("cp ${adminPrivateKey} ~root/.ssh/id_ed25519"); 93 $client->mustSucceed("chmod 600 ~root/.ssh/id_ed25519"); 94 95 $client->mustSucceed("sudo -u alice mkdir -p ~alice/.ssh"); 96 $client->mustSucceed("sudo -u alice cp ${alicePrivateKey} ~alice/.ssh/id_ed25519"); 97 $client->mustSucceed("sudo -u alice chmod 600 ~alice/.ssh/id_ed25519"); 98 99 $client->mustSucceed("sudo -u bob mkdir -p ~bob/.ssh"); 100 $client->mustSucceed("sudo -u bob cp ${bobPrivateKey} ~bob/.ssh/id_ed25519"); 101 $client->mustSucceed("sudo -u bob chmod 600 ~bob/.ssh/id_ed25519"); 102 }; 103 104 subtest "gitolite server starts", sub { 105 $server->waitForUnit("gitolite-init.service"); 106 $server->waitForUnit("sshd.service"); 107 $client->mustSucceed('ssh gitolite@server info'); 108 }; 109 110 subtest "admin can clone and configure gitolite-admin.git", sub { 111 $client->mustSucceed('git clone gitolite@server:gitolite-admin.git'); 112 $client->mustSucceed("git config --global user.name 'System Administrator'"); 113 $client->mustSucceed("git config --global user.email root\@domain.example"); 114 $client->mustSucceed("cp ${alicePublicKey} gitolite-admin/keydir/alice.pub"); 115 $client->mustSucceed("cp ${bobPublicKey} gitolite-admin/keydir/bob.pub"); 116 $client->mustSucceed('(cd gitolite-admin && git add . && git commit -m "Add keys for alice, bob" && git push)'); 117 $client->mustSucceed("printf '${gitoliteAdminConfSnippet}' >> gitolite-admin/conf/gitolite.conf"); 118 $client->mustSucceed('(cd gitolite-admin && git add . && git commit -m "Add repo for alice" && git push)'); 119 }; 120 121 subtest "non-admins cannot clone gitolite-admin.git", sub { 122 $client->mustFail('sudo -i -u alice git clone gitolite@server:gitolite-admin.git'); 123 $client->mustFail('sudo -i -u bob git clone gitolite@server:gitolite-admin.git'); 124 }; 125 126 subtest "non-admins can clone testing.git", sub { 127 $client->mustSucceed('sudo -i -u alice git clone gitolite@server:testing.git'); 128 $client->mustSucceed('sudo -i -u bob git clone gitolite@server:testing.git'); 129 }; 130 131 subtest "alice can clone alice-project.git", sub { 132 $client->mustSucceed('sudo -i -u alice git clone gitolite@server:alice-project.git'); 133 }; 134 135 subtest "bob cannot clone alice-project.git", sub { 136 $client->mustFail('sudo -i -u bob git clone gitolite@server:alice-project.git'); 137 }; 138 ''; 139})