diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index f97c706852..ee9f1f4fbb 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -290,24 +290,7 @@ func (d *Driver) Create() error { return err } - var shareDir string - - homePath := homedir.Get() - - switch runtime.GOOS { - case "windows": - shareDir = homePath - mountDir, err := translateWindowsMount(homePath) - if err != nil { - return err - } - shareDir = mountDir - case "darwin": - shareDir = homePath - case "linux": - shareDir = homePath - } - + shareDir := homedir.Get() shareName := shareDir log.Debugf("creating share: path=%s", shareDir) @@ -321,12 +304,21 @@ func (d *Driver) Create() error { } if shareDir != "" { + log.Debugf("setting up shareDir") if _, err := os.Stat(shareDir); err != nil && !os.IsNotExist(err) { + log.Debugf("setting up share failed: %s", err) return err } else if !os.IsNotExist(err) { - if shareName != "" { - // parts of the VBox internal code are buggy with share names that start with "/" - shareName = strings.TrimLeft(shareDir, "/") + // parts of the VBox internal code are buggy with share names that start with "/" + shareName = strings.TrimLeft(shareDir, "/") + + // translate to msys git path + if runtime.GOOS == "windows" { + mountName, err := translateWindowsMount(shareDir) + if err != nil { + return err + } + shareName = mountName } log.Debugf("adding shared folder: name=%q dir=%q", shareName, shareDir) diff --git a/libmachine/provision/debian.go b/libmachine/provision/debian.go index 964c75a676..aa0691b600 100644 --- a/libmachine/provision/debian.go +++ b/libmachine/provision/debian.go @@ -44,7 +44,7 @@ func (provisioner *DebianProvisioner) Service(name string, action pkgaction.Serv return err } - command := fmt.Sprintf("sudo systemctl %s %s || true", action.String(), name) + command := fmt.Sprintf("sudo systemctl %s %s", action.String(), name) if _, err := provisioner.SSHCommand(command); err != nil { return err diff --git a/libmachine/provision/utils_test.go b/libmachine/provision/utils_test.go index 10617e638d..7fbae961e6 100644 --- a/libmachine/provision/utils_test.go +++ b/libmachine/provision/utils_test.go @@ -8,11 +8,24 @@ import ( "github.com/docker/machine/drivers/fakedriver" "github.com/docker/machine/libmachine/auth" + "github.com/docker/machine/libmachine/engine" ) +func engineOptions() engine.EngineOptions { + return engine.EngineOptions{ + StorageDriver: "aufs", + } +} + func TestGenerateDockerOptionsBoot2Docker(t *testing.T) { + g := GenericProvisioner{ + Driver: &fakedriver.FakeDriver{}, + EngineOptions: engineOptions(), + } p := &Boot2DockerProvisioner{ - Driver: &fakedriver.FakeDriver{}, + DebianProvisioner{ + g, + }, } dockerPort := 1234 p.AuthOptions = auth.AuthOptions{ @@ -20,37 +33,38 @@ func TestGenerateDockerOptionsBoot2Docker(t *testing.T) { ServerKeyRemotePath: "/test/server-key", ServerCertRemotePath: "/test/server-cert", } - engineConfigPath := "/var/lib/boot2docker/profile" dockerCfg, err := p.GenerateDockerOptions(dockerPort) if err != nil { t.Fatal(err) } - if dockerCfg.EngineOptionsPath != engineConfigPath { - t.Fatalf("expected engine path %s; received %s", engineConfigPath, dockerCfg.EngineOptionsPath) - } - if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("-H tcp://0.0.0.0:%d", dockerPort)) == -1 { t.Fatalf("-H docker port invalid; expected %d", dockerPort) } - if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("CACERT=%s", p.AuthOptions.CaCertRemotePath)) == -1 { - t.Fatalf("CACERT option invalid; expected %s", p.AuthOptions.CaCertRemotePath) + if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("--tlscacert %s", p.AuthOptions.CaCertRemotePath)) == -1 { + t.Fatalf("--tlscacert option invalid; expected %s", p.AuthOptions.CaCertRemotePath) } - if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("SERVERKEY=%s", p.AuthOptions.ServerKeyRemotePath)) == -1 { - t.Fatalf("SERVERKEY option invalid; expected %s", p.AuthOptions.ServerKeyRemotePath) + if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("--tlscert %s", p.AuthOptions.ServerCertRemotePath)) == -1 { + t.Fatalf("--tlscert option invalid; expected %s", p.AuthOptions.ServerCertRemotePath) } - if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("SERVERCERT=%s", p.AuthOptions.ServerCertRemotePath)) == -1 { - t.Fatalf("SERVERCERT option invalid; expected %s", p.AuthOptions.ServerCertRemotePath) + if strings.Index(dockerCfg.EngineOptions, fmt.Sprintf("--tlskey %s", p.AuthOptions.ServerKeyRemotePath)) == -1 { + t.Fatalf("--tlskey option invalid; expected %s", p.AuthOptions.ServerKeyRemotePath) } } func TestMachinePortBoot2Docker(t *testing.T) { + g := GenericProvisioner{ + Driver: &fakedriver.FakeDriver{}, + EngineOptions: engineOptions(), + } p := &Boot2DockerProvisioner{ - Driver: &fakedriver.FakeDriver{}, + DebianProvisioner{ + g, + }, } dockerPort := 2376 bindUrl := fmt.Sprintf("tcp://0.0.0.0:%d", dockerPort) @@ -81,8 +95,14 @@ func TestMachinePortBoot2Docker(t *testing.T) { } func TestMachineCustomPortBoot2Docker(t *testing.T) { + g := GenericProvisioner{ + Driver: &fakedriver.FakeDriver{}, + EngineOptions: engineOptions(), + } p := &Boot2DockerProvisioner{ - Driver: &fakedriver.FakeDriver{}, + DebianProvisioner{ + g, + }, } dockerPort := 3376 bindUrl := fmt.Sprintf("tcp://0.0.0.0:%d", dockerPort) diff --git a/utils/b2d.go b/utils/b2d.go index e49651a2e4..19f9b3c8d3 100644 --- a/utils/b2d.go +++ b/utils/b2d.go @@ -80,7 +80,8 @@ func (b *B2dUtils) GetLatestBoot2DockerReleaseURL() (string, error) { defer rsp.Body.Close() var t []struct { - TagName string `json:"tag_name"` + TagName string `json:"tag_name"` + PreRelease bool `json:"prerelease"` } if err := json.NewDecoder(rsp.Body).Decode(&t); err != nil { return "", fmt.Errorf("Error demarshaling the Github API response: %s\nYou may be getting rate limited by Github.", err) @@ -89,8 +90,15 @@ func (b *B2dUtils) GetLatestBoot2DockerReleaseURL() (string, error) { return "", fmt.Errorf("no releases found") } - tag := t[0].TagName - isoUrl := fmt.Sprintf("%s/boot2docker/boot2docker/releases/download/%s/boot2docker.iso", b.githubBaseUrl, tag) + // find the latest "released" release (i.e. not pre-release) + isoUrl := "" + for _, r := range t { + if !r.PreRelease { + tag := r.TagName + isoUrl = fmt.Sprintf("%s/boot2docker/boot2docker/releases/download/%s/boot2docker.iso", b.githubBaseUrl, tag) + break + } + } return isoUrl, nil } diff --git a/utils/b2d_test.go b/utils/b2d_test.go index 2fe5a38103..67dbf19b42 100644 --- a/utils/b2d_test.go +++ b/utils/b2d_test.go @@ -11,7 +11,7 @@ import ( func TestGetLatestBoot2DockerReleaseUrl(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - respText := `[{"tag_name": "0.1"}]` + respText := `[{"tag_name": "0.2", "prerelease": true, "tag_name": "0.1", "prerelease": false}]` w.Write([]byte(respText)) })) defer ts.Close()