mirror of
https://github.com/siderolabs/talos.git
synced 2025-10-08 22:21:16 +02:00
There's a cyclic dependency on siderolink library which imports talos machinery back. We will fix that after we get talos pushed under a new name. Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
101 lines
2.6 KiB
Go
101 lines
2.6 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package check
|
|
|
|
import (
|
|
"fmt"
|
|
"net/netip"
|
|
|
|
"github.com/siderolabs/gen/maps"
|
|
"github.com/siderolabs/gen/slices"
|
|
|
|
"github.com/siderolabs/talos/pkg/cluster"
|
|
"github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1/machine"
|
|
clussterres "github.com/siderolabs/talos/pkg/machinery/resources/cluster"
|
|
)
|
|
|
|
// DiscoveredClusterInfo represents a cluster.Info populated using the discovery service.
|
|
type DiscoveredClusterInfo struct {
|
|
nodes []cluster.NodeInfo
|
|
nodesByType map[machine.Type][]cluster.NodeInfo
|
|
}
|
|
|
|
// Nodes returns list of all node infos.
|
|
func (d *DiscoveredClusterInfo) Nodes() []cluster.NodeInfo {
|
|
return d.nodes
|
|
}
|
|
|
|
// NodesByType return list of node endpoints by type.
|
|
func (d *DiscoveredClusterInfo) NodesByType(m machine.Type) []cluster.NodeInfo {
|
|
return d.nodesByType[m]
|
|
}
|
|
|
|
// NewDiscoveredClusterInfo returns a new cluster.Info populated from the discovery service.
|
|
func NewDiscoveredClusterInfo(members []*clussterres.Member) (cluster.Info, error) {
|
|
m, err := membersToNodeInfoMap(members)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
nodes := slices.FlatMap(maps.Values(m), func(t []cluster.NodeInfo) []cluster.NodeInfo { return t })
|
|
|
|
return &DiscoveredClusterInfo{
|
|
nodes: nodes,
|
|
nodesByType: m,
|
|
}, nil
|
|
}
|
|
|
|
func membersToNodeInfoMap(members []*clussterres.Member) (map[machine.Type][]cluster.NodeInfo, error) {
|
|
result := make(map[machine.Type][]cluster.NodeInfo)
|
|
|
|
for _, member := range members {
|
|
spec := member.TypedSpec()
|
|
|
|
machineType := spec.MachineType
|
|
|
|
nodeInfo, err := memberToNodeInfo(member)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result[machineType] = append(result[machineType], nodeInfo)
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func memberToNodeInfo(member *clussterres.Member) (cluster.NodeInfo, error) {
|
|
ips, err := stringsToNetipAddrs(slices.Map(member.TypedSpec().Addresses, func(ip netip.Addr) string {
|
|
return ip.String()
|
|
}))
|
|
if err != nil {
|
|
return cluster.NodeInfo{}, err
|
|
}
|
|
|
|
if len(ips) == 0 {
|
|
return cluster.NodeInfo{}, fmt.Errorf("no IP address found for member: %s", member.Metadata().ID())
|
|
}
|
|
|
|
return cluster.NodeInfo{
|
|
InternalIP: ips[0],
|
|
IPs: ips,
|
|
}, nil
|
|
}
|
|
|
|
func stringsToNetipAddrs(ips []string) ([]netip.Addr, error) {
|
|
result := make([]netip.Addr, 0, len(ips))
|
|
|
|
for _, ip := range ips {
|
|
parsed, err := netip.ParseAddr(ip)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result = append(result, parsed)
|
|
}
|
|
|
|
return result, nil
|
|
}
|