func DetectProvisioner(d drivers.Driver) (Provisioner, error) { var ( osReleaseOut bytes.Buffer ) catOsReleaseCmd, err := drivers.GetSSHCommandFromDriver(d, "cat /etc/os-release") if err != nil { return nil, fmt.Errorf("Error getting SSH command: %s", err) } // Normally I would just use Output() for this, but d.GetSSHCommand // defaults to sending the output of the command to stdout in debug // mode, so that will be broken if we don't set it ourselves. catOsReleaseCmd.Stdout = &osReleaseOut if err := catOsReleaseCmd.Run(); err != nil { return nil, fmt.Errorf("Error running SSH command to get /etc/os-release: %s", err) } osReleaseInfo, err := NewOsRelease(osReleaseOut.Bytes()) if err != nil { return nil, fmt.Errorf("Error parsing /etc/os-release file: %s", err) } for _, p := range provisioners { provisioner := p.New(d) provisioner.SetOsReleaseInfo(osReleaseInfo) if provisioner.CompatibleWithHost() { return provisioner, nil } } return nil, ErrDetectionFailed }
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 (d *Driver) GetIP() (string, error) { // DHCP is used to get the IP, so virtualbox hosts don't have IPs unless // they are running s, err := d.GetState() if err != nil { return "", err } if s != state.Running { return "", drivers.ErrHostIsNotRunning } cmd, err := drivers.GetSSHCommandFromDriver(d, "ip addr show dev eth1") if err != nil { return "", err } // reset to nil as if using from Host Stdout is already set when using DEBUG cmd.Stdout = nil b, err := cmd.Output() if err != nil { return "", err } out := string(b) log.Debugf("SSH returned: %s\nEND SSH\n", out) // parse to find: inet 192.168.59.103/24 brd 192.168.59.255 scope global eth1 lines := strings.Split(out, "\n") for _, line := range lines { vals := strings.Split(strings.TrimSpace(line), " ") if len(vals) >= 2 && vals[0] == "inet" { return vals[1][:strings.Index(vals[1], "/")], nil } } return "", fmt.Errorf("No IP address found %s", out) }
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 (provisioner *UbuntuProvisioner) SSHCommand(args ...string) (*exec.Cmd, error) { return drivers.GetSSHCommandFromDriver(provisioner.Driver, args...) }