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.addDockerEndpoints(vmConfig); err != nil { return err } log.Debug("Creating VM...") if err := vmClient.CreateAzureVM(vmConfig, d.MachineName, d.Location); err != nil { return err } return nil }
func (d *Driver) hostOnlyIpAvailable() bool { ip, err := d.GetIP() if err != nil { log.Debug("ERROR getting IP: %s", err) return false } if ip != "" { log.Debugf("IP is %s", ip) return true } log.Debug("Strangely, there was no error attempting to get the IP, but it was still empty.") return false }
func NewClient(user string, host string, port int, auth *Auth) (Client, error) { sshBinaryPath, err := exec.LookPath("ssh") if err != nil { log.Debug("SSH binary not found, using native Go implementation") return NewNativeClient(user, host, port, auth) } if defaultClientType == Native { log.Debug("Using SSH client type: native") return NewNativeClient(user, host, port, auth) } log.Debug("Using SSH client type: external") return NewExternalClient(sshBinaryPath, user, host, port, auth) }
func (e *EC2) awsApiCall(v url.Values) (*http.Response, error) { v.Set("Version", "2014-06-15") log.Debug("Making AWS API call with values:") mcnutils.DumpVal(v) client := &http.Client{} finalEndpoint := fmt.Sprintf("%s?%s", e.Endpoint, v.Encode()) req, err := http.NewRequest("GET", finalEndpoint, nil) if err != nil { return &http.Response{}, fmt.Errorf("error creating request from client") } req.Header.Add("Content-type", "application/json") awsauth.Sign4(req, awsauth.Credentials{ AccessKeyID: e.Auth.AccessKey, SecretAccessKey: e.Auth.SecretKey, SecurityToken: e.Auth.SessionToken, }) resp, err := client.Do(req) if err != nil { fmt.Printf("client encountered error while doing the request: %s", err.Error()) return resp, fmt.Errorf("client encountered error while doing the request: %s", err) } if resp.StatusCode != http.StatusOK { return resp, newAwsApiResponseError(*resp) } return resp, 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 (provisioner *DebianProvisioner) Provision(swarmOptions swarm.SwarmOptions, authOptions auth.AuthOptions, engineOptions engine.EngineOptions) error { provisioner.SwarmOptions = swarmOptions provisioner.AuthOptions = authOptions provisioner.EngineOptions = engineOptions if provisioner.EngineOptions.StorageDriver == "" { provisioner.EngineOptions.StorageDriver = "aufs" } // HACK: since debian does not come with sudo by default we install log.Debug("installing sudo") if _, err := provisioner.SSHCommand("if ! type sudo; then apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y sudo; fi"); err != nil { return err } log.Debug("setting hostname") if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil { return err } log.Debug("installing base packages") for _, pkg := range provisioner.Packages { if err := provisioner.Package(pkg, pkgaction.Install); err != nil { return err } } log.Debug("installing docker") if err := installDockerGeneric(provisioner, engineOptions.InstallURL); err != nil { return err } log.Debug("waiting for docker daemon") if err := mcnutils.WaitFor(provisioner.dockerDaemonResponding); err != nil { return err } provisioner.AuthOptions = setRemoteAuthOptions(provisioner) log.Debug("configuring auth") if err := ConfigureAuth(provisioner); err != nil { return err } log.Debug("configuring swarm") if err := configureSwarm(provisioner, swarmOptions, provisioner.AuthOptions); err != nil { return err } // enable in systemd log.Debug("enabling docker in systemd") if err := provisioner.Service("docker", pkgaction.Enable); err != nil { return err } return nil }
func (d *Driver) Kill() error { log.Debug("Killing...") if _, err := drivers.RunSSHCommandFromDriver(d, "sudo shutdown -P now"); err != nil { return err } return nil }
func (d *Driver) Restart() error { log.Debug("Restarting...") if _, err := drivers.RunSSHCommandFromDriver(d, "sudo shutdown -r now"); err != nil { return err } return nil }
func DumpVal(vals ...interface{}) { for _, val := range vals { prettyJSON, err := json.MarshalIndent(val, "", " ") if err != nil { log.Fatal(err) } log.Debug(string(prettyJSON)) } }
func (d *Driver) instanceIsRunning() bool { st, err := d.GetState() if err != nil { log.Debug(err) } if st == state.Running { return true } return false }
func (d *Driver) securityGroupAvailableFunc(id string) func() bool { return func() bool { _, err := d.getClient().GetSecurityGroupById(id) if err == nil { return true } log.Debug(err) return false } }
func (client ExternalClient) Shell() error { cmd := exec.Command(client.BinaryPath, client.BaseArgs...) log.Debug(cmd) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() }
func (client ExternalClient) Output(command string) (string, error) { args := append(client.BaseArgs, command) cmd := exec.Command(client.BinaryPath, args...) log.Debug(cmd) // Allow piping of local things to remote commands. cmd.Stdin = os.Stdin output, err := cmd.CombinedOutput() return string(output), err }
func (d *Driver) instanceIpAvailable() bool { ip, err := d.GetIP() if err != nil { log.Debug(err) } if ip != "" { d.IPAddress = ip log.Debugf("Got the IP Address, it's %q", d.IPAddress) return true } return false }
func (provisioner *RedHatProvisioner) installOfficialDocker() error { log.Debug("installing docker") if err := provisioner.ConfigurePackageList(); err != nil { return err } if _, err := provisioner.SSHCommand("sudo yum install -y docker-engine"); err != nil { return err } return nil }
func (osr *OsRelease) ParseOsRelease(osReleaseContents []byte) error { r := bytes.NewReader(osReleaseContents) scanner := bufio.NewScanner(r) for scanner.Scan() { key, val, err := parseLine(scanner.Text()) if err != nil { log.Warn("Warning: got an invalid line error parsing /etc/os-release: %s", err) continue } if err := osr.setIfPossible(key, val); err != nil { log.Debug(err) } } return nil }
func (d *Driver) GetState() (state.State, error) { p, err := govcloudair.NewClient() if err != nil { return state.Error, err } log.Debug("Connecting to vCloud Air to fetch vApp Status...") // Authenticate to vCloud Air v, err := p.Authenticate(d.UserName, d.UserPassword, d.ComputeID, d.VDCID) if err != nil { return state.Error, err } vapp, err := v.FindVAppByID(d.VAppID) if err != nil { return state.Error, err } status, err := vapp.GetStatus() if err != nil { return state.Error, err } if err = p.Disconnect(); err != nil { return state.Error, err } switch status { case "POWERED_ON": return state.Running, nil case "POWERED_OFF": return state.Stopped, nil } return state.None, 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, d.Monitoring) 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, d.PrivateIPOnly, d.Monitoring) 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 := mcnutils.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.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 configureSwarm(p Provisioner, swarmOptions swarm.SwarmOptions, authOptions auth.AuthOptions) error { if !swarmOptions.IsSwarm { return nil } ip, err := p.GetDriver().GetIP() if err != nil { return err } u, err := url.Parse(swarmOptions.Host) if err != nil { return err } parts := strings.Split(u.Host, ":") port := parts[1] dockerDir := p.GetDockerOptionsDir() swarmCmdContext := SwarmCommandContext{ ContainerName: "", DockerDir: dockerDir, DockerPort: 2376, Ip: ip, Port: port, AuthOptions: authOptions, SwarmOptions: swarmOptions, SwarmImage: swarmOptions.Image, } // First things first, get the swarm image. if _, err := p.SSHCommand(fmt.Sprintf("sudo docker pull %s", swarmOptions.Image)); err != nil { return err } swarmMasterCmdTemplate := `sudo docker run -d \ --restart=always \ --name swarm-agent-master \ -p {{.Port}}:{{.Port}} \ -v {{.DockerDir}}:{{.DockerDir}} \ {{.SwarmImage}} \ manage \ --tlsverify \ --tlscacert={{.AuthOptions.CaCertRemotePath}} \ --tlscert={{.AuthOptions.ServerCertRemotePath}} \ --tlskey={{.AuthOptions.ServerKeyRemotePath}} \ -H {{.SwarmOptions.Host}} \ --strategy {{.SwarmOptions.Strategy}} {{range .SwarmOptions.ArbitraryFlags}} --{{.}}{{end}} {{.SwarmOptions.Discovery}} ` swarmWorkerCmdTemplate := `sudo docker run -d \ --restart=always \ --name swarm-agent \ {{.SwarmImage}} \ join --advertise {{.Ip}}:{{.DockerPort}} {{.SwarmOptions.Discovery}} ` if swarmOptions.Master { log.Debug("Launching swarm master") if err := runSwarmCommandFromTemplate(p, swarmMasterCmdTemplate, swarmCmdContext); err != nil { return err } } log.Debug("Launch swarm worker") if err := runSwarmCommandFromTemplate(p, swarmWorkerCmdTemplate, swarmCmdContext); err != nil { return err } return nil }