Просмотр исходного кода

Adding unit test for bind mount creation

Signed-off-by: Guillaume Tardif <[email protected]>
Guillaume Tardif 5 лет назад
Родитель
Сommit
0b2eaede8c
2 измененных файлов с 45 добавлено и 19 удалено
  1. 27 19
      local/compose.go
  2. 18 0
      local/compose_test.go

+ 27 - 19
local/compose.go

@@ -873,30 +873,38 @@ func buildContainerMountOptions(p *types.Project, s types.ServiceConfig, inherit
 		if contains(inherited, v.Target) {
 			continue
 		}
-		source := v.Source
-		if v.Type == "bind" && !filepath.IsAbs(source) {
-			// volume source has already been prefixed with workdir if required, by compose-go project loader
-			var err error
-			source, err = filepath.Abs(source)
-			if err != nil {
-				return nil, err
-			}
+		mount, err := buildMount(v)
+		if err != nil {
+			return nil, err
 		}
-
-		mounts = append(mounts, mount.Mount{
-			Type:          mount.Type(v.Type),
-			Source:        source,
-			Target:        v.Target,
-			ReadOnly:      v.ReadOnly,
-			Consistency:   mount.Consistency(v.Consistency),
-			BindOptions:   buildBindOption(v.Bind),
-			VolumeOptions: buildVolumeOptions(v.Volume),
-			TmpfsOptions:  buildTmpfsOptions(v.Tmpfs),
-		})
+		mounts = append(mounts, mount)
 	}
 	return mounts, nil
 }
 
+func buildMount(volume types.ServiceVolumeConfig) (mount.Mount, error) {
+	source := volume.Source
+	if volume.Type == "bind" && !filepath.IsAbs(source) {
+		// volume source has already been prefixed with workdir if required, by compose-go project loader
+		var err error
+		source, err = filepath.Abs(source)
+		if err != nil {
+			return mount.Mount{}, err
+		}
+	}
+
+	return mount.Mount{
+		Type:          mount.Type(volume.Type),
+		Source:        source,
+		Target:        volume.Target,
+		ReadOnly:      volume.ReadOnly,
+		Consistency:   mount.Consistency(volume.Consistency),
+		BindOptions:   buildBindOption(volume.Bind),
+		VolumeOptions: buildVolumeOptions(volume.Volume),
+		TmpfsOptions:  buildTmpfsOptions(volume.Tmpfs),
+	}, nil
+}
+
 func buildBindOption(bind *types.ServiceVolumeBind) *mount.BindOptions {
 	if bind == nil {
 		return nil

+ 18 - 0
local/compose_test.go

@@ -19,9 +19,13 @@
 package local
 
 import (
+	"os"
+	"path/filepath"
 	"testing"
 
+	composetypes "github.com/compose-spec/compose-go/types"
 	"github.com/docker/docker/api/types"
+	mountTypes "github.com/docker/docker/api/types/mount"
 	"gotest.tools/v3/assert"
 
 	"github.com/docker/compose-cli/api/compose"
@@ -107,3 +111,17 @@ func TestStacksMixedStatus(t *testing.T) {
 	assert.Equal(t, combinedStatus([]string{"running", "running", "running"}), "running(3)")
 	assert.Equal(t, combinedStatus([]string{"running", "exited", "running"}), "exited(1), running(2)")
 }
+
+func TestBuildBindMount(t *testing.T) {
+	volume := composetypes.ServiceVolumeConfig{
+		Type:   composetypes.VolumeTypeBind,
+		Source: "e2e/volume-test",
+		Target: "/data",
+	}
+	mount, err := buildMount(volume)
+	assert.NilError(t, err)
+	assert.Assert(t, filepath.IsAbs(mount.Source))
+	_, err = os.Stat(mount.Source)
+	assert.NilError(t, err)
+	assert.Equal(t, mount.Type, mountTypes.TypeBind)
+}