@@ -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
299363func setupOrAddNode (ctx context.Context ,
0 commit comments