// WaitForServerReady wait for a server state to be running, then wait for the SSH port to be available func WaitForServerReady(api *ScalewayAPI, serverID string, gateway string) (*ScalewayServer, error) { promise := make(chan bool) var server *ScalewayServer var err error go func() { defer close(promise) server, err = WaitForServerState(api, serverID, "running") if err != nil { promise <- false return } if gateway == "" { log.Debugf("Waiting for server SSH port") dest := fmt.Sprintf("%s:22", server.PublicAddress.IP) err = utils.WaitForTCPPortOpen(dest) if err != nil { promise <- false return } } else { log.Debugf("Waiting for gateway SSH port") dest := fmt.Sprintf("%s:22", gateway) err = utils.WaitForTCPPortOpen(dest) if err != nil { promise <- false return } log.Debugf("Waiting 30 more seconds, for SSH to be ready") time.Sleep(30 * time.Second) // FIXME: check for SSH port through the gateway } promise <- true }() loop := 0 for { select { case done := <-promise: utils.LogQuiet("\r \r") if done == false { return nil, err } return server, nil case <-time.After(time.Millisecond * 100): utils.LogQuiet(fmt.Sprintf("\r%c\r", "-\\|/"[loop%4])) loop = loop + 1 if loop == 5 { loop = 0 } } } }
// WaitForServerReady wait for a server state to be running, then wait for the SSH port to be available func WaitForServerReady(api *ScalewayAPI, serverID string, gateway string) (*ScalewayServer, error) { promise := make(chan bool) var server *ScalewayServer var err error var currentState string go func() { defer close(promise) for { server, err = api.GetServer(serverID) if err != nil { promise <- false return } if currentState != server.State { log.Infof("Server changed state to '%s'", server.State) currentState = server.State } if server.State == "running" { break } if server.State == "stopped" { err = fmt.Errorf("The server has been stopped") promise <- false return } time.Sleep(1 * time.Second) } if gateway == "" { log.Debugf("Waiting for server SSH port") dest := fmt.Sprintf("%s:22", server.PublicAddress.IP) err = utils.WaitForTCPPortOpen(dest) if err != nil { promise <- false return } } else { log.Debugf("Waiting for gateway SSH port") dest := fmt.Sprintf("%s:22", gateway) err = utils.WaitForTCPPortOpen(dest) if err != nil { promise <- false return } log.Debugf("Waiting 30 more seconds, for SSH to be ready") time.Sleep(30 * time.Second) // FIXME: check for SSH port through the gateway } promise <- true }() loop := 0 for { select { case done := <-promise: utils.LogQuiet("\r \r") if done == false { return nil, err } return server, nil case <-time.After(time.Millisecond * 100): utils.LogQuiet(fmt.Sprintf("\r%c\r", "-\\|/"[loop%4])) loop = loop + 1 if loop == 5 { loop = 0 } } } }
// WaitForServerReady wait for a server state to be running, then wait for the SSH port to be available func WaitForServerReady(api *ScalewayAPI, serverID, gateway string) (*ScalewayServer, error) { promise := make(chan bool) var server *ScalewayServer var err error var currentState string go func() { defer close(promise) for { server, err = api.GetServer(serverID) if err != nil { promise <- false return } if currentState != server.State { log.Infof("Server changed state to '%s'", server.State) currentState = server.State } if server.State == "running" { break } if server.State == "stopped" { err = fmt.Errorf("The server has been stopped") promise <- false return } time.Sleep(1 * time.Second) } if gateway == "" { dest := fmt.Sprintf("%s:22", server.PublicAddress.IP) log.Debugf("Waiting for server SSH port %s", dest) err = utils.WaitForTCPPortOpen(dest) if err != nil { promise <- false return } } else { dest := fmt.Sprintf("%s:22", gateway) log.Debugf("Waiting for server SSH port %s", dest) err = utils.WaitForTCPPortOpen(dest) if err != nil { promise <- false return } timeout := time.Tick(120 * time.Second) for { select { case <-timeout: err = fmt.Errorf("Timeout: unable to ping %s", server.PrivateIP) fmt.Println("timeout") goto OUT default: if utils.SSHExec("", server.PrivateIP, "root", 22, []string{ "nc", "-z", "-w", "1", server.PrivateIP, "22", }, false, gateway) == nil { goto OUT } } } OUT: if err != nil { promise <- false return } log.Debugf("Check for SSH port through the gateway: %s", server.PrivateIP) } promise <- true }() loop := 0 for { select { case done := <-promise: utils.LogQuiet("\r \r") if !done { return nil, err } return server, nil case <-time.After(time.Millisecond * 100): utils.LogQuiet(fmt.Sprintf("\r%c\r", "-\\|/"[loop%4])) loop = loop + 1 if loop == 5 { loop = 0 } } } }