Files
provider-kairos/internal/role/p2p/worker.go
Mauro Morales 0796124789 Add p2p ha configuration for k0s (#710)
It also extends the `role list` command to show the edgevpn ips of the
nodes so it's easier to just jump to the clusterinit one and manage the
cluster from there

Signed-off-by: Mauro Morales <mauro.morales@spectrocloud.com>
2025-03-28 15:31:52 +01:00

100 lines
2.3 KiB
Go

package role
import (
"fmt"
"strings"
"github.com/kairos-io/kairos-agent/v2/pkg/config"
"github.com/kairos-io/kairos-sdk/utils"
providerConfig "github.com/kairos-io/provider-kairos/v2/internal/provider/config"
"github.com/kairos-io/provider-kairos/v2/internal/role"
service "github.com/mudler/edgevpn/api/client/service"
)
func Worker(cc *config.Config, pconfig *providerConfig.Config) role.Role { //nolint:revive
return func(c *service.RoleConfig) error {
c.Logger.Info("Starting Worker")
if pconfig.P2P.Role != "" {
// propagate role if we were forced by configuration
// This unblocks eventual auto instances to try to assign roles
if err := c.Client.Set("role", c.UUID, pconfig.P2P.Role); err != nil {
return err
}
}
if role.SentinelExist() {
c.Logger.Info("Node already configured, backing off")
return nil
}
masterIP, _ := c.Client.Get("master", "ip")
if masterIP == "" {
c.Logger.Info("MasterIP not there still..")
return nil
}
node, err := NewK8sNode(pconfig)
if err != nil {
return fmt.Errorf("failed to determine k8s distro: %w", err)
}
ip := guessIP(pconfig)
if ip != "" {
if err := c.Client.Set("ip", c.UUID, ip); err != nil {
c.Logger.Error(err)
}
}
node.SetRole(RoleWorker)
node.SetRoleConfig(c)
node.SetIP(ip)
nodeToken, _ := node.Token()
if nodeToken == "" {
c.Logger.Info("node token not there still..")
return nil
}
utils.SH("kairos-agent run-stage provider-kairos.bootstrap.before.worker") //nolint:errcheck
err = node.SetupWorker(masterIP, nodeToken)
if err != nil {
return err
}
k8sBin := node.K8sBin()
if k8sBin == "" {
return fmt.Errorf("no %s binary found (?)", node.Distro())
}
args, err := node.WorkerArgs()
if err != nil {
return err
}
svc, err := node.Service()
if err != nil {
return err
}
c.Logger.Info(fmt.Sprintf("Configuring %s worker", node.Distro()))
if err := svc.OverrideCmd(fmt.Sprintf("%s %s %s", k8sBin, node.Role(), strings.Join(args, " "))); err != nil {
return err
}
if err := svc.Start(); err != nil {
return err
}
if err := svc.Enable(); err != nil {
return err
}
utils.SH("kairos-agent run-stage provider-kairos.bootstrap.after.worker") //nolint:errcheck
return role.CreateSentinel()
}
}