summaryrefslogtreecommitdiffstats
path: root/default.nix
blob: a76efdd06e1f6296028998afb2d99147e3bd5752 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
{ channel ? "stable", pkgs ? import <nixpkgs> {} }:

let
  helloService  = pkgs.callPackage ./service-hello {};
  worldService  = pkgs.callPackage ./service-world {};
  joinerService = pkgs.callPackage ./service-joiner {};
  kubenix       = pkgs.callPackage ./nix/kubenix.nix {};

  buildConfig = t: kubenix.buildResources { configuration = import ./configuration.nix { type = t; }; };

  helloImage = pkgs.dockerTools.buildLayeredImage {
    name = "hello-service";
    tag = "latest";
    config.Cmd = [ "${helloService}/bin/service-hello" ];
  };

  worldImage = pkgs.dockerTools.buildLayeredImage {
    name = "world-service";
    tag = "latest";
    config.Cmd = [ "${worldService}/bin/service-world" ];
  };

  joinerImage = pkgs.dockerTools.buildLayeredImage {
    name = "joiner-service";
    tag = "latest";
    config.Cmd = [ "${joinerService}/bin/service-joiner" ];
  };
in rec {
  inherit helloImage worldImage joinerImage;

  test-deployment = pkgs.callPackage ./nix/test-deployment.nix { };

  deploy-to-kind = pkgs.callPackage ./nix/deploy-to-kind.nix {
    inherit helloImage worldImage joinerImage;

    config = buildConfig "dev";
  };

  config = buildConfig "dev";

  redeploy = pkgs.writeScriptBin "redeploy" ''
    cat ${config} | ${pkgs.kubectl}/bin/kubectl apply -f -
  '';

  deploy-and-test = pkgs.mkShell {
    buildInputs = [ pkgs.kind deploy-to-kind test-deployment ];

    shellHook = ''
      deploy-to-kind
      export KUBECONFIG=$(kind get kubeconfig-path)
      wait-for-deployment hello
      test-deployment
      kind delete cluster
    '';
  };

  postgresDb = "helloworlddb";
  postgresUser = "helloworlduser";
  postgresPassword = "asdfghjkl";

  postgresContainerName = "helloworld-dev-db";

  run-dev-postgres-container = pkgs.writeScriptBin "run-dev-postgres-container" ''
    ${pkgs.docker}/bin/docker run \
      --name ${postgresContainerName} \
      -e POSTGRES_PASSWORD="${postgresPassword}" \
      -p 5432:5432 \
      -m 512m \
      -d \
      --rm \
      postgres

    sleep 2 # because postgres needs to spin up
    docker exec -it ${postgresContainerName} psql -U postgres -c "CREATE USER ${postgresUser} PASSWORD '${postgresPassword}' SUPERUSER CREATEDB INHERIT LOGIN"
    docker exec -it ${postgresContainerName} createdb -U postgres ${postgresDb}
  '';

  destroy-dev-postgres-container = pkgs.writeScriptBin "destroy-dev-postgres-container" ''
    docker stop ${postgresContainerName}
  '';

  shell = let
    moz_overlay = import (
      builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz
    );

    pkgs = import <nixpkgs> { overlays = [ moz_overlay ]; };
    rustchannel = pkgs.rustChannelOf { inherit channel; };
  in
  pkgs.mkShell {
    buildInputs = with pkgs; [
      kind
      deploy-to-kind
      test-deployment
      redeploy
      run-dev-postgres-container
      destroy-dev-postgres-container
      curl
      docker
      kubectl
      diesel-cli

      rustchannel.rust-std
      rustchannel.rust
      rustchannel.rustc
      rustchannel.cargo

      cmake
      curl
      gcc
      openssl
      pkgconfig
      postgresql
    ];

    POSTGRES_PASSWORD = "${postgresPassword}";
    DATABASE_URL="postgres://${postgresUser}:${postgresPassword}@localhost/${postgresDb}";

    LIBCLANG_PATH = "${pkgs.llvmPackages.libclang}/lib";
  };

}