// IsHostReady returns whether or not the specified host is ready for its setup script // to be run. func (init *HostInit) IsHostReady(host *host.Host) (bool, error) { // fetch the appropriate cloud provider for the host cloudMgr, err := providers.GetCloudManager(host.Distro.Provider, init.Settings) if err != nil { return false, fmt.Errorf("failed to get cloud manager for provider %v: %v", host.Distro.Provider, err) } // ask for the instance's status hostStatus, err := cloudMgr.GetInstanceStatus(host) if err != nil { return false, fmt.Errorf("error checking instance status of host %v: %v", host.Id, err) } // if the host isn't up yet, we can't do anything if hostStatus != cloud.StatusRunning { return false, nil } // set the host's dns name, if it is not set if host.Host == "" { // get the DNS name for the host hostDNS, err := cloudMgr.GetDNSName(host) if err != nil { return false, fmt.Errorf("error checking DNS name for host %v: %v", host.Id, err) } // sanity check for the host DNS name if hostDNS == "" { return false, fmt.Errorf("instance %v is running but not returning a DNS name", host.Id) } // update the host's DNS name if err := host.SetDNSName(hostDNS); err != nil { return false, fmt.Errorf("error setting DNS name for host %v: %v", host.Id, err) } } // check if the host is reachable via SSH cloudHost, err := providers.GetCloudHost(host, init.Settings) if err != nil { return false, fmt.Errorf("failed to get cloud host for %v: %v", host.Id, err) } reachable, err := cloudHost.IsSSHReachable() if err != nil { return false, fmt.Errorf("error checking if host %v is reachable: %v", host.Id, err) } // at this point, we can run the setup if the host is reachable return reachable, nil }