From a48e1ead6170b63721ef12801ca6e6f5dee6aa09 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 8 Aug 2017 11:45:25 +0200 Subject: vm/gce: work around GCE console bug Sometimes connects to serial console spuriously fail with: Permission denied (publickey) --- vm/gce/gce.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'vm/gce') diff --git a/vm/gce/gce.go b/vm/gce/gce.go index e9d1daa90..084189522 100644 --- a/vm/gce/gce.go +++ b/vm/gce/gce.go @@ -237,25 +237,31 @@ func (inst *instance) Run(timeout time.Duration, stop <-chan bool, command strin { var output []byte timeout := time.NewTimer(time.Minute) + connectedMsg := []byte("serialport: Connected") + permissionDeniedMsg := []byte("Permission denied (publickey)") loop: for { select { case out := <-merger.Output: output = append(output, out...) - if bytes.Contains(output, []byte("serialport")) { + if bytes.Contains(output, connectedMsg) { // Just to make sure (otherwise we still see trimmed reports). time.Sleep(5 * time.Second) break loop } + if bytes.Contains(output, permissionDeniedMsg) { + // This is a GCE bug. + break + } case <-timeout.C: break loop } } timeout.Stop() - if len(output) == 0 { + if len(output) == 0 || bytes.Contains(output, permissionDeniedMsg) { con.Process.Kill() merger.Wait() - return nil, nil, fmt.Errorf("no output from console") + return nil, nil, fmt.Errorf("no output from console or permission denied") } } -- cgit mrf-deployment