From 44be16c49f4d9ddad5e7a8264841ea7e2e191be4 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sat, 11 Apr 2015 08:07:44 +0200 Subject: [PATCH 1/5] drivers: don't let the driver wait for SSH/Docker Waiting for SSH to start or Docker to be available is a step done directly in the framework (in libmachine). There is no need for the driver to do that. Signed-off-by: Vincent Bernat --- drivers/amazonec2/amazonec2.go | 6 ---- drivers/azure/azure.go | 52 +++----------------------------- drivers/hyperv/hyperv_windows.go | 7 +---- drivers/openstack/openstack.go | 3 -- drivers/virtualbox/virtualbox.go | 4 +-- 5 files changed, 8 insertions(+), 64 deletions(-) diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 2866f3bfd8..1e91eff0c4 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -398,12 +398,6 @@ func (d *Driver) Create() error { d.PrivateIPAddress, ) - log.Infof("Waiting for SSH on %s:%d", d.IPAddress, 22) - - if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", d.IPAddress, 22)); err != nil { - return err - } - log.Debug("Settings tags for instance") tags := map[string]string{ "Name": d.MachineName, diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index e390ea670a..3726c008b1 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -3,12 +3,10 @@ package azure import ( "errors" "fmt" - "net" "os" "os/exec" "path/filepath" "strings" - "time" azure "github.com/MSOpenTech/azure-sdk-for-go" "github.com/MSOpenTech/azure-sdk-for-go/clients/vmClient" @@ -257,9 +255,7 @@ func (d *Driver) Create() error { return err } - log.Info("Waiting for SSH...") - log.Debugf("Host: %s SSH Port: %d", d.getHostname(), d.SSHPort) - return ssh.WaitForTCP(fmt.Sprintf("%s:%d", d.getHostname(), d.SSHPort)) + return nil } func (d *Driver) GetURL() (string, error) { @@ -315,10 +311,8 @@ func (d *Driver) Start() error { if err := vmClient.StartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { return err } - if err := d.waitForSSH(); err != nil { - return err - } - return d.waitForDocker() + + return nil } func (d *Driver) Stop() error { @@ -369,10 +363,8 @@ func (d *Driver) Restart() error { if err := vmClient.RestartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { return err } - if err := d.waitForSSH(); err != nil { - return err - } - return d.waitForDocker() + + return nil } func (d *Driver) Kill() error { @@ -424,40 +416,6 @@ func (d *Driver) addDockerEndpoint(vmConfig *vmClient.Role) error { return nil } -func (d *Driver) waitForSSH() error { - log.Infof("Waiting for SSH...") - return ssh.WaitForTCP(fmt.Sprintf("%s:%v", d.getHostname(), d.SSHPort)) -} - -func (d *Driver) waitForDocker() error { - log.Infof("Waiting for docker daemon on host to be available...") - maxRepeats := 48 - url := fmt.Sprintf("%s:%v", d.getHostname(), d.DockerPort) - success := waitForDockerEndpoint(url, maxRepeats) - if !success { - return errors.New("Can not run docker daemon on remote machine. Please try again.") - } - return nil -} - -func waitForDockerEndpoint(url string, maxRepeats int) bool { - counter := 0 - for { - conn, err := net.Dial("tcp", url) - if err != nil { - time.Sleep(10 * time.Second) - counter++ - if counter == maxRepeats { - return false - } - continue - } - defer conn.Close() - break - } - return true -} - func (d *Driver) generateCertForAzure() error { if err := ssh.GenerateSSHKey(d.sshKeyPath()); err != nil { return err diff --git a/drivers/hyperv/hyperv_windows.go b/drivers/hyperv/hyperv_windows.go index 951deb8516..a9ca9b5628 100644 --- a/drivers/hyperv/hyperv_windows.go +++ b/drivers/hyperv/hyperv_windows.go @@ -323,12 +323,7 @@ func (d *Driver) wait() error { } time.Sleep(1 * time.Second) } - log.Infof("Got IP, waiting for SSH") - ip, err := d.GetIP() - if err != nil { - return err - } - return ssh.WaitForTCP(fmt.Sprintf("%s:22", ip)) + return nil } func (d *Driver) Start() error { diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index 3f2ed0f8ad..89b7850416 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -369,9 +369,6 @@ func (d *Driver) Create() error { if err := d.lookForIpAddress(); err != nil { return err } - if err := d.waitForSSHServer(); err != nil { - return err - } return nil } diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index f3e6e60b2a..153162f617 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -343,7 +343,7 @@ func (d *Driver) Start() error { if err := vbm("startvm", d.MachineName, "--type", "headless"); err != nil { return err } - log.Infof("Waiting for VM to start...") + log.Infof("Starting VM...") case state.Paused: if err := vbm("controlvm", d.MachineName, "resume", "--type", "headless"); err != nil { return err @@ -353,7 +353,7 @@ func (d *Driver) Start() error { log.Infof("VM not in restartable state") } - return ssh.WaitForTCP(fmt.Sprintf("localhost:%d", d.SSHPort)) + return nil } func (d *Driver) Stop() error { From 6f1155c2e7ade44e1ddab49013385e2761359f64 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sat, 11 Apr 2015 08:09:10 +0200 Subject: [PATCH 2/5] drivers/openstack: don't let the driver wait for state OpenStack driver waits for the machine to reach the expected state. This is already done in libmachine for most instances of this pattern. Signed-off-by: Vincent Bernat --- drivers/openstack/openstack.go | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index 89b7850416..3714fb1a93 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -380,7 +380,7 @@ func (d *Driver) Start() error { if err := d.client.StartInstance(d); err != nil { return err } - return d.waitForInstanceToStart() + return nil } func (d *Driver) Stop() error { @@ -392,10 +392,6 @@ func (d *Driver) Stop() error { return err } - log.WithField("MachineId", d.MachineId).Info("Waiting for the OpenStack instance to stop...") - if err := d.client.WaitForInstanceStatus(d, "SHUTOFF", 200); err != nil { - return err - } return nil } @@ -423,7 +419,7 @@ func (d *Driver) Restart() error { if err := d.client.RestartInstance(d); err != nil { return err } - return d.waitForInstanceToStart() + return nil } func (d *Driver) Kill() error { @@ -692,25 +688,6 @@ func (d *Driver) lookForIpAddress() error { return nil } -func (d *Driver) waitForSSHServer() error { - ip, err := d.GetIP() - if err != nil { - return err - } - log.WithFields(log.Fields{ - "MachineId": d.MachineId, - "IP": ip, - }).Debug("Waiting for the SSH server to be started...") - return ssh.WaitForTCP(fmt.Sprintf("%s:%d", ip, d.SSHPort)) -} - -func (d *Driver) waitForInstanceToStart() error { - if err := d.waitForInstanceActive(); err != nil { - return err - } - return d.waitForSSHServer() -} - func (d *Driver) publicSSHKeyPath() string { return d.GetSSHKeyPath() + ".pub" } From 3440ba64fa4206725d32c778c1da17fdc3abb9ff Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sat, 11 Apr 2015 08:11:15 +0200 Subject: [PATCH 3/5] drivers/vcloudair: don't test connectivity VMWare VCloudAir driver is the only one taking an extra step to test connectivity after machine creation. If this is a desirable step, it should be done for all drivers in libmachine directly. Signed-off-by: Vincent Bernat --- drivers/vmwarevcloudair/vcloudair.go | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index a115da8899..3b6df907cd 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -409,24 +409,6 @@ func (d *Driver) Create() error { return err } - log.Infof("Waiting for SSH...") - - if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", d.PublicIP, d.SSHPort)); err != nil { - return err - } - - connTest := "ping -c 3 www.google.com >/dev/null 2>&1 && ( echo \"Connectivity and DNS tests passed.\" ) || ( echo \"Connectivity and DNS tests failed, trying to add Nameserver to resolv.conf\"; echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf )" - - log.Debugf("Connectivity and DNS sanity test...") - cmd, err := drivers.GetSSHCommandFromDriver(d, connTest) - if err != nil { - return err - } - - if err := cmd.Run(); err != nil { - return err - } - log.Debugf("Disconnecting from vCloud Air...") if err = p.Disconnect(); err != nil { From fbb8898914fb7869b96017e79c5b67ff4003ed16 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sat, 11 Apr 2015 08:17:57 +0200 Subject: [PATCH 4/5] drivers/google: don't wait for SSH to be ready Waiting for SSH is done in libmachine. There are some additional steps after waiting for SSH but none of them seem to require SSH to be ready to be executed. Signed-off-by: Vincent Bernat --- drivers/google/compute_util.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 45ee1c00cb..a0cfe19bc6 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -194,13 +194,6 @@ func (c *ComputeUtil) createInstance(d *Driver) error { return err } - instance, err = c.instance() - if err != nil { - return err - } - ip := instance.NetworkInterfaces[0].AccessConfigs[0].NatIP - c.waitForSSH(ip) - // Update the SSH Key sshKey, err := ioutil.ReadFile(d.GetSSHKeyPath() + ".pub") if err != nil { @@ -280,12 +273,6 @@ func (c *ComputeUtil) waitForGlobalOp(name string) error { }) } -// waitForSSH waits for SSH to become ready on the instance. -func (c *ComputeUtil) waitForSSH(ip string) error { - log.Infof("Waiting for SSH...") - return ssh.WaitForTCP(fmt.Sprintf("%s:22", ip)) -} - // ip retrieves and returns the external IP address of the instance. func (c *ComputeUtil) ip() (string, error) { if c.ipAddress == "" { From 9c71e647edf99b2d2e7fb05183fffef9df4fefc0 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Thu, 16 Apr 2015 14:22:23 +0200 Subject: [PATCH 5/5] drivers/softlayer: don't let the driver wait for SSH Installation of curl is handled directly by libmachine provisioning, so there is no need to do it and hence wait for SSH to be ready. Signed-off-by: Vincent Bernat --- drivers/softlayer/driver.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/drivers/softlayer/driver.go b/drivers/softlayer/driver.go index 543367adac..3d13193673 100644 --- a/drivers/softlayer/driver.go +++ b/drivers/softlayer/driver.go @@ -399,17 +399,6 @@ func (d *Driver) Create() error { d.getIp() d.waitForStart() d.waitForSetupTransactions() - ssh.WaitForTCP(d.IPAddress + ":22") - - cmd, err := drivers.GetSSHCommandFromDriver(d, "sudo apt-get update && DEBIAN_FRONTEND=noninteractive sudo apt-get install -yq curl") - if err != nil { - return err - - } - if err := cmd.Run(); err != nil { - return err - - } return nil }