Skip to content

Commit ae823b3

Browse files
refactor: add new config file and split nodes setup for create cluster (#487)
* chore: add new config file and split nodes setup for create cluster * chore: update config to use latest docker image
1 parent aecaa0c commit ae823b3

File tree

7 files changed

+176
-45
lines changed

7 files changed

+176
-45
lines changed

cmd/beekeeper/cmd/cluster.go

Lines changed: 102 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (c *command) deleteCluster(ctx context.Context, clusterName string, cfg *co
4949
return fmt.Errorf("get node group: %w", err)
5050
}
5151

52-
for i := 0; i < len(v.Nodes); i++ {
52+
for i := range v.Nodes {
5353
nName := fmt.Sprintf("%s-%d", ngName, i)
5454
if len(v.Nodes[i].Name) > 0 {
5555
nName = v.Nodes[i].Name
@@ -76,7 +76,7 @@ func (c *command) deleteCluster(ctx context.Context, clusterName string, cfg *co
7676
}
7777

7878
if len(v.Nodes) > 0 {
79-
for i := 0; i < len(v.Nodes); i++ {
79+
for i := range v.Nodes {
8080
nName := fmt.Sprintf("%s-%d", ngName, i)
8181
if len(v.Nodes[i].Name) > 0 {
8282
nName = v.Nodes[i].Name
@@ -94,7 +94,7 @@ func (c *command) deleteCluster(ctx context.Context, clusterName string, cfg *co
9494
}
9595
}
9696
} else {
97-
for i := 0; i < v.Count; i++ {
97+
for i := range v.Count {
9898
nName := fmt.Sprintf("%s-%d", ngName, i)
9999
if err := ng.DeleteNode(ctx, nName); err != nil {
100100
return fmt.Errorf("deleting node %s from the node group %s: %w", nName, ngName, err)
@@ -146,27 +146,23 @@ func (c *command) setupCluster(ctx context.Context, clusterName string, startClu
146146

147147
cluster = orchestrationK8S.NewCluster(clusterConfig.GetName(), clusterConfig.Export(), c.k8sClient, c.swapClient, c.log)
148148

149-
nodeResultChan := make(chan nodeResult)
150-
defer close(nodeResultChan)
151-
152149
inCluster := c.globalConfig.GetBool(optionNameInCluster)
153150

154-
// setup bootnode node group
155-
fundAddresses, bootnodes, err := setupNodes(ctx, clusterConfig, c.config, true, cluster, startCluster, inCluster, "", nodeResultChan)
151+
fundAddresses, bootnodes, err := setupBootnodes(ctx, clusterConfig, c.config, cluster, startCluster, inCluster)
156152
if err != nil {
157153
return nil, fmt.Errorf("setup node group bootnode: %w", err)
158154
}
159155

160-
// fund bootnode node group if cluster is started
161-
if startCluster {
156+
// fund bootnode node group if cluster is started and bootnode is defined in config
157+
if startCluster && len(fundAddresses) > 0 {
162158
if err = fund(ctx, fundAddresses, chainNodeEndpoint, walletKey, fundOpts, c.log); err != nil {
163159
return nil, fmt.Errorf("funding node group bootnode: %w", err)
164160
}
165161
c.log.Infof("bootnode node group funded")
166162
}
167163

168164
// setup other node groups
169-
fundAddresses, _, err = setupNodes(ctx, clusterConfig, c.config, false, cluster, startCluster, inCluster, bootnodes, nodeResultChan)
165+
fundAddresses, err = setupNodes(ctx, clusterConfig, c.config, cluster, startCluster, inCluster, bootnodes)
170166
if err != nil {
171167
return nil, fmt.Errorf("setup other node groups: %w", err)
172168
}
@@ -197,21 +193,19 @@ func ensureFundingDefaults(fundOpts orchestration.FundingOptions, log logging.Lo
197193
return fundOpts
198194
}
199195

200-
func setupNodes(ctx context.Context,
196+
func setupBootnodes(ctx context.Context,
201197
clusterConfig config.Cluster,
202198
cfg *config.Config,
203-
bootnode bool,
204199
cluster orchestration.Cluster,
205200
startCluster bool,
206201
inCluster bool,
207-
bootnodesIn string,
208-
nodeResultCh chan nodeResult,
209202
) (fundAddresses []string, bootnodesOut string, err error) {
203+
nodeResultChan := make(chan nodeResult)
204+
defer close(nodeResultChan)
210205
var nodeCount uint32
211206

212207
for ngName, v := range clusterConfig.GetNodeGroups() {
213-
214-
if (v.Mode != bootnodeMode && bootnode) || (v.Mode == bootnodeMode && !bootnode) {
208+
if v.Mode != bootnodeMode {
215209
continue
216210
}
217211

@@ -227,17 +221,95 @@ func setupNodes(ctx context.Context,
227221
}
228222
bConfig := beeConfig.Export()
229223

230-
if !bootnode {
224+
cluster.AddNodeGroup(ngName, ngOptions)
225+
226+
// start nodes in the node group
227+
ng, err := cluster.NodeGroup(ngName)
228+
if err != nil {
229+
return nil, "", fmt.Errorf("get node group: %w", err)
230+
}
231+
232+
if clusterConfig.IsUsingStaticEndpoints() {
233+
for nodeName, endpoint := range v.GetEndpoints() {
234+
beeOpt := orchestration.WithURL(endpoint.APIURL)
235+
nodeCount++
236+
go setupOrAddNode(ctx, false, inCluster, ng, nodeName, orchestration.NodeOptions{
237+
Config: &bConfig,
238+
}, nodeResultChan, beeOpt)
239+
}
240+
continue
241+
}
242+
243+
for i, node := range v.Nodes {
244+
// set node name
245+
nodeName := fmt.Sprintf("%s-%d", ngName, i)
246+
if len(node.Name) > 0 {
247+
nodeName = node.Name
248+
}
249+
250+
bConfig.Bootnodes = fmt.Sprintf(node.Bootnodes, clusterConfig.GetNamespace()) // TODO: improve bootnode management, support more than 2 bootnodes
251+
bootnodesOut = bConfig.Bootnodes
252+
nodeOpts := setupNodeOptions(node, &bConfig)
253+
nodeCount++
254+
go setupOrAddNode(ctx, startCluster, inCluster, ng, nodeName, nodeOpts, nodeResultChan, orchestration.WithNoOptions())
255+
}
256+
}
257+
258+
// wait for nodes to be setup and get their eth addresses
259+
// or wait for nodes to be added and check for errors
260+
for range nodeCount {
261+
nodeResult := <-nodeResultChan
262+
if nodeResult.err != nil {
263+
return nil, "", fmt.Errorf("setup or add node result: %w", nodeResult.err)
264+
}
265+
if nodeResult.ethAddress != "" {
266+
fundAddresses = append(fundAddresses, nodeResult.ethAddress)
267+
}
268+
}
269+
270+
return fundAddresses, bootnodesOut, nil
271+
}
272+
273+
func setupNodes(ctx context.Context,
274+
clusterConfig config.Cluster,
275+
cfg *config.Config,
276+
cluster orchestration.Cluster,
277+
startCluster bool,
278+
inCluster bool,
279+
bootnodesIn string,
280+
) (fundAddresses []string, err error) {
281+
nodeResultChan := make(chan nodeResult)
282+
defer close(nodeResultChan)
283+
var nodeCount uint32
284+
285+
for ngName, v := range clusterConfig.GetNodeGroups() {
286+
if v.Mode == bootnodeMode {
287+
continue
288+
}
289+
290+
ngConfig, ok := cfg.NodeGroups[v.Config]
291+
if !ok {
292+
return nil, fmt.Errorf("node group profile %s not defined", v.Config)
293+
}
294+
ngOptions := ngConfig.Export()
295+
296+
beeConfig, ok := cfg.BeeConfigs[v.BeeConfig]
297+
if !ok {
298+
return nil, fmt.Errorf("bee profile %s not defined", v.BeeConfig)
299+
}
300+
bConfig := beeConfig.Export()
301+
302+
if bConfig.Bootnodes == "" {
231303
bConfig.Bootnodes = bootnodesIn
232-
ngOptions.BeeConfig = &bConfig
233304
}
305+
ngOptions.BeeConfig = &bConfig
234306

235307
cluster.AddNodeGroup(ngName, ngOptions)
236308

237309
// start nodes in the node group
238310
ng, err := cluster.NodeGroup(ngName)
239311
if err != nil {
240-
return nil, "", fmt.Errorf("get node group: %w", err)
312+
return nil, fmt.Errorf("get node group: %w", err)
241313
}
242314

243315
if clusterConfig.IsUsingStaticEndpoints() {
@@ -246,7 +318,7 @@ func setupNodes(ctx context.Context,
246318
nodeCount++
247319
go setupOrAddNode(ctx, false, inCluster, ng, nodeName, orchestration.NodeOptions{
248320
Config: &bConfig,
249-
}, nodeResultCh, beeOpt)
321+
}, nodeResultChan, beeOpt)
250322
}
251323
continue
252324
}
@@ -258,42 +330,34 @@ func setupNodes(ctx context.Context,
258330
nodeName = node.Name
259331
}
260332

261-
var nodeOpts orchestration.NodeOptions
262-
if bootnode {
263-
// set bootnodes
264-
bConfig.Bootnodes = fmt.Sprintf(node.Bootnodes, clusterConfig.GetNamespace()) // TODO: improve bootnode management, support more than 2 bootnodes
265-
bootnodesOut += bootnodesIn + bConfig.Bootnodes + " "
266-
nodeOpts = setupNodeOptions(node, &bConfig)
267-
} else {
268-
nodeOpts = setupNodeOptions(node, nil)
269-
}
333+
nodeOpts := setupNodeOptions(node, nil)
270334
nodeCount++
271-
go setupOrAddNode(ctx, startCluster, inCluster, ng, nodeName, nodeOpts, nodeResultCh, orchestration.WithNoOptions())
335+
go setupOrAddNode(ctx, startCluster, inCluster, ng, nodeName, nodeOpts, nodeResultChan, orchestration.WithNoOptions())
272336
}
273337

274-
if len(v.Nodes) == 0 && !bootnode {
275-
for i := 0; i < v.Count; i++ {
338+
if len(v.Nodes) == 0 {
339+
for i := range v.Count {
276340
// set node name
277341
nodeName := fmt.Sprintf("%s-%d", ngName, i)
278342
nodeCount++
279-
go setupOrAddNode(ctx, startCluster, inCluster, ng, nodeName, orchestration.NodeOptions{}, nodeResultCh, orchestration.WithNoOptions())
343+
go setupOrAddNode(ctx, startCluster, inCluster, ng, nodeName, orchestration.NodeOptions{}, nodeResultChan, orchestration.WithNoOptions())
280344
}
281345
}
282346
}
283347

284348
// wait for nodes to be setup and get their eth addresses
285349
// or wait for nodes to be added and check for errors
286-
for i := uint32(0); i < nodeCount; i++ {
287-
nodeResult := <-nodeResultCh
350+
for range nodeCount {
351+
nodeResult := <-nodeResultChan
288352
if nodeResult.err != nil {
289-
return nil, "", fmt.Errorf("setup or add node result: %w", nodeResult.err)
353+
return nil, fmt.Errorf("setup or add node result: %w", nodeResult.err)
290354
}
291355
if nodeResult.ethAddress != "" {
292356
fundAddresses = append(fundAddresses, nodeResult.ethAddress)
293357
}
294358
}
295359

296-
return fundAddresses, bootnodesOut, nil
360+
return fundAddresses, nil
297361
}
298362

299363
func setupOrAddNode(ctx context.Context,

config/config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ clusters:
5454
node-groups:
5555
default:
5656
_inherit: ""
57-
image: ethersphere/bee:2.3.0
57+
image: ethersphere/bee:latest
5858
image-pull-policy: Always
5959
ingress-annotations:
6060
nginx.ingress.kubernetes.io/affinity: "cookie"

config/light-node.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ bee-configs:
88
node-groups:
99
light-node:
1010
_inherit: default
11-
image: ethersphere/bee:2.3.0
11+
image: ethersphere/bee:latest
1212
image-pull-policy: Always
1313
persistence-enabled: false

config/testnet-bee-playground.yaml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
clusters:
2+
bee-playground:
3+
_inherit: ""
4+
name: bee
5+
namespace: bee-playground
6+
disable-namespace: true
7+
api-domain: bee-playground.testnet.internal
8+
api-domain-internal: bee-playground.svc.swarm1.local:1633
9+
api-insecure-tls: true
10+
api-scheme: http
11+
funding:
12+
eth: 0.1
13+
bzz: 10.0
14+
node-groups:
15+
bee:
16+
mode: node
17+
bee-config: sepolia-playground
18+
config: ng-bee-playground
19+
count: 5
20+
21+
# node-groups defines node groups that can be registered in the cluster
22+
# node-groups may inherit it's configuration from already defined node-group and override specific fields from it
23+
node-groups:
24+
ng-bee-playground:
25+
_inherit: default
26+
persistence-enabled: true
27+
image: ethersphere/bee:latest
28+
29+
# bee-configs defines Bee configuration that can be assigned to node-groups
30+
# bee-configs may inherit it's configuration from already defined bee-config and override specific fields from it
31+
bee-configs:
32+
sepolia-playground:
33+
_inherit: ""
34+
api-addr: :1633
35+
blockchain-rpc-endpoint: http://rpc-sepolia-haproxy.default.svc.swarm1.local
36+
bootnodes: /dnsaddr/testnet.ethswarm.org
37+
full-node: true
38+
mainnet: false
39+
network-id: 10
40+
p2p-addr: :1634
41+
password: "beekeeper"
42+
storage-incentives-enable: true
43+
swap-enable: true
44+
swap-initial-deposit: 0
45+
tracing-enabled: true
46+
tracing-endpoint: "10.10.11.199:6831"
47+
tracing-service-name: "bee-playground"
48+
verbosity: 5
49+
welcome-message: Welcome to the bee-playground Testnet!
50+
warmup-time: 0s
51+
payment-early-percent: 50
52+
payment-threshold: 13500000
53+
payment-tolerance-percent: 25
54+
allow-private-cidrs: false
55+
block-time: 12
56+
bootnode-mode: false
57+
cache-capacity: 1000000
58+
chequebook-enable: true
59+
cors-allowed-origins: ""
60+
data-dir: "/home/bee/.bee"
61+
db-block-cache-capacity: 33554432
62+
db-disable-seeks-compaction: true
63+
db-open-files-limit: 200
64+
db-write-buffer-size: 33554432
65+
nat-addr: ""
66+
p2p-ws-enable: true
67+
postage-stamp-start-block: 0

pkg/check/pss/pss.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func (c *Check) testPss(nodeAName, nodeBName string, clients map[string]*bee.Cli
151151
c.metrics.SendAndReceiveGauge.WithLabelValues(nodeAName, nodeBName).Set(time.Since(tStart).Seconds())
152152
return nil
153153
}
154-
c.logger.Infof("pss: received incorrect message. trying again. want %s, got %s", string(testData), msg)
154+
c.logger.Infof("pss: received incorrect message. trying again. want: '%s', got: '%s'", string(testData), msg)
155155
}
156156
}
157157
}

pkg/orchestration/k8s/nodegroup.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"maps"
78
"net/http"
89
"net/url"
910
"slices"
@@ -487,9 +488,7 @@ func (g *NodeGroup) HasChunkStream(ctx context.Context, a swarm.Address) (<-chan
487488
// Nodes returns map of nodes in the node group
488489
func (g *NodeGroup) Nodes() map[string]orchestration.Node {
489490
nodes := make(map[string]orchestration.Node)
490-
for k, v := range g.getNodes() {
491-
nodes[k] = v
492-
}
491+
maps.Copy(nodes, g.getNodes())
493492
return nodes
494493
}
495494

@@ -700,6 +699,7 @@ func (g *NodeGroup) pregenerateSwarmKey(ctx context.Context, name string) (err e
700699
time.Sleep(10 * time.Second)
701700
g.log.Infof("overlay Ethereum address %s for node %s attested successfully: transaction: %s", key.Address, name, txHash)
702701
}
702+
703703
return
704704
}
705705

pkg/wslistener/wslistener.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func ListenWebSocket(ctx context.Context, client *bee.Client, endpoint string, l
5555
for {
5656
select {
5757
case data := <-readCh:
58-
logger.WithField("node", client.Name()).Infof("websocket received message: %s", string(data))
58+
logger.WithField("node", client.Name()).Infof("websocket received message: `%s`", string(data))
5959
select {
6060
case ch <- string(data):
6161
case <-done:

0 commit comments

Comments
 (0)