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

Commit af75858

Browse files
author
Dongsu Park
committed
Merge pull request #1700 from endocode/dongsu/systemd-errmsg-fxtests
functional: fix error from message change from systemctl status
2 parents a11d017 + 7a16cab commit af75858

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

functional/node_test.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,14 @@ func TestNodeShutdown(t *testing.T) {
7777
t.Fatal(err)
7878
}
7979

80-
// The member's unit should actually stop running, too
81-
stdout, _ = cluster.MemberCommand(m0, "systemctl", "status", "hello.service")
82-
if !strings.Contains(stdout, "Active: inactive") {
80+
// The member's unit should actually stop running, too.
81+
// NOTE: In case of no units, systemd v230 or older prints out
82+
// "Active: inactive" to stdout, while systemd v231 or newer prints out
83+
// "Unit NAME could not be found" to stderr. So we need to check for
84+
// both cases. Use MemberCommandStderr() to retrieve both stdout and stderr,
85+
// and check for each case.
86+
stdout, stderr, err = cluster.MemberCommandStderr(m0, "systemctl", "status", "hello.service")
87+
if !strings.Contains(stdout, "Active: inactive") && !strings.Contains(stderr, "could not be found") {
8388
t.Fatalf("Unit hello.service not reported as inactive:\n%s\n", stdout)
8489
}
8590
}

functional/platform/cluster.go

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type Cluster interface {
3232
ReplaceMember(Member) (Member, error)
3333
Members() []Member
3434
MemberCommand(Member, ...string) (string, error)
35+
MemberCommandStderr(Member, ...string) (string, string, error)
3536
Destroy(t *testing.T) error
3637

3738
// client operations

functional/platform/nspawn.go

+22
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,28 @@ func (nc *nspawnCluster) MemberCommand(m Member, args ...string) (string, error)
390390
return stdoutBytes.String(), err
391391
}
392392

393+
// MemberCommandStderr() is like MemberCommand(), except that it returns
394+
// both stdout and stderr from the running command. This is definitely useful
395+
// for most cases, especially when the caller needs to check for both stdout
396+
// and stderr.
397+
//
398+
// NOTE: Ideally we should remove MemberCommand() above, and rename
399+
// MemberCommandStderr() to MemberCommand(). For doing that, however, we need
400+
// to change every call site to replace MemberCommand() with MemberCommandStderr().
401+
// Of course that would be a lot of work. I'll leave that to future work.
402+
// - dpark 20161102
403+
func (nc *nspawnCluster) MemberCommandStderr(m Member, args ...string) (string, string, error) {
404+
baseArgs := []string{"-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", fmt.Sprintf("core@%s", m.IP())}
405+
args = append(baseArgs, args...)
406+
log.Printf("ssh %s", strings.Join(args, " "))
407+
var stdoutBytes, stderrBytes bytes.Buffer
408+
cmd := exec.Command("ssh", args...)
409+
cmd.Stdout = &stdoutBytes
410+
cmd.Stderr = &stderrBytes
411+
err := cmd.Run()
412+
return stdoutBytes.String(), stderrBytes.String(), err
413+
}
414+
393415
func (nc *nspawnCluster) CreateMember() (m Member, err error) {
394416
id := nc.nextID()
395417
log.Printf("Creating nspawn machine %s in cluster %s", id, nc.name)

0 commit comments

Comments
 (0)