diff --git a/cmd/ignite/run/start.go b/cmd/ignite/run/start.go index 7bd5a5775..d80d3a986 100644 --- a/cmd/ignite/run/start.go +++ b/cmd/ignite/run/start.go @@ -2,6 +2,9 @@ package run import ( "fmt" + "github.com/weaveworks/ignite/pkg/apis/ignite" + "net" + "time" "github.com/weaveworks/ignite/pkg/operations" "github.com/weaveworks/ignite/pkg/preflight/checkers" @@ -47,9 +50,41 @@ func Start(so *startOptions) error { return err } + if err := waitForSSH(so.vm, 10); err != nil { + return err + } + // If starting interactively, attach after starting if so.Interactive { return Attach(so.attachOptions) } return nil } + +func waitForSSH(vm *ignite.VM, seconds int) error { + // When --ssh is enabled, wait until SSH service started on port 22 at most N seconds + ssh := vm.Spec.SSH + if ssh != nil && ssh.Generate { + if len(vm.Status.IPAddresses) > 0 { + addr := vm.Status.IPAddresses[0].String() + ":22" + var err error + for i := 0; i < seconds*10; i++ { + conn, dialErr := net.DialTimeout("tcp", addr, 100*time.Millisecond) + if conn != nil { + defer conn.Close() + err = nil + break + } + err = dialErr + time.Sleep(100 * time.Millisecond) + } + if err != nil { + if err, ok := err.(*net.OpError); ok && err.Timeout() { + return fmt.Errorf("Tried connecting to SSH but timed out %s", err) + } + } + } + } + + return nil +}