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  }