func sshAvailableFunc(h *Host) func() bool { return func() bool { log.Debug("Getting to WaitForSSH function...") hostname, err := h.Driver.GetSSHHostname() if err != nil { log.Debugf("Error getting IP address waiting for SSH: %s", err) return false } port, err := h.Driver.GetSSHPort() if err != nil { log.Debugf("Error getting SSH port: %s", err) return false } if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", hostname, port)); err != nil { log.Debugf("Error waiting for TCP waiting for SSH: %s", err) return false } cmd, err := h.GetSSHCommand("exit 0") if err != nil { log.Debugf("Error getting ssh command 'exit 0' : %s", err) return false } if err := cmd.Run(); err != nil { log.Debugf("Error running ssh command 'exit 0' : %s", err) return false } return true } }
func (d *Driver) Start() error { if err := vbm("startvm", d.MachineName, "--type", "headless"); err != nil { return err } log.Infof("Waiting for VM to start...") return ssh.WaitForTCP(fmt.Sprintf("localhost:%d", d.SSHPort)) }
func (d *Driver) Create() error { log.Infof("Creating SSH key...") key, err := d.createSSHKey() if err != nil { return err } spec := d.buildHostSpec() spec.SshKeys = []*SshKey{key} id, err := d.getClient().VirtualGuest().Create(spec) if err != nil { return fmt.Errorf("Error creating host: %q", err) } d.Id = id 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 }
func sshAvailableFunc(d Driver) func() bool { return func() bool { log.Debug("Getting to WaitForSSH function...") hostname, err := d.GetSSHHostname() if err != nil { log.Debugf("Error getting IP address waiting for SSH: %s", err) return false } port, err := d.GetSSHPort() if err != nil { log.Debugf("Error getting SSH port: %s", err) return false } if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", hostname, port)); err != nil { log.Debugf("Error waiting for TCP waiting for SSH: %s", err) return false } if _, err := RunSSHCommandFromDriver(d, "exit 0"); err != nil { log.Debugf("Error getting ssh command 'exit 0' : %s", err) return false } return true } }
func (driver *Driver) waitForSSH() error { log.Infof("Waiting for SSH...") err := ssh.WaitForTCP(fmt.Sprintf("%s:%v", driver.getHostname(), driver.SSHPort)) if err != nil { return err } 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) wait() error { log.Infof("Waiting for host to start...") for { ip, _ := d.GetIP() if ip != "" { break } 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)) }
func (d *Driver) Start() error { s, err := d.GetState() if err != nil { return err } if s == state.Stopped { // check network to re-create if needed if err := d.setupHostOnlyNetwork(d.MachineName); err != nil { return fmt.Errorf("Error setting up host only network on machine start: %s", err) } } switch s { case state.Stopped, state.Saved: d.SSHPort, err = setPortForwarding(d.MachineName, 1, "ssh", "tcp", 22, d.SSHPort) if err != nil { return err } if err := vbm("startvm", d.MachineName, "--type", "headless"); err != nil { return err } log.Infof("Starting VM...") case state.Paused: if err := vbm("controlvm", d.MachineName, "resume", "--type", "headless"); err != nil { return err } log.Infof("Resuming VM ...") default: log.Infof("VM not in restartable state") } addr, err := d.GetSSHHostname() if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", addr, d.SSHPort)); err != nil { return err } // Bail if we don't get an IP from DHCP after a given number of seconds. if err := utils.WaitForSpecific(d.hostOnlyIpAvailable, 5, 4*time.Second); err != nil { return err } return err }
func (d *Driver) wait(timeout time.Duration) (err error) { log.Infof("Waiting for VM to start...") ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() out := make(chan error, 1) go func(ctx context.Context, out chan<- error) { var ip string for { ip, _ = d.GetIP() if ip != "" { break } if t, ok := ctx.Deadline(); ok && time.Now().After(t) { out <- fmt.Errorf("Wait GetIP timed out") return } time.Sleep(1 * time.Second) } port, err := d.GetSSHPort() if err != nil { out <- err return } addr := fmt.Sprintf("%s:%d", ip, port) log.Infof("Got VM address(%v), Now waiting for SSH", addr) out <- ssh.WaitForTCP(addr) }(ctx, out) select { case err := <-out: return err case <-ctx.Done(): return fmt.Errorf("Wait for VM to start timed out: %v", ctx.Err()) } return nil }
func (d *Driver) Start() error { s, err := d.GetState() if err != nil { return err } switch s { case state.Stopped, state.Saved: if err := vbm("startvm", d.MachineName, "--type", "headless"); err != nil { return err } log.Infof("Waiting for VM to start...") case state.Paused: if err := vbm("controlvm", d.MachineName, "resume", "--type", "headless"); err != nil { return err } log.Infof("Resuming VM ...") default: log.Infof("VM not in restartable state") } return ssh.WaitForTCP(fmt.Sprintf("localhost:%d", d.SSHPort)) }
func (d *Driver) Create() error { if err := d.setUserSubscription(); err != nil { return err } log.Info("Creating Azure machine...") vmConfig, err := vmClient.CreateAzureVMConfiguration(d.MachineName, d.Size, d.Image, d.Location) if err != nil { return err } log.Debug("Generating certificate for Azure...") if err := d.generateCertForAzure(); err != nil { return err } log.Debug("Adding Linux provisioning...") vmConfig, err = vmClient.AddAzureLinuxProvisioningConfig(vmConfig, d.GetSSHUsername(), d.UserPassword, d.azureCertPath(), d.SSHPort) if err != nil { return err } log.Debug("Authorizing ports...") if err := d.addDockerEndpoint(vmConfig); err != nil { return err } log.Debug("Creating VM...") if err := vmClient.CreateAzureVM(vmConfig, d.MachineName, d.Location); err != nil { 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)) }
func (d *Driver) uploadKeyPair() error { ipAddr := d.IPAddress port, _ := d.GetSSHPort() tcpAddr := fmt.Sprintf("%s:%d", ipAddr, port) ssh.WaitForTCP(tcpAddr) auth := ssh.Auth{ Passwords: []string{d.SSHPassword}, } sshClient, err := ssh.NewClient(d.GetSSHUsername(), ipAddr, port, &auth) if err != nil { return err } command := fmt.Sprintf("mkdir -p ~/.ssh; echo '%s' > ~/.ssh/authorized_keys", string(d.PublicKey)) log.Debugf("Upload the public key with command: %s", command) output, err := sshClient.Output(command) log.Debugf("Upload command err, output: %v: %s", err, output) if err != nil { return err } log.Debugf("Upload the public key with command: %s", command) fixRoutingRules(sshClient) return nil }
func (d *Driver) Create() error { d.setDropletNameIfNotSet() log.Infof("Creating SSH key...") key, err := d.createSSHKey() if err != nil { return err } d.SSHKeyID = key.ID log.Infof("Creating Digital Ocean droplet...") client := d.getClient() createRequest := &godo.DropletCreateRequest{ Image: d.Image, Name: d.DropletName, Region: d.Region, Size: d.Size, SSHKeys: []interface{}{d.SSHKeyID}, } newDroplet, _, err := client.Droplets.Create(createRequest) if err != nil { return err } d.DropletID = newDroplet.Droplet.ID for { newDroplet, _, err = client.Droplets.Get(d.DropletID) if err != nil { return err } for _, network := range newDroplet.Droplet.Networks.V4 { if network.Type == "public" { d.IPAddress = network.IPAddress } } if d.IPAddress != "" { break } time.Sleep(1 * time.Second) } log.Debugf("Created droplet ID %d, IP address %s", newDroplet.Droplet.ID, d.IPAddress) log.Infof("Waiting for SSH...") if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", d.IPAddress, 22)); err != nil { return err } log.Debugf("HACK: Downloading version of Docker with identity auth...") cmd, err := d.GetSSHCommand("stop docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } cmd, err = d.GetSSHCommand("curl -sS https://ehazlett.s3.amazonaws.com/public/docker/linux/docker-1.4.1-136b351e-identity > /usr/bin/docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } log.Debugf("Updating /etc/default/docker to use identity auth...") cmd, err = d.GetSSHCommand("echo 'export DOCKER_OPTS=\"--auth=identity --host=tcp://0.0.0.0:2376\"' >> /etc/default/docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } log.Debugf("Adding key to authorized-keys.d...") if err := drivers.AddPublicKeyToAuthorizedHosts(d, "/.docker/authorized-keys.d"); err != nil { return err } cmd, err = d.GetSSHCommand("start docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } 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) Create() error { key, err := d.createSSHKey() if err != nil { return err } p, err := govcloudair.NewClient() if err != nil { return err } log.Infof("Connecting to vCloud Air...") // Authenticate to vCloud Air v, err := p.Authenticate(d.UserName, d.UserPassword, d.ComputeID, d.VDCID) if err != nil { return err } // Find VDC Network net, err := v.FindVDCNetwork(d.OrgVDCNet) if err != nil { return err } // Find our Edge Gateway edge, err := v.FindEdgeGateway(d.EdgeGateway) if err != nil { return err } // Get the Org our VDC belongs to org, err := v.GetVDCOrg() if err != nil { return err } // Find our Catalog cat, err := org.FindCatalog(d.Catalog) if err != nil { return err } // Find our Catalog Item cati, err := cat.FindCatalogItem(d.CatalogItem) if err != nil { return err } // Fetch the vApp Template in the Catalog Item vapptemplate, err := cati.GetVAppTemplate() if err != nil { return err } // Create a new empty vApp vapp := govcloudair.NewVApp(p) log.Infof("Creating a new vApp: %s...", d.MachineName) // Compose the vApp with ComposeVApp task, err := vapp.ComposeVApp(net, vapptemplate, d.MachineName, "Container Host created with Docker Host") if err != nil { return err } // Wait for the creation to be completed if err = task.WaitTaskCompletion(); err != nil { return err } task, err = vapp.ChangeCPUcount(d.CPUCount) if err != nil { return err } if err = task.WaitTaskCompletion(); err != nil { return err } task, err = vapp.ChangeMemorySize(d.MemorySize) if err != nil { return err } if err = task.WaitTaskCompletion(); err != nil { return err } sshCustomScript := "echo \"" + strings.TrimSpace(key) + "\" > /root/.ssh/authorized_keys" task, err = vapp.RunCustomizationScript(d.MachineName, sshCustomScript) if err != nil { return err } if err = task.WaitTaskCompletion(); err != nil { return err } task, err = vapp.PowerOn() if err != nil { return err } log.Infof("Waiting for the VM to power on and run the customization script...") if err = task.WaitTaskCompletion(); err != nil { return err } log.Infof("Creating NAT and Firewall Rules on %s...", d.EdgeGateway) task, err = edge.Create1to1Mapping(vapp.VApp.Children.VM[0].NetworkConnectionSection.NetworkConnection.IPAddress, d.PublicIP, d.MachineName) if err != nil { return err } if err = task.WaitTaskCompletion(); err != nil { 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 { return err } // Set VAppID with ID of the created VApp d.VAppID = vapp.VApp.ID return nil }
func (d *Driver) Create() error { log.Infof("Launching instance...") if err := d.createKeyPair(); err != nil { fmt.Errorf("unable to create key pair: %s", err) } group, err := d.createSecurityGroup() if err != nil { return err } bdm := &amz.BlockDeviceMapping{ DeviceName: "/dev/sda1", VolumeSize: d.RootSize, DeleteOnTermination: true, VolumeType: "gp2", } // get the subnet id regionZone := d.Region + d.Zone subnetId := d.SubnetId if d.SubnetId == "" { subnets, err := d.getClient().GetSubnets() if err != nil { return err } for _, s := range subnets { if s.AvailabilityZone == regionZone { subnetId = s.SubnetId break } } } if subnetId == "" { return fmt.Errorf("unable to find a subnet in the zone: %s", regionZone) } log.Debugf("launching instance in subnet %s", subnetId) instance, err := d.getClient().RunInstance(d.AMI, d.InstanceType, d.Zone, 1, 1, group.GroupId, d.KeyName, subnetId, bdm) if err != nil { return fmt.Errorf("Error launching instance: %s", err) } d.InstanceId = instance.InstanceId d.waitForInstance() log.Debugf("created instance ID %s, IP address %s", d.InstanceId, d.IPAddress) log.Infof("Waiting for SSH...") if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", d.IPAddress, 22)); err != nil { return err } log.Debugf("Installing Docker") cmd, err := d.GetSSHCommand("if [ ! -e /usr/bin/docker ]; then curl get.docker.io | sudo sh -; fi") if err != nil { return err } if err := cmd.Run(); err != nil { return err } cmd, err = d.GetSSHCommand("sudo stop docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } log.Debugf("HACK: Downloading version of Docker with identity auth...") cmd, err = d.GetSSHCommand("sudo curl -sS -o /usr/bin/docker https://ehazlett.s3.amazonaws.com/public/docker/linux/docker-1.4.1-136b351e-identity") if err != nil { return err } if err := cmd.Run(); err != nil { return err } log.Debugf("Updating /etc/default/docker to use identity auth...") cmd, err = d.GetSSHCommand("echo 'export DOCKER_OPTS=\"--auth=identity --host=tcp://0.0.0.0:2376 --auth-authorized-dir=/root/.docker/authorized-keys.d\"' | sudo tee -a /etc/default/docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } // HACK: create dir for ubuntu user to access log.Debugf("Adding key to authorized-keys.d...") cmd, err = d.GetSSHCommand("sudo mkdir -p /root/.docker && sudo chown -R ubuntu /root/.docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } f, err := os.Open(filepath.Join(os.Getenv("HOME"), ".docker/public-key.json")) if err != nil { return err } defer f.Close() cmdString := fmt.Sprintf("sudo mkdir -p %q && sudo tee -a %q", "/root/.docker/authorized-keys.d", "/root/.docker/authorized-keys.d/docker-host.json") cmd, err = d.GetSSHCommand(cmdString) if err != nil { return err } cmd.Stdin = f if err := cmd.Run(); err != nil { return err } cmd, err = d.GetSSHCommand("sudo start docker") if err != nil { return err } if err := cmd.Run(); err != nil { return err } return nil }
func (d *Driver) Create() error { if err := d.checkPrereqs(); err != nil { return err } log.Infof("Launching instance...") if err := d.createKeyPair(); err != nil { return fmt.Errorf("unable to create key pair: %s", err) } if err := d.configureSecurityGroup(d.SecurityGroupName); err != nil { return err } bdm := &amz.BlockDeviceMapping{ DeviceName: "/dev/sda1", VolumeSize: d.RootSize, DeleteOnTermination: true, VolumeType: "gp2", } log.Debugf("launching instance in subnet %s", d.SubnetId) var instance amz.EC2Instance if d.RequestSpotInstance { spotInstanceRequestId, err := d.getClient().RequestSpotInstances(d.AMI, d.InstanceType, d.Zone, 1, d.SecurityGroupId, d.KeyName, d.SubnetId, bdm, d.IamInstanceProfile, d.SpotPrice) if err != nil { return fmt.Errorf("Error request spot instance: %s", err) } var instanceId string var spotInstanceRequestStatus string log.Info("Waiting for spot instance...") // check until fulfilled for instanceId == "" { time.Sleep(time.Second * 5) spotInstanceRequestStatus, instanceId, err = d.getClient().DescribeSpotInstanceRequests(spotInstanceRequestId) if err != nil { return fmt.Errorf("Error describe spot instance request: %s", err) } log.Debugf("spot instance request status: %s", spotInstanceRequestStatus) } instance, err = d.getClient().GetInstance(instanceId) if err != nil { return fmt.Errorf("Error get instance: %s", err) } } else { inst, err := d.getClient().RunInstance(d.AMI, d.InstanceType, d.Zone, 1, 1, d.SecurityGroupId, d.KeyName, d.SubnetId, bdm, d.IamInstanceProfile) if err != nil { return fmt.Errorf("Error launching instance: %s", err) } instance = inst } d.InstanceId = instance.InstanceId log.Debug("waiting for ip address to become available") if err := utils.WaitFor(d.instanceIpAvailable); err != nil { return err } if len(instance.NetworkInterfaceSet) > 0 { d.PrivateIPAddress = instance.NetworkInterfaceSet[0].PrivateIpAddress } d.waitForInstance() log.Debugf("created instance ID %s, IP address %s, Private IP address %s", d.InstanceId, d.IPAddress, 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, } if err := d.getClient().CreateTags(d.InstanceId, tags); err != nil { return err } return nil }
// 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)) }
func (d *Driver) Create() error { if err := d.checkPrereqs(); err != nil { return err } log.Infof("Launching instance...") if err := d.createKeyPair(); err != nil { return fmt.Errorf("unable to create key pair: %s", err) } if err := d.configureSecurityGroup(d.SecurityGroupName); err != nil { return err } bdm := &amz.BlockDeviceMapping{ DeviceName: "/dev/sda1", VolumeSize: d.RootSize, DeleteOnTermination: true, VolumeType: "gp2", } log.Debugf("launching instance in subnet %s", d.SubnetId) instance, err := d.getClient().RunInstance(d.AMI, d.InstanceType, d.Zone, 1, 1, d.SecurityGroupId, d.KeyName, d.SubnetId, bdm, d.IamInstanceProfile) if err != nil { return fmt.Errorf("Error launching instance: %s", err) } d.InstanceId = instance.InstanceId log.Debug("waiting for ip address to become available") if err := utils.WaitFor(d.instanceIpAvailable); err != nil { return err } if len(instance.NetworkInterfaceSet) > 0 { d.PrivateIPAddress = instance.NetworkInterfaceSet[0].PrivateIpAddress } d.waitForInstance() log.Debugf("created instance ID %s, IP address %s, Private IP address %s", d.InstanceId, d.IPAddress, 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, } if err = d.getClient().CreateTags(d.InstanceId, tags); err != nil { return err } return nil }
func (driver *Driver) Create() error { if err := driver.setUserSubscription(); err != nil { return err } log.Infof("Creating Azure host...") vmConfig, err := vmClient.CreateAzureVMConfiguration(driver.Name, driver.Size, driver.Image, driver.Location) if err != nil { return err } if err := driver.generateCertForAzure(); err != nil { return err } vmConfig, err = vmClient.AddAzureLinuxProvisioningConfig(vmConfig, driver.UserName, driver.UserPassword, driver.azureCertPath(), driver.SSHPort) if err != nil { return err } if err := driver.addDockerEndpoint(vmConfig); err != nil { return err } if err := vmClient.CreateAzureVM(vmConfig, driver.Name, driver.Location); err != nil { return err } log.Infof("Waiting for SSH...") if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", driver.getHostname(), driver.SSHPort)); err != nil { return err } cmd, err := driver.GetSSHCommand("if [ ! -e /usr/bin/docker ]; then curl get.docker.io | sudo sh -; fi") if err := cmd.Run(); err != nil { return err } cmd, err = driver.GetSSHCommand("sudo stop docker") if err := cmd.Run(); err != nil { return err } log.Debugf("HACK: Downloading version of Docker with identity auth...") cmd, err = driver.GetSSHCommand("sudo curl -sS -o /usr/bin/docker https://bfirsh.s3.amazonaws.com/docker/docker-1.3.1-dev-identity-auth") if err := cmd.Run(); err != nil { return err } log.Debugf("Updating /etc/default/docker to use identity auth...") cmd, err = driver.GetSSHCommand("echo 'export DOCKER_OPTS=\"--auth=identity --host=tcp://0.0.0.0:2376 --auth-authorized-dir=/root/.docker/authorized-keys.d\"' | sudo tee -a /etc/default/docker") if err := cmd.Run(); err != nil { return err } log.Debugf("Adding key to authorized-keys.d...") // HACK: temporarily chown to ssh user for providers using non-root accounts cmd, err = driver.GetSSHCommand(fmt.Sprintf("sudo mkdir -p /root/.docker && sudo chown -R %s /root/.docker", driver.UserName)) if err := cmd.Run(); err != nil { return err } f, err := os.Open(filepath.Join(os.Getenv("HOME"), ".docker/public-key.json")) if err != nil { return err } defer f.Close() cmdString := fmt.Sprintf("sudo mkdir -p %q && sudo tee -a %q", "/root/.docker/authorized-keys.d", "/root/.docker/authorized-keys.d/docker-host.json") cmd, err = driver.GetSSHCommand(cmdString) cmd.Stdin = f if err := cmd.Run(); err != nil { return err } // HACK: change back ownership cmd, err = driver.GetSSHCommand("sudo mkdir -p /root/.docker && sudo chown -R root /root/.docker") if err := cmd.Run(); err != nil { return err } cmd, err = driver.GetSSHCommand("sudo start docker") if err := cmd.Run(); err != nil { return err } return nil }
func (d *Driver) Create() error { // Create SSH key log.Debugf("Creating ssh key --- \n") if err := d.createSSHKey(); err != nil { return err } return nil // Create instance log.Info("Creating ECS instance...") createResp, err := d.getClient().Instance.CreateInstance(map[string]string{ "RegionId": d.RegionId, "SecurityGroupId": d.SecurityGroupId, "ImageId": d.ImageId, "InstanceType": d.InstanceTypeId, "InstanceName": d.MachineName, "InternetMaxBandwidthOut": d.BandwidthOut, "Password": d.SSHPass, }) if err != nil { return err } d.InstanceId = createResp.InstanceId // Allocate public ip address log.Info("Allocating public IP address...") ipResp, err := d.getClient().Network.AllocatePublicIpAddress(map[string]string{ "InstanceId": d.InstanceId, }) if err != nil { return nil } d.IPAddress = ipResp.IpAddress // Start instance log.Info("Starting instance, this may take several minutes...") _, err = d.getClient().Instance.StartInstance(map[string]string{ "InstanceId": d.InstanceId, }) if err != nil { return err } // Get private IP address statusResp, err := d.getClient().Instance.DescribeInstanceAttribute(map[string]string{ "InstanceId": d.InstanceId, }) if err != nil { return err } if ips := statusResp.InnerIpAddress.AllIpAddress; len(ips) > 0 { d.PrivateIPAddress = ips[0] } // Wait for instance to start if err := utils.WaitFor(d.waitToStartInstance); err != nil { return err } //TODO 暂时处理:等待20秒,主机真正启动 time.Sleep(20 * time.Second) // Wait for ssh available port, e := d.GetSSHPort() if e != nil { return e } ip, e := d.GetIP() if e != nil { return e } if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", ip, port)); err != nil { return err } // Upload SSH key to host log.Info("Upload SSH key to machine...") if err := d.uploadKeyPair(); err != nil { return err } log.Infof("Created Instance ID %s, Public IP address %s, Private IP address %s", d.InstanceId, d.IPAddress, d.PrivateIPAddress, ) return nil }