Move e2e SSH utils to e2e/ssh package; improve SSH logging.
This commit is contained in:
@@ -48,7 +48,6 @@ import (
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"golang.org/x/crypto/ssh"
|
||||
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
@@ -1347,76 +1346,6 @@ func BadEvents(events []*api.Event) int {
|
||||
return badEvents
|
||||
}
|
||||
|
||||
// NodeSSHHosts returns SSH-able host names for all nodes. It returns an error
|
||||
// if it can't find an external IP for every node, though it still returns all
|
||||
// hosts that it found in that case.
|
||||
func NodeSSHHosts(c *client.Client) ([]string, error) {
|
||||
var hosts []string
|
||||
nodelist, err := c.Nodes().List(labels.Everything(), fields.Everything())
|
||||
if err != nil {
|
||||
return hosts, fmt.Errorf("error getting nodes: %v", err)
|
||||
}
|
||||
for _, n := range nodelist.Items {
|
||||
for _, addr := range n.Status.Addresses {
|
||||
// Use the first external IP address we find on the node, and
|
||||
// use at most one per node.
|
||||
// TODO(mbforbes): Use the "preferred" address for the node, once
|
||||
// such a thing is defined (#2462).
|
||||
if addr.Type == api.NodeExternalIP {
|
||||
hosts = append(hosts, addr.Address+":22")
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Error if any node didn't have an external IP.
|
||||
if len(hosts) != len(nodelist.Items) {
|
||||
return hosts, fmt.Errorf(
|
||||
"only found %d external IPs on nodes, but found %d nodes. Nodelist: %v",
|
||||
len(hosts), len(nodelist.Items), nodelist)
|
||||
}
|
||||
return hosts, nil
|
||||
}
|
||||
|
||||
// SSH synchronously SSHs to a node running on provider and runs cmd. If there
|
||||
// is no error performing the SSH, the stdout, stderr, and exit code are
|
||||
// returned.
|
||||
func SSH(cmd, host, provider string) (string, string, int, error) {
|
||||
// Get a signer for the provider.
|
||||
signer, err := getSigner(provider)
|
||||
if err != nil {
|
||||
return "", "", 0, fmt.Errorf("error getting signer for provider %s: '%v'", provider, err)
|
||||
}
|
||||
|
||||
user := os.Getenv("KUBE_SSH_USER")
|
||||
// RunSSHCommand will default to Getenv("USER") if user == ""
|
||||
return util.RunSSHCommand(cmd, user, host, signer)
|
||||
}
|
||||
|
||||
// getSigner returns an ssh.Signer for the provider ("gce", etc.) that can be
|
||||
// used to SSH to their nodes.
|
||||
func getSigner(provider string) (ssh.Signer, error) {
|
||||
// Get the directory in which SSH keys are located.
|
||||
keydir := filepath.Join(os.Getenv("HOME"), ".ssh")
|
||||
|
||||
// Select the key itself to use. When implementing more providers here,
|
||||
// please also add them to any SSH tests that are disabled because of signer
|
||||
// support.
|
||||
keyfile := ""
|
||||
switch provider {
|
||||
case "gce", "gke":
|
||||
keyfile = "google_compute_engine"
|
||||
case "aws":
|
||||
keyfile = "kube_aws_rsa"
|
||||
default:
|
||||
return nil, fmt.Errorf("getSigner(...) not implemented for %s", provider)
|
||||
}
|
||||
key := filepath.Join(keydir, keyfile)
|
||||
Logf("Using SSH key: %s", key)
|
||||
|
||||
return util.MakePrivateKeySignerFromFile(key)
|
||||
}
|
||||
|
||||
// checkPodsRunning returns whether all pods whose names are listed in podNames
|
||||
// in namespace ns are running and ready, using c and waiting at most timeout.
|
||||
func checkPodsRunningReady(c *client.Client, ns string, podNames []string, timeout time.Duration) bool {
|
||||
|
Reference in New Issue
Block a user