Skip to content

Commit

Permalink
devshell: Don't output status if not on a tty
Browse files Browse the repository at this point in the history
This is just better behavior for the case of e.g.
`cosa run -x "somecmd" > out.txt` to execute a command and
capture the output - we don't want to intermix status stuff in
there.

Further, this makes it easier to test the code when not on
a tty (in e.g. CI).
  • Loading branch information
cgwalters committed Nov 30, 2022
1 parent 3d5071f commit a9d5543
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
41 changes: 30 additions & 11 deletions mantle/cmd/kola/devshell.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,11 @@ func displayStatusMsg(status, msg string, termMaxWidth int) {
}

func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *conf.Conf, sshCommand string) error {
if !term.IsTerminal(0) {
return fmt.Errorf("stdin is not a tty")
ontty := term.IsTerminal(0)
if sshCommand == "" {
if !ontty {
return fmt.Errorf("stdin is not a tty")
}
}
termMaxWidth, _, err := term.GetSize(0)
if err != nil {
Expand Down Expand Up @@ -171,6 +174,7 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co

// Start the SSH client
sc := newSshClient(ip, agent.Socket, sshCommand)
sc.ontty = ontty
go sc.controlStartStop()

ready := false
Expand All @@ -187,8 +191,10 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co
// handle console messages. If SSH is not ready, then display a
// a status message on the console.
case serialMsg := <-serialChan:
if !ready {
displayStatusMsg(statusMsg, serialMsg, termMaxWidth)
if ontty {
if !ready {
displayStatusMsg(statusMsg, serialMsg, termMaxWidth)
}
}
lastMsg = serialMsg
// monitor the err channel
Expand All @@ -202,7 +208,9 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co

// monitor the instance state
case <-qemuWaitChan:
displayStatusMsg("DONE", "QEMU instance terminated", termMaxWidth)
if ontty {
displayStatusMsg("DONE", "QEMU instance terminated", termMaxWidth)
}
return nil

// monitor the machine state events from console/serial logs
Expand Down Expand Up @@ -233,17 +241,23 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co
statusMsg = "QEMU guest is booting"
}
}
displayStatusMsg(fmt.Sprintf("EVENT | %s", statusMsg), lastMsg, termMaxWidth)
if ontty {
displayStatusMsg(fmt.Sprintf("EVENT | %s", statusMsg), lastMsg, termMaxWidth)
}

// monitor the SSH connection
case err := <-sc.errChan:
if err == nil {
sc.controlChan <- sshNotReady
displayStatusMsg("SESSION", "Clean exit from SSH, terminating instance", termMaxWidth)
if ontty {
displayStatusMsg("SESSION", "Clean exit from SSH, terminating instance", termMaxWidth)
}
return nil
} else if sshCommand != "" {
sc.controlChan <- sshNotReady
displayStatusMsg("SESSION", "SSH command exited, terminating instance", termMaxWidth)
if ontty {
displayStatusMsg("SESSION", "SSH command exited, terminating instance", termMaxWidth)
}
return err
}
if ready {
Expand Down Expand Up @@ -456,6 +470,7 @@ type sshClient struct {
port string
agent string
cmd string
ontty bool
controlChan chan sshControlMessage
errChan chan error
sshCmd *exec.Cmd
Expand Down Expand Up @@ -512,8 +527,10 @@ func (sc *sshClient) start() {
if sc.cmd != "" {
sshArgs = append(sshArgs, "--", sc.cmd)
}
fmt.Printf("\033[2K\r") // clear serial console line
fmt.Printf("[SESSION] Starting SSH\r") // and stage a status msg which will be erased
if sc.ontty {
fmt.Printf("\033[2K\r") // clear serial console line
fmt.Printf("[SESSION] Starting SSH\r") // and stage a status msg which will be erased
}
sshCmd := exec.Command(sshArgs[0], sshArgs[1:]...)
sshCmd.Stdin = os.Stdin
sshCmd.Stdout = os.Stdout
Expand All @@ -532,7 +549,9 @@ func (sc *sshClient) start() {
for scanner.Scan() {
msg := scanner.Text()
if strings.Contains(msg, "Connection to 127.0.0.1 closed") {
displayStatusMsg("SSH", "connection closed", 0)
if sc.ontty {
displayStatusMsg("SSH", "connection closed", 0)
}
}
}
}()
Expand Down
4 changes: 2 additions & 2 deletions tests/test-cosa-run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
# This verifies e.g. `cosa run`.
set -xeuo pipefail
tmpdir=$(mktemp -d -p /var/tmp)
cd ${tmpdir}
cd "${tmpdir}"
coreos-installer download -a s390x -p qemu -f qcow2.xz --decompress
cosa run --arch s390x *.qcow2 -x "cat /proc/cpuinfo" > cpuinfo.txt
cosa run --arch s390x ./*.qcow2 -x "cat /proc/cpuinfo" > cpuinfo.txt
grep -F 'IBM/S390' cpuinfo.txt
cd -
rm "${tmpdir}" -rf
Expand Down

0 comments on commit a9d5543

Please sign in to comment.