Skip to content
This repository was archived by the owner on Jan 30, 2020. It is now read-only.

Commit 8c7d302

Browse files
author
Dongsu Park
committed
functional: retrieve stdout/stderr after running command
Make every call cluster.Fleetctl() (or run()) return both stdout and stderr, to get them included in the result error buffer. We need to do this to make sure that every potential error message is printed out. This change will help us investigate occasional failures in functional tests.
1 parent 0953a0d commit 8c7d302

File tree

10 files changed

+98
-87
lines changed

10 files changed

+98
-87
lines changed

functional/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ func TestKnownHostsVerification(t *testing.T) {
6666
}
6767

6868
// SSH'ing to the cluster member should now fail with a host key mismatch
69-
if _, _, err := cluster.Fleetctl(m0, "--strict-host-key-checking=true", fmt.Sprintf("--known-hosts-file=%s", khFile), "ssh", m1.ID(), "uptime"); err == nil {
70-
t.Errorf("Expected error while SSH'ing to fleet machine")
69+
if stdout, stderr, err := cluster.Fleetctl(m0, "--strict-host-key-checking=true", fmt.Sprintf("--known-hosts-file=%s", khFile), "ssh", m1.ID(), "uptime"); err == nil {
70+
t.Errorf("Expected error while SSH'ing to fleet machine\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
7171
}
7272

7373
// Overwrite the known-hosts file to simulate removing the old host key

functional/cluster_test.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ func TestDynamicClusterNewMemberUnitMigration(t *testing.T) {
5353

5454
// All 3 services should be visible immediately, and all of them should
5555
// become ACTIVE shortly thereafter
56-
stdout, _, err = cluster.Fleetctl(m0, "list-units", "--no-legend")
56+
stdout, stderr, err = cluster.Fleetctl(m0, "list-units", "--no-legend")
5757
if err != nil {
58-
t.Fatalf("Failed to run list-units: %v", err)
58+
t.Fatalf("Failed to run list-units:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
5959
}
6060
units := strings.Split(strings.TrimSpace(stdout), "\n")
6161
if len(units) != 3 {
@@ -75,8 +75,10 @@ func TestDynamicClusterNewMemberUnitMigration(t *testing.T) {
7575
// Kill one of the machines and make sure the unit migrates somewhere else
7676
unit := "conflict.1.service"
7777
oldMach := states[unit].Machine
78-
if _, _, err = cluster.Fleetctl(m0, "--strict-host-key-checking=false", "ssh", oldMach, "sudo", "systemctl", "stop", "fleet"); err != nil {
79-
t.Fatal(err)
78+
stdout, stderr, err = cluster.Fleetctl(m0, "--strict-host-key-checking=false", "ssh", oldMach,
79+
"sudo", "systemctl", "stop", "fleet")
80+
if err != nil {
81+
t.Fatalf("Failed to stop fleet service:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
8082
}
8183
var mN platform.Member
8284
if m0.ID() == oldMach {
@@ -131,20 +133,20 @@ func TestDynamicClusterMemberReboot(t *testing.T) {
131133
t.Fatal(err)
132134
}
133135

134-
_, _, err = cluster.Fleetctl(m0, "start",
136+
stdout, stderr, err := cluster.Fleetctl(m0, "start",
135137
"fixtures/units/conflict.0.service",
136138
"fixtures/units/conflict.1.service",
137139
"fixtures/units/conflict.2.service",
138140
)
139141
if err != nil {
140-
t.Errorf("Failed starting units: %v", err)
142+
t.Errorf("Failed starting units:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
141143
}
142144

143145
// All 3 services should be visible immediately, and all of them should
144146
// become ACTIVE shortly thereafter
145-
stdout, _, err := cluster.Fleetctl(m0, "list-units", "--no-legend")
147+
stdout, stderr, err = cluster.Fleetctl(m0, "list-units", "--no-legend")
146148
if err != nil {
147-
t.Fatalf("Failed to run list-units: %v", err)
149+
t.Fatalf("Failed to run list-units:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
148150
}
149151
units := strings.Split(strings.TrimSpace(stdout), "\n")
150152
if len(units) != 3 {

functional/connectivity-loss_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ func TestSingleNodeConnectivityLoss(t *testing.T) {
9393
checkExpectedStates := func() (isExpected bool, expected, actual map[string]string) {
9494
// First check unit files.
9595
// These shouldn't change at all after intital submit -- but better safe than sorry...
96-
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend", "--full", "--fields", "unit,dstate")
96+
stdout, stderr, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend", "--full", "--fields", "unit,dstate")
9797
if err != nil {
98-
t.Errorf("Failed listing unit files: %v", err)
98+
t.Errorf("Failed listing unit files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
9999
}
100100
stdout = strings.TrimSpace(stdout)
101101

@@ -113,9 +113,9 @@ func TestSingleNodeConnectivityLoss(t *testing.T) {
113113
}
114114

115115
// Now check the actual unit states.
116-
stdout, _, err = cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active")
116+
stdout, stderr, err = cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active")
117117
if err != nil {
118-
t.Errorf("Failed listing units: %v", err)
118+
t.Errorf("Failed listing units:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
119119
}
120120
stdout = strings.TrimSpace(stdout)
121121

functional/fleetctl_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ import (
2424
)
2525

2626
func TestClientVersionFlag(t *testing.T) {
27-
stdout, _, err := util.RunFleetctl("version")
27+
stdout, stderr, err := util.RunFleetctl("version")
2828
if err != nil {
29-
t.Fatalf("Unexpected error while executing fleetctl: %v", err)
29+
t.Fatalf("Unexpected error while executing fleetctl:\nstdout: %s\nstderr: %s\nerr: %v",
30+
stdout, stderr, err)
3031
}
3132

3233
if strings.TrimSpace(stdout) != fmt.Sprintf("fleetctl version %s", version.Version) {
@@ -35,9 +36,10 @@ func TestClientVersionFlag(t *testing.T) {
3536
}
3637

3738
func TestClientVersionHelpOutput(t *testing.T) {
38-
stdout, _, err := util.RunFleetctl("help")
39+
stdout, stderr, err := util.RunFleetctl("help")
3940
if err != nil {
40-
t.Fatalf("Unexpected error while executing fleetctl: %v", err)
41+
t.Fatalf("Unexpected error while executing fleetctl:\nstdout: %s\nstderr: %s\nerr: %v",
42+
stdout, stderr, err)
4143
}
4244

4345
if !strings.Contains(stdout, fmt.Sprintf("%s", version.Version)) {

functional/node_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ func TestNodeShutdown(t *testing.T) {
6262
}
6363

6464
// Stop the fleet process on the first member
65-
if _, err = cluster.MemberCommand(m0, "sudo", "systemctl", "stop", "fleet"); err != nil {
66-
t.Fatal(err)
65+
if stdout, err = cluster.MemberCommand(m0, "sudo", "systemctl", "stop", "fleet"); err != nil {
66+
t.Fatalf("Failed stopping fleet service: %v\nstdout: %s\n", err, stdout)
6767
}
6868

6969
// The first member should quickly remove itself from the published
@@ -118,13 +118,13 @@ func TestDetectMachineId(t *testing.T) {
118118
return fmt.Errorf("Failed to restart fleet service\nstdout: %s\nerr: %v", stdout, err)
119119
}
120120

121-
stdout, _ = cluster.MemberCommand(m, "systemctl", "show", "--property=ActiveState", "fleet")
121+
stdout, err = cluster.MemberCommand(m, "systemctl", "show", "--property=ActiveState", "fleet")
122122
if strings.TrimSpace(stdout) != "ActiveState=active" {
123-
return fmt.Errorf("Fleet unit not reported as active: %s", stdout)
123+
return fmt.Errorf("Fleet unit not reported as active:\nstdout:%s\nerr: %v", stdout, err)
124124
}
125-
stdout, _ = cluster.MemberCommand(m, "systemctl", "show", "--property=Result", "fleet")
125+
stdout, err = cluster.MemberCommand(m, "systemctl", "show", "--property=Result", "fleet")
126126
if strings.TrimSpace(stdout) != "Result=success" {
127-
return fmt.Errorf("Result for fleet unit not reported as success: %s", stdout)
127+
return fmt.Errorf("Result for fleet unit not reported as success:\nstdout:%s\nerr: %v", stdout, err)
128128
}
129129
return nil
130130
}
@@ -155,12 +155,12 @@ func TestDetectMachineId(t *testing.T) {
155155
if err != nil {
156156
if !strings.Contains(err.Error(), "exit status 1") ||
157157
!strings.Contains(stderr, "fleet server unable to communicate with etcd") {
158-
t.Fatalf("m1: Failed to get list of machines. err: %v\nstderr: %s", err, stderr)
158+
t.Fatalf("m1: Failed to get list of machines. err: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
159159
}
160160
// If both conditions are satisfied, "exit status 1" and
161161
// "...unable to communicate...", then it's an expected error. PASS.
162162
} else {
163-
t.Fatalf("m1: should get an error, but got success.\nstderr: %s", stderr)
163+
t.Fatalf("m1: should get an error, but got success.\nstdout: %s\nstderr: %s", stdout, stderr)
164164
}
165165

166166
// Trigger another test case of m0's ID getting different from m1's.

functional/platform/nspawn.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -294,39 +294,39 @@ func (nc *nspawnCluster) prepCluster() (err error) {
294294
return
295295
}
296296

297-
stdout, _, err := run("brctl show")
297+
stdout, stderr, err := run("brctl show")
298298
if err != nil {
299-
log.Printf("Failed enumerating bridges: %v", err)
299+
log.Printf("Failed enumerating bridges: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
300300
return
301301
}
302302

303303
if !strings.Contains(stdout, "fleet0") {
304-
_, _, err = run("brctl addbr fleet0")
304+
stdout, stderr, err = run("brctl addbr fleet0")
305305
if err != nil {
306-
log.Printf("Failed adding fleet0 bridge: %v", err)
306+
log.Printf("Failed adding fleet0 bridge: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
307307
return
308308
}
309309
} else {
310310
log.Printf("Bridge fleet0 already exists")
311311
}
312312

313-
stdout, _, err = run("ip addr list fleet0")
313+
stdout, stderr, err = run("ip addr list fleet0")
314314
if err != nil {
315-
log.Printf("Failed listing fleet0 addresses: %v", err)
315+
log.Printf("Failed listing fleet0 addresses: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
316316
return
317317
}
318318

319319
if !strings.Contains(stdout, "172.18.0.1/16") {
320-
_, _, err = run("ip addr add 172.18.0.1/16 dev fleet0")
320+
stdout, stderr, err = run("ip addr add 172.18.0.1/16 dev fleet0")
321321
if err != nil {
322-
log.Printf("Failed adding 172.18.0.1/16 to fleet0: %v", err)
322+
log.Printf("Failed adding 172.18.0.1/16 to fleet0: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
323323
return
324324
}
325325
}
326326

327-
_, _, err = run("ip link set fleet0 up")
327+
stdout, stderr, err = run("ip link set fleet0 up")
328328
if err != nil {
329-
log.Printf("Failed bringing up fleet0 bridge: %v", err)
329+
log.Printf("Failed bringing up fleet0 bridge: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
330330
return
331331
}
332332

@@ -603,8 +603,8 @@ func (nc *nspawnCluster) ReplaceMember(m Member) (Member, error) {
603603
label := fmt.Sprintf("%s%s", nc.name, m.ID())
604604

605605
cmd := fmt.Sprintf("machinectl poweroff %s", label)
606-
if _, _, err := run(cmd); err != nil {
607-
return nil, fmt.Errorf("poweroff failed: %v", err)
606+
if stdout, stderr, err := run(cmd); err != nil {
607+
return nil, fmt.Errorf("poweroff failed: %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
608608
}
609609

610610
var mN Member
@@ -708,13 +708,13 @@ func (nc *nspawnCluster) systemd(unitName, exec string) error {
708708
func (nc *nspawnCluster) machinePID(name string) (int, error) {
709709
for i := 0; i < 100; i++ {
710710
mach := fmt.Sprintf("%s%s", nc.name, name)
711-
stdout, _, err := run(fmt.Sprintf("machinectl show -p Leader %s", mach))
711+
stdout, stderr, err := run(fmt.Sprintf("machinectl show -p Leader %s", mach))
712712
if err != nil {
713713
if i != -1 {
714714
time.Sleep(100 * time.Millisecond)
715715
continue
716716
}
717-
return -1, fmt.Errorf("failed detecting machine %s status: %v", mach, err)
717+
return -1, fmt.Errorf("failed detecting machine %s status: %v\nstdout: %s\nstderr: %s", mach, err, stdout, stderr)
718718
}
719719

720720
out := strings.SplitN(strings.TrimSpace(stdout), "=", 2)

functional/scheduling_test.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ func TestScheduleMachineOf(t *testing.T) {
6666

6767
// All 6 services should be visible immediately and become ACTIVE
6868
// shortly thereafter
69-
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
69+
stdout, stderr, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
7070
if err != nil {
71-
t.Fatalf("Failed to run list-unit-files: %v", err)
71+
t.Fatalf("Failed to run list-unit-files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
7272
}
7373
units := strings.Split(strings.TrimSpace(stdout), "\n")
7474
if len(units) != 6 {
@@ -113,8 +113,8 @@ func TestScheduleMachineOf(t *testing.T) {
113113

114114
// Ensure a pair of units migrate together when their host goes down
115115
mach := states["ping.1.service"].Machine
116-
if _, _, err = cluster.Fleetctl(m0, "--strict-host-key-checking=false", "ssh", mach, "sudo", "systemctl", "stop", "fleet"); err != nil {
117-
t.Fatal(err)
116+
if stdout, stderr, err = cluster.Fleetctl(m0, "--strict-host-key-checking=false", "ssh", mach, "sudo", "systemctl", "stop", "fleet"); err != nil {
117+
t.Fatalf("Failed to stop fleet service:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
118118
}
119119

120120
var mN platform.Member
@@ -184,9 +184,9 @@ func TestScheduleConflicts(t *testing.T) {
184184

185185
// All 5 services should be visible immediately and 3 should become
186186
// ACTIVE shortly thereafter
187-
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
187+
stdout, stderr, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
188188
if err != nil {
189-
t.Fatalf("Failed to run list-unit-files: %v", err)
189+
t.Fatalf("Failed to run list-unit-files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
190190
}
191191
units := strings.Split(strings.TrimSpace(stdout), "\n")
192192
if len(units) != 5 {
@@ -256,9 +256,9 @@ func TestScheduleOneWayConflict(t *testing.T) {
256256

257257
// Both units should show up, but only conflicts-with-hello.service
258258
// should report ACTIVE
259-
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
259+
stdout, stderr, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
260260
if err != nil {
261-
t.Fatalf("Failed to run list-unit-files: %v", err)
261+
t.Fatalf("Failed to run list-unit-files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
262262
}
263263
units := strings.Split(strings.TrimSpace(stdout), "\n")
264264
if len(units) != 2 {
@@ -281,8 +281,8 @@ func TestScheduleOneWayConflict(t *testing.T) {
281281

282282
// Destroying the conflicting unit should allow the other to start
283283
name = "conflicts-with-hello.service"
284-
if _, _, err := cluster.Fleetctl(m0, "destroy", name); err != nil {
285-
t.Fatalf("Failed destroying %s", name)
284+
if stdout, stderr, err := cluster.Fleetctl(m0, "destroy", name); err != nil {
285+
t.Fatalf("Failed destroying %s:\nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
286286
}
287287

288288
// NOTE: we need to sleep here shortly to avoid occasional errors of
@@ -295,13 +295,14 @@ func TestScheduleOneWayConflict(t *testing.T) {
295295
time.Sleep(1 * time.Second)
296296

297297
// Wait for the destroyed unit to actually disappear
298+
var stdoutBuf, stderrBuf string
298299
timeout, err := util.WaitForState(
299300
func() bool {
300-
stdout, _, err := cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active,machine")
301+
stdoutBuf, stderrBuf, err = cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active,machine")
301302
if err != nil {
302303
return false
303304
}
304-
lines := strings.Split(strings.TrimSpace(stdout), "\n")
305+
lines := strings.Split(strings.TrimSpace(stdoutBuf), "\n")
305306
states := util.ParseUnitStates(lines)
306307
for _, state := range states {
307308
if state.Name == name {
@@ -312,7 +313,8 @@ func TestScheduleOneWayConflict(t *testing.T) {
312313
},
313314
)
314315
if err != nil {
315-
t.Fatalf("Destroyed unit %s not gone within %v", name, timeout)
316+
t.Fatalf("Destroyed unit %s not gone within %v\nstdout: %s\nstderr: %s\nerr: %v",
317+
name, timeout, stdoutBuf, stderrBuf, err)
316318
}
317319

318320
active, err = cluster.WaitForNActiveUnits(m0, 1)
@@ -374,9 +376,9 @@ func TestScheduleReplace(t *testing.T) {
374376
}
375377

376378
// Check that both units should show up
377-
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
379+
stdout, stderr, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
378380
if err != nil {
379-
t.Fatalf("Failed to run list-unit-files: %v", err)
381+
t.Fatalf("Failed to run list-unit-files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
380382
}
381383
units := strings.Split(strings.TrimSpace(stdout), "\n")
382384
if len(units) != 2 {
@@ -450,9 +452,9 @@ func TestScheduleCircularReplace(t *testing.T) {
450452
uName0tmp, stdout, stderr, err)
451453
}
452454

453-
stdout, _, err = cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
455+
stdout, stderr, err = cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
454456
if err != nil {
455-
t.Fatalf("Failed to run list-unit-files: %v", err)
457+
t.Fatalf("Failed to run list-unit-files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
456458
}
457459
units := strings.Split(strings.TrimSpace(stdout), "\n")
458460
if len(units) != nActiveUnits {
@@ -472,9 +474,9 @@ func TestScheduleCircularReplace(t *testing.T) {
472474
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", uNames[1]); err != nil {
473475
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", uNames[1], stdout, stderr, err)
474476
}
475-
stdout, _, err = cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
477+
stdout, stderr, err = cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
476478
if err != nil {
477-
t.Fatalf("Failed to run list-unit-files: %v", err)
479+
t.Fatalf("Failed to run list-unit-files:\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
478480
}
479481
units = strings.Split(strings.TrimSpace(stdout), "\n")
480482
if len(units) != nUnits {

functional/server_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ func TestReconfigureServer(t *testing.T) {
7878

7979
// check if fleetd is still running correctly, by running fleetctl status
8080
// Even if the log message do not show up this test may catch the error.
81-
stdout, _, err = cluster.Fleetctl(m0, "list-units")
81+
stdout, stderr, err = cluster.Fleetctl(m0, "list-units")
8282
if err != nil {
83-
t.Fatalf("Unable to check list-units. Please check for fleetd socket. err:%v", err)
83+
t.Fatalf("Unable to check list-units. Please check for fleetd socket\nstdout: %s\nstderr: %s\nerr:%v",
84+
stdout, stderr, err)
8485
}
8586

8687
// Ensure that fleet received SIGHUP, if not then just skip this test

0 commit comments

Comments
 (0)