Skip to content

Commit fbd6b3b

Browse files
authored
fix(ton): use ctf network, with unique volumes (#2393)
* fix: use ctf network, with unique volumes * fix: typo
1 parent f566bbe commit fbd6b3b

File tree

1 file changed

+39
-46
lines changed
  • framework/components/blockchain

1 file changed

+39
-46
lines changed

framework/components/blockchain/ton.go

Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ package blockchain
33
import (
44
"context"
55
"fmt"
6-
"strconv"
76
"time"
87

98
"github.com/docker/docker/api/types/container"
9+
"github.com/docker/go-connections/nat"
1010
"github.com/testcontainers/testcontainers-go"
11-
"github.com/testcontainers/testcontainers-go/network"
1211
"github.com/testcontainers/testcontainers-go/wait"
1312

1413
"github.com/smartcontractkit/chainlink-testing-framework/framework"
@@ -24,14 +23,8 @@ const (
2423
defaultTonHTTPServerPort = "8000"
2524
defaultLiteServerPort = "40000"
2625
defaultLiteServerPublicKey = "E7XwFSQzNkcRepUC23J2nRpASXpnsEKmyyHYV4u/FZY="
27-
liteServerPortOffset = 100 // arbitrary offset for lite server port
2826
)
2927

30-
type portMapping struct {
31-
HTTPServer string
32-
LiteServer string
33-
}
34-
3528
func defaultTon(in *Input) {
3629
if in.Image == "" {
3730
in.Image = "ghcr.io/neodix42/mylocalton-docker:latest"
@@ -44,15 +37,7 @@ func defaultTon(in *Input) {
4437
func newTon(ctx context.Context, in *Input) (*Output, error) {
4538
defaultTon(in)
4639

47-
base, err := strconv.Atoi(in.Port)
48-
if err != nil {
49-
return nil, fmt.Errorf("invalid base port %s: %w", in.Port, err)
50-
}
51-
52-
ports := &portMapping{
53-
HTTPServer: in.Port,
54-
LiteServer: strconv.Itoa(base + liteServerPortOffset),
55-
}
40+
containerName := framework.DefaultTCName("ton-genesis")
5641

5742
baseEnv := map[string]string{
5843
"GENESIS": "true",
@@ -73,35 +58,24 @@ func newTon(ctx context.Context, in *Input) (*Output, error) {
7358
}
7459
}
7560

76-
n, err := network.New(ctx,
77-
network.WithAttachable(),
78-
network.WithLabels(framework.DefaultTCLabels()),
79-
)
80-
if err != nil {
81-
return nil, fmt.Errorf("failed to create network: %w", err)
82-
}
83-
84-
networkName := n.Name
85-
8661
if pods.K8sEnabled() {
8762
return nil, fmt.Errorf("K8s support is not yet implemented")
8863
}
8964

9065
req := testcontainers.ContainerRequest{
9166
Image: in.Image,
9267
AlwaysPullImage: in.PullImage,
93-
Name: framework.DefaultTCName("ton-genesis"),
68+
Name: containerName,
9469
ExposedPorts: []string{
95-
fmt.Sprintf("%s:%s/tcp", ports.HTTPServer, defaultTonHTTPServerPort),
96-
fmt.Sprintf("%s:%s/tcp", ports.LiteServer, defaultLiteServerPort),
97-
"40003/udp",
98-
"40002/tcp",
99-
"40001/udp",
70+
fmt.Sprintf("%s/tcp", defaultTonHTTPServerPort),
71+
fmt.Sprintf("%s/tcp", defaultLiteServerPort),
72+
},
73+
Networks: []string{framework.DefaultNetworkName},
74+
NetworkAliases: map[string][]string{
75+
framework.DefaultNetworkName: {containerName},
10076
},
101-
Networks: []string{networkName},
102-
NetworkAliases: map[string][]string{networkName: {"genesis"}},
103-
Labels: framework.DefaultTCLabels(),
104-
Env: finalEnv,
77+
Labels: framework.DefaultTCLabels(),
78+
Env: finalEnv,
10579
WaitingFor: wait.ForExec([]string{
10680
"/usr/local/bin/lite-client",
10781
"-a", fmt.Sprintf("127.0.0.1:%s", defaultLiteServerPort),
@@ -110,15 +84,29 @@ func newTon(ctx context.Context, in *Input) (*Output, error) {
11084
}).WithStartupTimeout(2 * time.Minute),
11185
Mounts: testcontainers.ContainerMounts{
11286
{
113-
Source: testcontainers.GenericVolumeMountSource{Name: fmt.Sprintf("shared-data-%s", networkName)},
87+
Source: testcontainers.GenericVolumeMountSource{Name: fmt.Sprintf("ton-data-%s", containerName)},
11488
Target: "/usr/share/data",
11589
},
11690
{
117-
Source: testcontainers.GenericVolumeMountSource{Name: fmt.Sprintf("ton-db-%s", networkName)},
91+
Source: testcontainers.GenericVolumeMountSource{Name: fmt.Sprintf("ton-db-%s", containerName)},
11892
Target: "/var/ton-work/db",
11993
},
12094
},
12195
HostConfigModifier: func(h *container.HostConfig) {
96+
h.PortBindings = nat.PortMap{
97+
nat.Port(fmt.Sprintf("%s/tcp", defaultTonHTTPServerPort)): []nat.PortBinding{
98+
{
99+
HostIP: "0.0.0.0",
100+
HostPort: in.Port,
101+
},
102+
},
103+
nat.Port(fmt.Sprintf("%s/tcp", defaultLiteServerPort)): []nat.PortBinding{
104+
{
105+
HostIP: "0.0.0.0",
106+
HostPort: "", // Docker assigns a dynamic available port
107+
},
108+
},
109+
}
122110
framework.ResourceLimitsFunc(h, in.ContainerResources)
123111
},
124112
}
@@ -131,27 +119,32 @@ func newTon(ctx context.Context, in *Input) (*Output, error) {
131119
return nil, err
132120
}
133121

134-
host, err := c.Host(ctx)
122+
host, err := framework.GetHostWithContext(ctx, c)
135123
if err != nil {
136124
return nil, err
137125
}
138126

139-
name, err := c.Name(ctx)
127+
httpMappedPort, err := c.MappedPort(ctx, nat.Port(fmt.Sprintf("%s/tcp", defaultTonHTTPServerPort)))
140128
if err != nil {
141-
return nil, err
129+
return nil, fmt.Errorf("failed to get mapped HTTP port: %w", err)
130+
}
131+
lsMappedPort, err := c.MappedPort(ctx, nat.Port(fmt.Sprintf("%s/tcp", defaultLiteServerPort)))
132+
if err != nil {
133+
return nil, fmt.Errorf("failed to get mapped LiteServer port: %w", err)
142134
}
143135

144136
return &Output{
145137
UseCache: true,
146138
ChainID: in.ChainID,
147139
Type: in.Type,
148140
Family: FamilyTon,
149-
ContainerName: name,
141+
ContainerName: containerName,
150142
Container: c,
151143
Nodes: []*Node{{
152-
// URLs now contain liteserver://publickey@host:port
153-
ExternalHTTPUrl: fmt.Sprintf("liteserver://%s@%s:%s", defaultLiteServerPublicKey, host, ports.LiteServer),
154-
InternalHTTPUrl: fmt.Sprintf("liteserver://%s@%s:%s", defaultLiteServerPublicKey, name, ports.LiteServer),
144+
ExternalHTTPUrl: fmt.Sprintf("liteserver://%s@%s:%s", defaultLiteServerPublicKey, host, lsMappedPort.Port()),
145+
InternalHTTPUrl: fmt.Sprintf("liteserver://%s@%s:%s", defaultLiteServerPublicKey, containerName, defaultLiteServerPort),
146+
ExternalWSUrl: fmt.Sprintf("http://%s:%s", host, httpMappedPort.Port()),
147+
InternalWSUrl: fmt.Sprintf("http://%s:%s", containerName, defaultTonHTTPServerPort),
155148
}},
156149
}, nil
157150
}

0 commit comments

Comments
 (0)