func TestNetworks(t *testing.T) { namespace := Namespace{name: "foo"} source := networkMap{ "normal": composetypes.NetworkConfig{ Driver: "overlay", DriverOpts: map[string]string{ "opt": "value", }, Ipam: composetypes.IPAMConfig{ Driver: "driver", Config: []*composetypes.IPAMPool{ { Subnet: "10.0.0.0", }, }, }, Labels: map[string]string{ "something": "labeled", }, }, "outside": composetypes.NetworkConfig{ External: composetypes.External{ External: true, Name: "special", }, }, } expected := map[string]types.NetworkCreate{ "default": { Labels: map[string]string{ LabelNamespace: "foo", }, }, "normal": { Driver: "overlay", IPAM: &network.IPAM{ Driver: "driver", Config: []network.IPAMConfig{ { Subnet: "10.0.0.0", }, }, }, Options: map[string]string{ "opt": "value", }, Labels: map[string]string{ LabelNamespace: "foo", "something": "labeled", }, }, } networks, externals := Networks(namespace, source) assert.DeepEqual(t, networks, expected) assert.DeepEqual(t, externals, []string{"special"}) }
func TestConvertVolumeToMountNamedVolume(t *testing.T) { stackVolumes := volumes{ "normal": composetypes.VolumeConfig{ Driver: "glusterfs", DriverOpts: map[string]string{ "opt": "value", }, Labels: map[string]string{ "something": "labeled", }, }, } namespace := NewNamespace("foo") expected := mount.Mount{ Type: mount.TypeVolume, Source: "foo_normal", Target: "/foo", ReadOnly: true, VolumeOptions: &mount.VolumeOptions{ Labels: map[string]string{ LabelNamespace: "foo", "something": "labeled", }, DriverConfig: &mount.Driver{ Name: "glusterfs", Options: map[string]string{ "opt": "value", }, }, }, } mount, err := convertVolumeToMount("normal:/foo:ro", stackVolumes, namespace) assert.NilError(t, err) assert.DeepEqual(t, mount, expected) }
func TestContainerContextWriteJSON(t *testing.T) { unix := time.Now().Add(-65 * time.Second).Unix() containers := []types.Container{ {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unix}, {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unix}, } expectedCreated := time.Unix(unix, 0).String() expectedJSONs := []map[string]interface{}{ {"Command": "\"\"", "CreatedAt": expectedCreated, "ID": "containerID1", "Image": "ubuntu", "Labels": "", "LocalVolumes": "0", "Mounts": "", "Names": "foobar_baz", "Networks": "", "Ports": "", "RunningFor": "About a minute", "Size": "0 B", "Status": ""}, {"Command": "\"\"", "CreatedAt": expectedCreated, "ID": "containerID2", "Image": "ubuntu", "Labels": "", "LocalVolumes": "0", "Mounts": "", "Names": "foobar_bar", "Networks": "", "Ports": "", "RunningFor": "About a minute", "Size": "0 B", "Status": ""}, } out := bytes.NewBufferString("") err := ContainerWrite(Context{Format: "{{json .}}", Output: out}, containers) if err != nil { t.Fatal(err) } for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { t.Logf("Output: line %d: %s", i, line) var m map[string]interface{} if err := json.Unmarshal([]byte(line), &m); err != nil { t.Fatal(err) } assert.DeepEqual(t, m, expectedJSONs[i]) } }
func TestJSONFormatWithNoUpdateConfig(t *testing.T) { now := time.Now() // s1: [{"ID":..}] // s2: {"ID":..} s1 := formatServiceInspect(t, formatter.NewServiceFormat(""), now) t.Log("// s1") t.Logf("%s", s1) s2 := formatServiceInspect(t, formatter.NewServiceFormat("{{json .}}"), now) t.Log("// s2") t.Logf("%s", s2) var m1Wrap []map[string]interface{} if err := json.Unmarshal([]byte(s1), &m1Wrap); err != nil { t.Fatal(err) } if len(m1Wrap) != 1 { t.Fatalf("strange s1=%s", s1) } m1 := m1Wrap[0] t.Logf("m1=%+v", m1) var m2 map[string]interface{} if err := json.Unmarshal([]byte(s2), &m2); err != nil { t.Fatal(err) } t.Logf("m2=%+v", m2) assert.DeepEqual(t, m2, m1) }
func TestConvertResourcesFull(t *testing.T) { source := composetypes.Resources{ Limits: &composetypes.Resource{ NanoCPUs: "0.003", MemoryBytes: composetypes.UnitBytes(300000000), }, Reservations: &composetypes.Resource{ NanoCPUs: "0.002", MemoryBytes: composetypes.UnitBytes(200000000), }, } resources, err := convertResources(source) assert.NilError(t, err) expected := &swarm.ResourceRequirements{ Limits: &swarm.Resources{ NanoCPUs: 3000000, MemoryBytes: 300000000, }, Reservations: &swarm.Resources{ NanoCPUs: 2000000, MemoryBytes: 200000000, }, } assert.DeepEqual(t, resources, expected) }
func TestConvertRestartPolicyFromAlways(t *testing.T) { policy, err := convertRestartPolicy("always", nil) expected := &swarm.RestartPolicy{ Condition: swarm.RestartPolicyConditionAny, } assert.NilError(t, err) assert.DeepEqual(t, policy, expected) }
func TestConvertEnvironment(t *testing.T) { source := map[string]string{ "foo": "bar", "key": "value", } env := convertEnvironment(source) sort.Strings(env) assert.DeepEqual(t, env, []string{"foo=bar", "key=value"}) }
func TestConvertRestartPolicyFromFailure(t *testing.T) { policy, err := convertRestartPolicy("on-failure:4", nil) attempts := uint64(4) expected := &swarm.RestartPolicy{ Condition: swarm.RestartPolicyConditionOnFailure, MaxAttempts: &attempts, } assert.NilError(t, err) assert.DeepEqual(t, policy, expected) }
func TestConvertHealthcheckDisable(t *testing.T) { source := &composetypes.HealthCheckConfig{Disable: true} expected := &container.HealthConfig{ Test: []string{"NONE"}, } healthcheck, err := convertHealthcheck(source) assert.NilError(t, err) assert.DeepEqual(t, healthcheck, expected) }
func TestConvertVolumeToMountAnonymousVolume(t *testing.T) { stackVolumes := volumes{} namespace := NewNamespace("foo") expected := mount.Mount{ Type: mount.TypeVolume, Target: "/foo/bar", } mount, err := convertVolumeToMount("/foo/bar", stackVolumes, namespace) assert.NilError(t, err) assert.DeepEqual(t, mount, expected) }
func TestAddStackLabel(t *testing.T) { labels := map[string]string{ "something": "labeled", } actual := AddStackLabel(Namespace{name: "foo"}, labels) expected := map[string]string{ "something": "labeled", LabelNamespace: "foo", } assert.DeepEqual(t, actual, expected) }
func TestConvertVolumeToMountBind(t *testing.T) { stackVolumes := volumes{} namespace := NewNamespace("foo") expected := mount.Mount{ Type: mount.TypeBind, Source: "/bar", Target: "/foo", ReadOnly: true, BindOptions: &mount.BindOptions{Propagation: mount.PropagationShared}, } mount, err := convertVolumeToMount("/bar:/foo:ro,shared", stackVolumes, namespace) assert.NilError(t, err) assert.DeepEqual(t, mount, expected) }
func TestConvertServiceNetworksOnlyDefault(t *testing.T) { networkConfigs := networkMap{} networks := map[string]*composetypes.ServiceNetworkConfig{} configs, err := convertServiceNetworks( networks, networkConfigs, NewNamespace("foo"), "service") expected := []swarm.NetworkAttachmentConfig{ { Target: "foo_default", Aliases: []string{"service"}, }, } assert.NilError(t, err) assert.DeepEqual(t, configs, expected) }
func TestConvertHealthcheck(t *testing.T) { retries := uint64(10) source := &composetypes.HealthCheckConfig{ Test: []string{"EXEC", "touch", "/foo"}, Timeout: "30s", Interval: "2ms", Retries: &retries, } expected := &container.HealthConfig{ Test: source.Test, Timeout: 30 * time.Second, Interval: 2 * time.Millisecond, Retries: 10, } healthcheck, err := convertHealthcheck(source) assert.NilError(t, err) assert.DeepEqual(t, healthcheck, expected) }
func TestConvertVolumeToMountNamedVolumeExternal(t *testing.T) { stackVolumes := volumes{ "outside": composetypes.VolumeConfig{ External: composetypes.External{ External: true, Name: "special", }, }, } namespace := NewNamespace("foo") expected := mount.Mount{ Type: mount.TypeVolume, Source: "special", Target: "/foo", } mount, err := convertVolumeToMount("outside:/foo", stackVolumes, namespace) assert.NilError(t, err) assert.DeepEqual(t, mount, expected) }
func TestConvertServiceNetworks(t *testing.T) { networkConfigs := networkMap{ "front": composetypes.NetworkConfig{ External: composetypes.External{ External: true, Name: "fronttier", }, }, "back": composetypes.NetworkConfig{}, } networks := map[string]*composetypes.ServiceNetworkConfig{ "front": { Aliases: []string{"something"}, }, "back": { Aliases: []string{"other"}, }, } configs, err := convertServiceNetworks( networks, networkConfigs, NewNamespace("foo"), "service") expected := []swarm.NetworkAttachmentConfig{ { Target: "foo_back", Aliases: []string{"other", "service"}, }, { Target: "fronttier", Aliases: []string{"something", "service"}, }, } sortedConfigs := byTargetSort(configs) sort.Sort(&sortedConfigs) assert.NilError(t, err) assert.DeepEqual(t, []swarm.NetworkAttachmentConfig(sortedConfigs), expected) }
func TestMountOptSetTmpfsNoError(t *testing.T) { for _, testcase := range []string{ // tests several aliases that should have same result. "type=tmpfs,target=/target,tmpfs-size=1m,tmpfs-mode=0700", "type=tmpfs,target=/target,tmpfs-size=1MB,tmpfs-mode=700", } { var mount MountOpt assert.NilError(t, mount.Set(testcase)) mounts := mount.Value() assert.Equal(t, len(mounts), 1) assert.DeepEqual(t, mounts[0], mounttypes.Mount{ Type: mounttypes.TypeTmpfs, Target: "/target", TmpfsOptions: &mounttypes.TmpfsOptions{ SizeBytes: 1024 * 1024, // not 1000 * 1000 Mode: os.FileMode(0700), }, }) } }
func TestVolumeContextWriteJSON(t *testing.T) { volumes := []*types.Volume{ {Driver: "foo", Name: "foobar_baz"}, {Driver: "bar", Name: "foobar_bar"}, } expectedJSONs := []map[string]interface{}{ {"Driver": "foo", "Labels": "", "Links": "N/A", "Mountpoint": "", "Name": "foobar_baz", "Scope": "", "Size": "N/A"}, {"Driver": "bar", "Labels": "", "Links": "N/A", "Mountpoint": "", "Name": "foobar_bar", "Scope": "", "Size": "N/A"}, } out := bytes.NewBufferString("") err := VolumeWrite(Context{Format: "{{json .}}", Output: out}, volumes) if err != nil { t.Fatal(err) } for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { t.Logf("Output: line %d: %s", i, line) var m map[string]interface{} if err := json.Unmarshal([]byte(line), &m); err != nil { t.Fatal(err) } assert.DeepEqual(t, m, expectedJSONs[i]) } }
func TestNetworkContextWriteJSON(t *testing.T) { networks := []types.NetworkResource{ {ID: "networkID1", Name: "foobar_baz"}, {ID: "networkID2", Name: "foobar_bar"}, } expectedJSONs := []map[string]interface{}{ {"Driver": "", "ID": "networkID1", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_baz", "Scope": ""}, {"Driver": "", "ID": "networkID2", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_bar", "Scope": ""}, } out := bytes.NewBufferString("") err := NetworkWrite(Context{Format: "{{json .}}", Output: out}, networks) if err != nil { t.Fatal(err) } for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { t.Logf("Output: line %d: %s", i, line) var m map[string]interface{} if err := json.Unmarshal([]byte(line), &m); err != nil { t.Fatal(err) } assert.DeepEqual(t, m, expectedJSONs[i]) } }