github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/test/e2e/pkg/infra/docker/docker.go (about) 1 package docker 2 3 import ( 4 "bytes" 5 "os" 6 "path/filepath" 7 "text/template" 8 9 e2e "github.com/line/ostracon/test/e2e/pkg" 10 "github.com/line/ostracon/test/e2e/pkg/infra" 11 ) 12 13 var _ infra.Provider = &Provider{} 14 15 // Provider implements a docker-compose backed infrastructure provider. 16 type Provider struct { 17 Testnet *e2e.Testnet 18 } 19 20 // Setup generates the docker-compose file and write it to disk, erroring if 21 // any of these operations fail. 22 func (p *Provider) Setup() error { 23 compose, err := dockerComposeBytes(p.Testnet) 24 if err != nil { 25 return err 26 } 27 //nolint: gosec 28 // G306: Expect WriteFile permissions to be 0600 or less 29 err = os.WriteFile(filepath.Join(p.Testnet.Dir, "docker-compose.yml"), compose, 0o644) 30 if err != nil { 31 return err 32 } 33 return nil 34 } 35 36 // dockerComposeBytes generates a Docker Compose config file for a testnet and returns the 37 // file as bytes to be written out to disk. 38 func dockerComposeBytes(testnet *e2e.Testnet) ([]byte, error) { 39 // Must use version 2 Docker Compose format, to support IPv6. 40 tmpl, err := template.New("docker-compose").Parse(`version: '2.4' 41 networks: 42 {{ .Name }}: 43 labels: 44 e2e: true 45 driver: bridge 46 {{- if .IPv6 }} 47 enable_ipv6: true 48 {{- end }} 49 ipam: 50 driver: default 51 config: 52 - subnet: {{ .IP }} 53 54 services: 55 {{- range .Nodes }} 56 {{ .Name }}: 57 labels: 58 e2e: true 59 container_name: {{ .Name }} 60 image: ostracon/e2e-node:{{ .Version }} 61 {{- if eq .ABCIProtocol "builtin" }} 62 entrypoint: /usr/bin/entrypoint-builtin 63 {{- end }} 64 init: true 65 ports: 66 - 26656 67 - {{ if .ProxyPort }}{{ .ProxyPort }}:{{ end }}26657 68 - 6060 69 volumes: 70 - ./{{ .Name }}:/ostracon 71 networks: 72 {{ $.Name }}: 73 ipv{{ if $.IPv6 }}6{{ else }}4{{ end}}_address: {{ .IP }} 74 75 {{end}}`) 76 if err != nil { 77 return nil, err 78 } 79 var buf bytes.Buffer 80 err = tmpl.Execute(&buf, testnet) 81 if err != nil { 82 return nil, err 83 } 84 return buf.Bytes(), nil 85 }