github.com/vipernet-xyz/tm@v0.34.24/test/e2e/pkg/infra/docker/docker.go (about) 1 package docker 2 3 import ( 4 "bytes" 5 "os" 6 "path/filepath" 7 "strconv" 8 "text/template" 9 10 e2e "github.com/vipernet-xyz/tm/test/e2e/pkg" 11 "github.com/vipernet-xyz/tm/test/e2e/pkg/infra" 12 ) 13 14 var _ infra.Provider = &Provider{} 15 16 // Provider implements a docker-compose backed infrastructure provider. 17 type Provider struct { 18 Testnet *e2e.Testnet 19 } 20 21 // Setup generates the docker-compose file and write it to disk, erroring if 22 // any of these operations fail. 23 func (p *Provider) Setup() error { 24 compose, err := dockerComposeBytes(p.Testnet) 25 if err != nil { 26 return err 27 } 28 //nolint: gosec 29 // G306: Expect WriteFile permissions to be 0600 or less 30 err = os.WriteFile(filepath.Join(p.Testnet.Dir, "docker-compose.yml"), compose, 0644) 31 if err != nil { 32 return err 33 } 34 return nil 35 } 36 37 // dockerComposeBytes generates a Docker Compose config file for a testnet and returns the 38 // file as bytes to be written out to disk. 39 func dockerComposeBytes(testnet *e2e.Testnet) ([]byte, error) { 40 // Must use version 2 Docker Compose format, to support IPv6. 41 tmpl, err := template.New("docker-compose").Funcs(template.FuncMap{ 42 "misbehaviorsToString": func(misbehaviors map[int64]string) string { 43 str := "" 44 for height, misbehavior := range misbehaviors { 45 // after the first behavior set, a comma must be prepended 46 if str != "" { 47 str += "," 48 } 49 heightString := strconv.Itoa(int(height)) 50 str += misbehavior + "," + heightString 51 } 52 return str 53 }, 54 }).Parse(`version: '2.4' 55 56 networks: 57 {{ .Name }}: 58 labels: 59 e2e: true 60 driver: bridge 61 {{- if .IPv6 }} 62 enable_ipv6: true 63 {{- end }} 64 ipam: 65 driver: default 66 config: 67 - subnet: {{ .IP }} 68 69 services: 70 {{- range .Nodes }} 71 {{ .Name }}: 72 labels: 73 e2e: true 74 container_name: {{ .Name }} 75 image: tendermint/e2e-node 76 {{- if eq .ABCIProtocol "builtin" }} 77 entrypoint: /usr/bin/entrypoint-builtin 78 {{- else if .Misbehaviors }} 79 entrypoint: /usr/bin/entrypoint-maverick 80 command: ["node", "--misbehaviors", "{{ misbehaviorsToString .Misbehaviors }}"] 81 {{- end }} 82 init: true 83 ports: 84 - 26656 85 - {{ if .ProxyPort }}{{ .ProxyPort }}:{{ end }}26657 86 - 6060 87 volumes: 88 - ./{{ .Name }}:/tendermint 89 networks: 90 {{ $.Name }}: 91 ipv{{ if $.IPv6 }}6{{ else }}4{{ end}}_address: {{ .IP }} 92 93 {{end}}`) 94 if err != nil { 95 return nil, err 96 } 97 var buf bytes.Buffer 98 err = tmpl.Execute(&buf, testnet) 99 if err != nil { 100 return nil, err 101 } 102 return buf.Bytes(), nil 103 }