// setupHost runs the specified setup script for an individual host. Returns // the output from running the script remotely, as well as any error that // occurs. If the script exits with a non-zero exit code, the error will be non-nil. func (init *HostInit) setupHost(targetHost *host.Host) (string, error) { // fetch the appropriate cloud provider for the host cloudMgr, err := providers.GetCloudManager(targetHost.Provider, init.Settings) if err != nil { return "", fmt.Errorf("failed to get cloud manager for host %v with provider %v: %v", targetHost.Id, targetHost.Provider, err) } // mark the host as initializing if err := targetHost.SetInitializing(); err != nil { if err == mgo.ErrNotFound { return "", ErrHostAlreadyInitializing } else { return "", fmt.Errorf("database error: %v", err) } } /* TESTING ONLY setupDebugSSHTunnel(path_to_ssh_key, targetHost.User, targetHost.Host) */ // run the function scheduled for when the host is up err = cloudMgr.OnUp(targetHost) if err != nil { // if this fails it is probably due to an API hiccup, so we keep going. evergreen.Logger.Logf(slogger.WARN, "OnUp callback failed for host '%v': '%v'", targetHost.Id, err) } cloudHost, err := providers.GetCloudHost(targetHost, init.Settings) if err != nil { return "", fmt.Errorf("failed to get cloud host for %v: %v", targetHost.Id, err) } sshOptions, err := cloudHost.GetSSHOptions() if err != nil { return "", fmt.Errorf("error getting ssh options for host %v: %v", targetHost.Id, err) } if targetHost.Distro.Teardown != "" { err = init.copyScript(targetHost, teardownScriptName, targetHost.Distro.Teardown) if err != nil { return "", fmt.Errorf("error copying script %v to host %v: %v", teardownScriptName, targetHost.Id, err) } } if targetHost.Distro.Setup != "" { err = init.copyScript(targetHost, setupScriptName, targetHost.Distro.Setup) if err != nil { return "", fmt.Errorf("error copying script %v to host %v: %v", setupScriptName, targetHost.Id, err) } logs, err := hostutil.RunRemoteScript(targetHost, setupScriptName, sshOptions) if err != nil { return logs, fmt.Errorf("error running setup script over ssh: %v", err) } return logs, nil } return "", nil }
func runHostTeardown(h *host.Host, cloudHost *cloud.CloudHost) error { sshOptions, err := cloudHost.GetSSHOptions() if err != nil { return fmt.Errorf("error getting ssh options for host %v: %v", h.Id, err) } startTime := time.Now() logs, err := hostutil.RunRemoteScript(h, "teardown.sh", sshOptions) event.LogHostTeardown(h.Id, logs, err == nil, time.Since(startTime)) if err != nil { return fmt.Errorf("error (%v) running teardown.sh over ssh: %v", err, logs) } return nil }