1# This test runs etcd as single node, multy node and using discovery
2
3import ./make-test.nix ({ pkgs, ... } : {
4 name = "etcd";
5 meta = with pkgs.stdenv.lib.maintainers; {
6 maintainers = [ offline ];
7 };
8
9 nodes = {
10 simple =
11 { config, pkgs, nodes, ... }:
12 {
13 services.etcd.enable = true;
14 services.etcd.listenClientUrls = ["http://0.0.0.0:4001"];
15 environment.systemPackages = [ pkgs.curl ];
16 networking.firewall.allowedTCPPorts = [ 4001 ];
17 };
18
19
20 node1 =
21 { config, pkgs, nodes, ... }:
22 {
23 services = {
24 etcd = {
25 enable = true;
26 listenPeerUrls = ["http://0.0.0.0:7001"];
27 initialAdvertisePeerUrls = ["http://node1:7001"];
28 initialCluster = ["node1=http://node1:7001" "node2=http://node2:7001"];
29 };
30 };
31
32 networking.firewall.allowedTCPPorts = [ 7001 ];
33 };
34
35 node2 =
36 { config, pkgs, ... }:
37 {
38 services = {
39 etcd = {
40 enable = true;
41 listenPeerUrls = ["http://0.0.0.0:7001"];
42 initialAdvertisePeerUrls = ["http://node2:7001"];
43 initialCluster = ["node1=http://node1:7001" "node2=http://node2:7001"];
44 };
45 };
46
47 networking.firewall.allowedTCPPorts = [ 7001 ];
48 };
49
50 discovery1 =
51 { config, pkgs, nodes, ... }:
52 {
53 services = {
54 etcd = {
55 enable = true;
56 listenPeerUrls = ["http://0.0.0.0:7001"];
57 initialAdvertisePeerUrls = ["http://discovery1:7001"];
58 discovery = "http://simple:4001/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/";
59 };
60 };
61
62 networking.firewall.allowedTCPPorts = [ 7001 ];
63 };
64
65 discovery2 =
66 { config, pkgs, ... }:
67 {
68 services = {
69 etcd = {
70 enable = true;
71 listenPeerUrls = ["http://0.0.0.0:7001"];
72 initialAdvertisePeerUrls = ["http://discovery2:7001"];
73 discovery = "http://simple:4001/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/";
74 };
75 };
76
77 networking.firewall.allowedTCPPorts = [ 7001 ];
78 };
79 };
80
81 testScript = ''
82 subtest "single node", sub {
83 $simple->start();
84 $simple->waitForUnit("etcd.service");
85 $simple->waitUntilSucceeds("etcdctl set /foo/bar 'Hello world'");
86 $simple->waitUntilSucceeds("etcdctl get /foo/bar | grep 'Hello world'");
87 };
88
89 subtest "multy node", sub {
90 $node1->start();
91 $node2->start();
92 $node1->waitForUnit("etcd.service");
93 $node2->waitForUnit("etcd.service");
94 $node1->waitUntilSucceeds("etcdctl set /foo/bar 'Hello world'");
95 $node2->waitUntilSucceeds("etcdctl get /foo/bar | grep 'Hello world'");
96 $node1->shutdown();
97 $node2->shutdown();
98 };
99
100 subtest "discovery", sub {
101 $simple->succeed("curl -X PUT http://localhost:4001/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=2");
102
103 $discovery1->start();
104 $discovery2->start();
105 $discovery1->waitForUnit("etcd.service");
106 $discovery2->waitForUnit("etcd.service");
107 $discovery1->waitUntilSucceeds("etcdctl set /foo/bar 'Hello world'");
108 $discovery2->waitUntilSucceeds("etcdctl get /foo/bar | grep 'Hello world'");
109 };
110 '';
111})