github.com/xiaobinqt/libcompose@v1.1.0/docker/service/convert_test.go (about) 1 package service 2 3 import ( 4 "path/filepath" 5 "reflect" 6 "testing" 7 8 "github.com/docker/docker/api/types/container" 9 shlex "github.com/flynn/go-shlex" 10 "github.com/stretchr/testify/assert" 11 "github.com/xiaobinqt/libcompose/config" 12 "github.com/xiaobinqt/libcompose/docker/ctx" 13 "github.com/xiaobinqt/libcompose/lookup" 14 "github.com/xiaobinqt/libcompose/yaml" 15 ) 16 17 func TestParseCommand(t *testing.T) { 18 exp := []string{"sh", "-c", "exec /opt/bin/flanneld -logtostderr=true -iface=${NODE_IP}"} 19 cmd, err := shlex.Split("sh -c 'exec /opt/bin/flanneld -logtostderr=true -iface=${NODE_IP}'") 20 assert.Nil(t, err) 21 assert.Equal(t, exp, cmd) 22 } 23 24 func TestParseBindsAndVolumes(t *testing.T) { 25 ctx := &ctx.Context{} 26 ctx.ComposeFiles = []string{"foo/docker-compose.yml"} 27 ctx.ResourceLookup = &lookup.FileResourceLookup{} 28 29 abs, err := filepath.Abs(".") 30 assert.Nil(t, err) 31 cfg, hostCfg, err := Convert(&config.ServiceConfig{ 32 Volumes: &yaml.Volumes{ 33 Volumes: []*yaml.Volume{ 34 { 35 Destination: "/foo", 36 }, 37 { 38 Source: "/home", 39 Destination: "/home", 40 }, 41 { 42 Destination: "/bar/baz", 43 }, 44 { 45 Source: ".", 46 Destination: "/home", 47 }, 48 { 49 Source: "/usr/lib", 50 Destination: "/usr/lib", 51 AccessMode: "ro", 52 }, 53 }, 54 }, 55 }, ctx.Context, nil) 56 assert.Nil(t, err) 57 assert.Equal(t, map[string]struct{}{"/foo": {}, "/bar/baz": {}}, cfg.Volumes) 58 assert.Equal(t, []string{"/home:/home", abs + "/foo:/home", "/usr/lib:/usr/lib:ro"}, hostCfg.Binds) 59 } 60 61 func TestParseLabels(t *testing.T) { 62 ctx := &ctx.Context{} 63 ctx.ComposeFiles = []string{"foo/docker-compose.yml"} 64 ctx.ResourceLookup = &lookup.FileResourceLookup{} 65 bashCmd := "bash" 66 fooLabel := "foo.label" 67 fooLabelValue := "service.config.value" 68 sc := &config.ServiceConfig{ 69 Entrypoint: yaml.Command([]string{bashCmd}), 70 Labels: yaml.SliceorMap{fooLabel: "service.config.value"}, 71 } 72 cfg, _, err := Convert(sc, ctx.Context, nil) 73 assert.Nil(t, err) 74 75 cfg.Labels[fooLabel] = "FUN" 76 cfg.Entrypoint[0] = "less" 77 78 assert.Equal(t, fooLabelValue, sc.Labels[fooLabel]) 79 assert.Equal(t, "FUN", cfg.Labels[fooLabel]) 80 81 assert.Equal(t, yaml.Command{bashCmd}, sc.Entrypoint) 82 assert.Equal(t, []string{"less"}, []string(cfg.Entrypoint)) 83 } 84 85 func TestDNSOpt(t *testing.T) { 86 ctx := &ctx.Context{} 87 sc := &config.ServiceConfig{ 88 DNSOpts: []string{ 89 "use-vc", 90 "no-tld-query", 91 }, 92 } 93 _, hostCfg, err := Convert(sc, ctx.Context, nil) 94 assert.Nil(t, err) 95 96 assert.True(t, reflect.DeepEqual([]string{ 97 "use-vc", 98 "no-tld-query", 99 }, hostCfg.DNSOptions)) 100 } 101 102 func TestGroupAdd(t *testing.T) { 103 ctx := &ctx.Context{} 104 sc := &config.ServiceConfig{ 105 GroupAdd: []string{ 106 "root", 107 "1", 108 }, 109 } 110 _, hostCfg, err := Convert(sc, ctx.Context, nil) 111 assert.Nil(t, err) 112 113 assert.True(t, reflect.DeepEqual([]string{ 114 "root", 115 "1", 116 }, hostCfg.GroupAdd)) 117 } 118 119 func TestIsolation(t *testing.T) { 120 ctx := &ctx.Context{} 121 sc := &config.ServiceConfig{ 122 Isolation: "default", 123 } 124 _, hostCfg, err := Convert(sc, ctx.Context, nil) 125 assert.Nil(t, err) 126 127 assert.Equal(t, container.Isolation("default"), hostCfg.Isolation) 128 } 129 130 func TestMemSwappiness(t *testing.T) { 131 ctx := &ctx.Context{} 132 sc := &config.ServiceConfig{ 133 MemSwappiness: yaml.MemStringorInt(10), 134 } 135 _, hostCfg, err := Convert(sc, ctx.Context, nil) 136 assert.Nil(t, err) 137 138 assert.Equal(t, int64(10), *hostCfg.MemorySwappiness) 139 } 140 141 func TestMemReservation(t *testing.T) { 142 ctx := &ctx.Context{} 143 sc := &config.ServiceConfig{ 144 MemReservation: 100000, 145 } 146 _, hostCfg, err := Convert(sc, ctx.Context, nil) 147 assert.Nil(t, err) 148 149 assert.Equal(t, int64(100000), hostCfg.MemoryReservation) 150 } 151 152 func TestOomKillDisable(t *testing.T) { 153 ctx := &ctx.Context{} 154 sc := &config.ServiceConfig{ 155 OomKillDisable: true, 156 } 157 _, hostCfg, err := Convert(sc, ctx.Context, nil) 158 assert.Nil(t, err) 159 160 assert.Equal(t, true, *hostCfg.OomKillDisable) 161 } 162 163 func TestOomScoreAdj(t *testing.T) { 164 ctx := &ctx.Context{} 165 sc := &config.ServiceConfig{ 166 OomScoreAdj: 500, 167 } 168 _, hostCfg, err := Convert(sc, ctx.Context, nil) 169 assert.Nil(t, err) 170 171 assert.Equal(t, 500, hostCfg.OomScoreAdj) 172 } 173 174 func TestStopGracePeriod(t *testing.T) { 175 ctx := &ctx.Context{} 176 sc := &config.ServiceConfig{ 177 StopGracePeriod: "5s", 178 } 179 cfg, _, err := Convert(sc, ctx.Context, nil) 180 assert.Nil(t, err) 181 182 assert.Equal(t, 5, *cfg.StopTimeout) 183 } 184 185 func TestStopSignal(t *testing.T) { 186 ctx := &ctx.Context{} 187 sc := &config.ServiceConfig{ 188 StopSignal: "SIGTERM", 189 } 190 cfg, _, err := Convert(sc, ctx.Context, nil) 191 assert.Nil(t, err) 192 193 assert.Equal(t, "SIGTERM", cfg.StopSignal) 194 } 195 196 func TestTmpfs(t *testing.T) { 197 ctx := &ctx.Context{} 198 sc := &config.ServiceConfig{ 199 Tmpfs: yaml.Stringorslice{"/run"}, 200 } 201 _, hostCfg, err := Convert(sc, ctx.Context, nil) 202 assert.Nil(t, err) 203 204 assert.True(t, reflect.DeepEqual(map[string]string{ 205 "/run": "", 206 }, hostCfg.Tmpfs)) 207 208 sc = &config.ServiceConfig{ 209 Tmpfs: yaml.Stringorslice{"/run:rw,noexec,nosuid,size=65536k"}, 210 } 211 _, hostCfg, err = Convert(sc, ctx.Context, nil) 212 assert.Nil(t, err) 213 214 assert.True(t, reflect.DeepEqual(map[string]string{ 215 "/run": "rw,noexec,nosuid,size=65536k", 216 }, hostCfg.Tmpfs)) 217 }