55 "errors"
66 "fmt"
77 "slices"
8+ "strings"
9+ "text/template"
810 "time"
911
1012 infrav1 "github.com/scaleway/cluster-api-provider-scaleway/api/v1alpha1"
@@ -84,7 +86,7 @@ func (s *Service) Reconcile(ctx context.Context) error {
8486 return fmt .Errorf ("failed to ensure control-plane lbs acls: %w" , err )
8587 }
8688
87- if err := s .ensureCloudInit (ctx , server ); err != nil {
89+ if err := s .ensureCloudInit (ctx , server , nodeIP ); err != nil {
8890 return fmt .Errorf ("failed to ensure cloud-init: %w" , err )
8991 }
9092
@@ -558,7 +560,7 @@ func instanceIPsToStrings(ips []*instance.ServerIP) []string {
558560 return out
559561}
560562
561- func (s * Service ) ensureCloudInit (ctx context.Context , server * instance.Server ) error {
563+ func (s * Service ) ensureCloudInit (ctx context.Context , server * instance.Server , nodeIP string ) error {
562564 if server .State != instance .ServerStateStopped {
563565 return nil
564566 }
@@ -574,12 +576,25 @@ func (s *Service) ensureCloudInit(ctx context.Context, server *instance.Server)
574576 return err
575577 }
576578
579+ // Apply custom templating on cloud-init bootstrap data.
580+ tmpl , err := template .New ("" ).Delims ("[[[" , "]]]" ).Parse (string (bootstrapData ))
581+ if err != nil {
582+ return fmt .Errorf ("failed to parse bootstrap data as template: %w" , err )
583+ }
584+
585+ tmplExec := & strings.Builder {} // tmplExec will contain the executed template.
586+ tmplData := struct { NodeIP string }{nodeIP }
587+
588+ if err := tmpl .ExecuteTemplate (tmplExec , "" , tmplData ); err != nil {
589+ return fmt .Errorf ("failed to execute bootstrap data template: %w" , err )
590+ }
591+
577592 if err := s .ScalewayClient .SetServerUserData (
578593 ctx ,
579594 server .Zone ,
580595 server .ID ,
581596 cloudInitUserDataKey ,
582- string ( bootstrapData ),
597+ tmplExec . String ( ),
583598 ); err != nil {
584599 return err
585600 }
0 commit comments