summaryrefslogtreecommitdiffstats
path: root/default.nix
blob: e1406970fc67fe4679b65b9d7c81cee08e273dfd (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
123
124
125
126
127
128
129
130
{ channel ? "stable", pkgs ? import <nixpkgs> {} }:

let
  helloService  = pkgs.callPackage ./service-hello {};
  worldService  = pkgs.callPackage ./service-world {};
  joinerService = pkgs.callPackage ./service-joiner {};
  personApiTypes = pkgs.callPackage ./person-api-types {};
  personService = pkgs.callPackage ./service-person { inherit personApiTypes; };
  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" ];
  };

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

  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";
  };

}