67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package fleet
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"k8s.io/client-go/rest"
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
"k8s.io/client-go/tools/clientcmd/api"
|
|
)
|
|
|
|
// GetClusterHost returns the API server host and CA for the specified client configuration.
|
|
func GetClusterHost(clientCfg clientcmd.ClientConfig) (string, []byte, error) {
|
|
icc, err := rest.InClusterConfig()
|
|
if err == nil {
|
|
ca, err := os.ReadFile(icc.CAFile)
|
|
return icc.Host, ca, err
|
|
}
|
|
|
|
fail := func(err error) (string, []byte, error) {
|
|
return "", []byte{}, fmt.Errorf("fleet.GetClusterHost: unable to determine cluster host: %w", err)
|
|
}
|
|
|
|
if clientCfg == nil {
|
|
return fail(errors.New("client config not set"))
|
|
}
|
|
|
|
rawConfig, err := clientCfg.RawConfig()
|
|
if err != nil {
|
|
return fail(fmt.Errorf("no configuration available: %w", err))
|
|
}
|
|
|
|
cluster, ok := rawConfig.Clusters[rawConfig.CurrentContext]
|
|
if ok {
|
|
ca, err := getCA(cluster)
|
|
return cluster.Server, ca, err
|
|
}
|
|
|
|
logrus.Warnf(
|
|
"API server host retrieval: no cluster found for the current context (%s)",
|
|
rawConfig.CurrentContext,
|
|
)
|
|
|
|
for k, v := range rawConfig.Clusters {
|
|
logrus.Warnf(
|
|
"API server host retrieval: picking server %s "+
|
|
"with reference %s randomly from set of configured clusters",
|
|
v.Server,
|
|
k,
|
|
)
|
|
ca, err := getCA(v)
|
|
return v.Server, ca, err
|
|
}
|
|
|
|
return "", []byte{}, errors.New("failed to find cluster server parameter")
|
|
}
|
|
|
|
// getCA retrieves certificate authority information for the specified cluster.
|
|
func getCA(cluster *api.Cluster) ([]byte, error) {
|
|
if len(cluster.CertificateAuthorityData) > 0 {
|
|
return cluster.CertificateAuthorityData, nil
|
|
}
|
|
return os.ReadFile(cluster.CertificateAuthority)
|
|
}
|