|
@@ -0,0 +1,118 @@
|
|
|
+package container
|
|
|
+
|
|
|
+import (
|
|
|
+ "strings"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/docker/docker/daemon"
|
|
|
+ "github.com/docker/docker/pkg/stringid"
|
|
|
+ "github.com/docker/swarmkit/api"
|
|
|
+)
|
|
|
+
|
|
|
+func newTestControllerWithMount(m api.Mount) (*controller, error) {
|
|
|
+ return newController(&daemon.Daemon{}, &api.Task{
|
|
|
+ ID: stringid.GenerateRandomID(),
|
|
|
+ ServiceID: stringid.GenerateRandomID(),
|
|
|
+ Spec: api.TaskSpec{
|
|
|
+ Runtime: &api.TaskSpec_Container{
|
|
|
+ Container: &api.ContainerSpec{
|
|
|
+ Image: "image_name",
|
|
|
+ Labels: map[string]string{
|
|
|
+ "com.docker.swarm.task.id": "id",
|
|
|
+ },
|
|
|
+ Mounts: []api.Mount{m},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func TestControllerValidateMountBind(t *testing.T) {
|
|
|
+ // with improper source
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeBind,
|
|
|
+ Source: "foo",
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err == nil || !strings.Contains(err.Error(), "invalid bind mount source") {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with proper source
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeBind,
|
|
|
+ Source: testAbsPath,
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err != nil {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControllerValidateMountVolume(t *testing.T) {
|
|
|
+ // with improper source
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeVolume,
|
|
|
+ Source: testAbsPath,
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err == nil || !strings.Contains(err.Error(), "invalid volume mount source") {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with proper source
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeVolume,
|
|
|
+ Source: "foo",
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err != nil {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControllerValidateMountTarget(t *testing.T) {
|
|
|
+ // with improper target
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeBind,
|
|
|
+ Source: testAbsPath,
|
|
|
+ Target: "foo",
|
|
|
+ }); err == nil || !strings.Contains(err.Error(), "invalid mount target") {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with proper target
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeBind,
|
|
|
+ Source: testAbsPath,
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err != nil {
|
|
|
+ t.Fatalf("expected no error, got: %v", err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControllerValidateMountTmpfs(t *testing.T) {
|
|
|
+ // with improper target
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeTmpfs,
|
|
|
+ Source: "foo",
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err == nil || !strings.Contains(err.Error(), "invalid tmpfs source") {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // with proper target
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.MountTypeTmpfs,
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err != nil {
|
|
|
+ t.Fatalf("expected no error, got: %v", err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestControllerValidateMountInvalidType(t *testing.T) {
|
|
|
+ // with improper target
|
|
|
+ if _, err := newTestControllerWithMount(api.Mount{
|
|
|
+ Type: api.Mount_MountType(9999),
|
|
|
+ Source: "foo",
|
|
|
+ Target: testAbsPath,
|
|
|
+ }); err == nil || !strings.Contains(err.Error(), "invalid mount type") {
|
|
|
+ t.Fatalf("expected error, got: %v", err)
|
|
|
+ }
|
|
|
+}
|