@@ -3,9 +3,11 @@ package main
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "encoding/json"
6
7
"fmt"
7
8
"log"
8
9
"math/rand"
10
+ "os"
9
11
"os/exec"
10
12
"strings"
11
13
"time"
@@ -20,10 +22,10 @@ func run(ctx context.Context, command string) error {
20
22
cmd .Stdout = & out
21
23
cmd .Stderr = & out
22
24
if err := cmd .Run (); err != nil {
23
- fmt .Printf ("ERROR. Command %s . Error: %v. Output:\n %s\n " , command , err , out .String ())
25
+ fmt .Printf ("ERROR. Command %q . Error: %v. Output:\n %s\n " , command , err , out .String ())
24
26
return err
25
27
}
26
- fmt .Printf ("Command %s . Output:\n %s\n " , command , out .String ())
28
+ fmt .Printf ("Command %q . Output:\n %s\n " , command , out .String ())
27
29
return nil
28
30
}
29
31
@@ -49,65 +51,138 @@ func increment(atLeast int) error {
49
51
return err
50
52
}
51
53
}
52
- fmt . Printf ( "Time taken to converge %d: %s \n " ,
53
- atLeast , time . Since ( start ). Round ( time . Millisecond ) )
54
+ dur := time . Since ( start ). Round ( time . Millisecond )
55
+ fmt . Printf ( " \n ===> TIME taken to converge %d alphas: %s \n \n " , atLeast , dur )
54
56
return nil
55
57
}
56
58
57
- func testPartitions () error {
59
+ func getStatus (zero string ) error {
60
+ cmd := exec .Command ("http" , "GET" , fmt .Sprintf ("%s/state" , zero ))
61
+ var out bytes.Buffer
62
+ cmd .Stdout = & out
63
+ cmd .Stderr = & out
64
+ if err := cmd .Run (); err != nil {
65
+ fmt .Printf ("ERROR. Status at %s. Error: %v. Output:\n %s\n " , zero , err , out .String ())
66
+ return err
67
+ }
68
+ output := out .String ()
69
+ if strings .Contains (output , "errors" ) {
70
+ fmt .Printf ("ERROR. Status at %s. Output:\n %s\n " , zero , output )
71
+ return fmt .Errorf (output )
72
+ }
73
+ var m map [string ]interface {}
74
+ if err := json .Unmarshal ([]byte (output ), & m ); err != nil {
75
+ return err
76
+ }
77
+ pretty , err := json .MarshalIndent (m , "" , " " )
78
+ if err != nil {
79
+ return err
80
+ }
81
+ fmt .Printf ("Status at %s:\n %s\n " , zero , pretty )
82
+ return nil
83
+ }
84
+
85
+ func testCommon (remove , join string , minAlphasUp int ) error {
58
86
var nodes []string
59
87
for i := 1 ; i <= 3 ; i ++ {
60
88
for j := 1 ; j <= 3 ; j ++ {
61
89
nodes = append (nodes , fmt .Sprintf ("zero%d dg%d" , i , j ))
62
90
}
63
91
}
64
92
65
- fmt .Printf ("Nodes: %v\n " , nodes )
93
+ fmt .Printf ("Nodes: %+ v\n " , nodes )
66
94
for _ , node := range nodes {
67
- // First partition.
68
- if err := run (ctxb , "http GET localhost:6080/state" ); err != nil {
95
+ if err := getStatus ("localhost:6080" ); err != nil {
69
96
return err
70
97
}
71
- fmt .Printf ("\n ==> Partitioning NODE : %s\n " , node )
72
- if err := partition ( node ); err != nil {
98
+ fmt .Printf ("\n ==> Remove cmd %q on NODES : %s\n " , remove , node )
99
+ if err := run ( ctxb , remove + " " + node ); err != nil {
73
100
return err
74
101
}
75
102
if err := run (ctxb , "blockade status" ); err != nil {
76
103
return err
77
104
}
78
- if err := increment (2 ); err != nil {
105
+ if err := increment (minAlphasUp ); err != nil {
79
106
return err
80
107
}
81
108
// Then join.
82
- if err := run (ctxb , "blockade join" ); err != nil {
109
+ if err := run (ctxb , join ); err != nil {
83
110
return err
84
111
}
85
112
if err := increment (3 ); err != nil {
86
113
return err
87
114
}
88
115
}
89
- fmt .Println ("testPartitions: OK" )
90
116
return nil
91
117
}
92
118
93
- func main () {
94
- rand .Seed (time .Now ().UnixNano ())
95
- fmt .Println ("Starting blockade" )
96
- if err := run (ctxb , "blockade up" ); err != nil {
97
- log .Fatal (err )
119
+ func waitForHealthy () error {
120
+ for _ , zero := range []string {"localhost:6080" , "localhost:6082" , "localhost:6083" } {
121
+ if err := getStatus (zero ); err != nil {
122
+ return err
123
+ }
124
+ }
125
+ for _ , alpha := range []string {"localhost:9180" , "localhost:9182" , "localhost:9183" } {
126
+ if err := run (ctxb , "increment --addr=" + alpha ); err != nil {
127
+ return err
128
+ }
98
129
}
130
+ return nil
131
+ }
99
132
133
+ func runTests () error {
100
134
defer func () {
101
135
if err := run (ctxb , "blockade destroy" ); err != nil {
102
136
log .Fatalf ("While destroying: %v" , err )
103
137
}
104
138
}()
105
- if err := run (ctxb ,
106
- "increment --addr=localhost:9180" ); err != nil {
107
- fmt .Printf ("Error during increment: %v\n " , err )
139
+
140
+ for {
141
+ if err := waitForHealthy (); err != nil {
142
+ fmt .Printf ("Error while waitForHealthy: %v\n ." , err )
143
+ time .Sleep (5 * time .Second )
144
+ fmt .Println ("Retrying..." )
145
+ } else {
146
+ break
147
+ }
148
+ }
149
+
150
+ // Setting flaky --all just does not converge. Too many network interruptions.
151
+ if err := testCommon ("blockade flaky" , "blockade fast --all" , 3 ); err != nil {
152
+ fmt .Printf ("Error testFlaky: %v\n " , err )
153
+ return err
154
+ }
155
+ fmt .Println ("===> Flaky TEST: OK" )
156
+
157
+ if err := testCommon ("blockade slow" , "blockade fast --all" , 3 ); err != nil {
158
+ fmt .Printf ("Error testSlow: %v\n " , err )
159
+ return err
160
+ }
161
+ fmt .Println ("===> Slow TEST: OK" )
162
+
163
+ if err := testCommon ("blockade stop" , "blockade start --all" , 2 ); err != nil {
164
+ fmt .Printf ("Error testRestart: %v\n " , err )
165
+ return err
108
166
}
167
+ fmt .Println ("===> Restart TEST: OK" )
109
168
110
- if err := testPartitions ( ); err != nil {
169
+ if err := testCommon ( "blockade partition" , "blockade join" , 2 ); err != nil {
111
170
fmt .Printf ("Error testPartitions: %v\n " , err )
171
+ return err
172
+ }
173
+ fmt .Println ("===> Partition TEST: OK" )
174
+
175
+ return nil
176
+ }
177
+
178
+ func main () {
179
+ rand .Seed (time .Now ().UnixNano ())
180
+ fmt .Println ("Starting blockade" )
181
+ if err := run (ctxb , "blockade up" ); err != nil {
182
+ log .Fatal (err )
183
+ }
184
+ if err := runTests (); err != nil {
185
+ os .Exit (1 )
112
186
}
187
+ fmt .Println ("Blockade tests: OK" )
113
188
}
0 commit comments