mirror of
https://github.com/siderolabs/omni.git
synced 2025-08-08 02:27:00 +02:00
Omni is source-available under BUSL. Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com> Co-Authored-By: Artem Chernyshev <artem.chernyshev@talos-systems.com> Co-Authored-By: Utku Ozdemir <utku.ozdemir@siderolabs.com> Co-Authored-By: Dmitriy Matrenichev <dmitry.matrenichev@siderolabs.com> Co-Authored-By: Philipp Sauter <philipp.sauter@siderolabs.com> Co-Authored-By: Noel Georgi <git@frezbo.dev> Co-Authored-By: evgeniybryzh <evgeniybryzh@gmail.com> Co-Authored-By: Tim Jones <tim.jones@siderolabs.com> Co-Authored-By: Andrew Rynhard <andrew@rynhard.io> Co-Authored-By: Spencer Smith <spencer.smith@talos-systems.com> Co-Authored-By: Christian Rolland <christian.rolland@siderolabs.com> Co-Authored-By: Gerard de Leeuw <gdeleeuw@leeuwit.nl> Co-Authored-By: Steve Francis <67986293+steverfrancis@users.noreply.github.com> Co-Authored-By: Volodymyr Mazurets <volodymyrmazureets@gmail.com>
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
// Copyright (c) 2024 Sidero Labs, Inc.
|
|
//
|
|
// Use of this software is governed by the Business Source License
|
|
// included in the LICENSE file.
|
|
|
|
package router
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/siderolabs/gen/xslices"
|
|
"github.com/siderolabs/go-api-signature/pkg/message"
|
|
"google.golang.org/grpc/metadata"
|
|
|
|
"github.com/siderolabs/omni/internal/backend/dns"
|
|
)
|
|
|
|
// NodeResolver resolves a given cluster and a node name to an IP address.
|
|
type NodeResolver interface {
|
|
Resolve(cluster, node string) dns.Info
|
|
}
|
|
|
|
type resolvedNodeInfo struct {
|
|
node dns.Info
|
|
nodes []dns.Info
|
|
}
|
|
|
|
func resolveNodes(dnsService NodeResolver, md metadata.MD) resolvedNodeInfo {
|
|
nodesVal := md.Get(message.NodesHeaderKey)
|
|
|
|
cluster := getClusterName(md)
|
|
|
|
nodes := make([]string, 0, len(nodesVal)*2)
|
|
for _, node := range nodesVal {
|
|
nodes = append(nodes, strings.Split(node, ",")...)
|
|
}
|
|
|
|
node := ""
|
|
if nodeVal := md.Get("node"); len(nodeVal) > 0 {
|
|
node = nodeVal[0]
|
|
}
|
|
|
|
if cluster == "" {
|
|
return resolvedNodeInfo{
|
|
nodes: xslices.Map(nodes, func(n string) dns.Info {
|
|
return dns.Info{Address: n}
|
|
}),
|
|
node: dns.Info{Address: node},
|
|
}
|
|
}
|
|
|
|
resolveNode := func(val string) dns.Info {
|
|
if val == "" {
|
|
return dns.Info{}
|
|
}
|
|
|
|
return dnsService.Resolve(cluster, val)
|
|
}
|
|
|
|
resolvedNode := resolveNode(node)
|
|
|
|
resolvedNodes := make([]dns.Info, 0, len(nodes))
|
|
for _, n := range nodesVal {
|
|
resolvedNodes = append(resolvedNodes, resolveNode(n))
|
|
}
|
|
|
|
return resolvedNodeInfo{
|
|
nodes: resolvedNodes,
|
|
node: resolvedNode,
|
|
}
|
|
}
|