provider-kairos/internal/role/schedule.go

83 lines
2.0 KiB
Go
Raw Normal View History

2022-08-10 16:55:20 +00:00
package role
import (
"math/rand"
"time"
"github.com/kairos-io/kairos/pkg/config"
2022-08-10 16:55:20 +00:00
providerConfig "github.com/kairos-io/provider-kairos/internal/provider/config"
2022-08-10 16:55:20 +00:00
service "github.com/mudler/edgevpn/api/client/service"
)
// scheduleRoles assigns roles to nodes. Meant to be called only by leaders
// TODO: HA-Auto.
func scheduleRoles(nodes []string, c *service.RoleConfig, cc *config.Config, pconfig *providerConfig.Config) error {
rand.Seed(time.Now().Unix())
// Assign roles to nodes
unassignedNodes, currentRoles := getRoles(c.Client, nodes)
2022-08-10 16:55:20 +00:00
c.Logger.Infof("I'm the leader. My UUID is: %s.\n Current assigned roles: %+v", c.UUID, currentRoles)
existsMaster := false
masterRole := "master"
workerRole := "worker"
if pconfig.Kairos.Hybrid {
c.Logger.Info("hybrid p2p with KubeVIP enabled")
}
for _, r := range currentRoles {
if r == masterRole {
existsMaster = true
}
}
2022-08-10 16:55:20 +00:00
c.Logger.Infof("Master already present: %t", existsMaster)
c.Logger.Infof("Unassigned nodes: %+v", unassignedNodes)
2022-08-10 16:55:20 +00:00
if !existsMaster && len(unassignedNodes) > 0 {
var selected string
toSelect := unassignedNodes
// Avoid to schedule to ourselves if we have a static role
if pconfig.Kairos.Role != "" {
2022-08-10 16:55:20 +00:00
toSelect = []string{}
for _, u := range unassignedNodes {
if u != c.UUID {
toSelect = append(toSelect, u)
}
}
}
// select one node without roles to become master
if len(toSelect) == 1 {
selected = toSelect[0]
} else {
selected = toSelect[rand.Intn(len(toSelect)-1)]
}
if err := c.Client.Set("role", selected, masterRole); err != nil {
2022-08-10 16:55:20 +00:00
return err
}
c.Logger.Info("-> Set master to", selected)
currentRoles[selected] = masterRole
2022-08-10 16:55:20 +00:00
// Return here, so next time we get called
// makes sure master is set.
return nil
}
// cycle all empty roles and assign worker roles
for _, uuid := range unassignedNodes {
if err := c.Client.Set("role", uuid, workerRole); err != nil {
2022-08-10 16:55:20 +00:00
c.Logger.Error(err)
return err
}
c.Logger.Infof("-> Set %s to %s", workerRole, uuid)
2022-08-10 16:55:20 +00:00
}
c.Logger.Info("Done scheduling")
return nil
}