pkg/secrets/kubernetes.go (59 lines of code) (raw):
// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package secrets
import (
"fmt"
"github.com/prometheus/common/config"
"github.com/prometheus/common/version"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// HTTP header.
var userAgent = fmt.Sprintf("Prometheus/%s", version.Version)
// KubernetesSecretConfig is the configuration pointing to a specific Kubernetes Secret.
type KubernetesSecretConfig struct {
Namespace string `yaml:"namespace"`
Name string `yaml:"name"`
Key string `yaml:"key"`
}
func (c *KubernetesSecretConfig) objectKey() types.NamespacedName {
return types.NamespacedName{
Namespace: c.Namespace,
Name: c.Name,
}
}
func getValue(s *corev1.Secret, key string) (string, error) {
if value, ok := s.Data[key]; ok {
return string(value), nil
}
if value, ok := s.StringData[key]; ok {
return value, nil
}
return "", errKeyNotFound(s.Namespace, s.Name, key)
}
func errKeyNotFound(namespace, name, key string) error {
return fmt.Errorf("secret %s/%s does not contain key: %s", namespace, name, key)
}
// ClientConfig configures access to the Kubernetes API server.
type ClientConfig struct {
APIServer config.URL `yaml:"api_server,omitempty"`
KubeConfig string `yaml:"kubeconfig_file,omitempty"`
}
func (c *ClientConfig) client() (kubernetes.Interface, error) {
var restClient *rest.Config
switch {
case c.KubeConfig != "":
var err error
restClient, err = clientcmd.BuildConfigFromFlags("", c.KubeConfig)
if err != nil {
return nil, err
}
case c.APIServer.URL == nil:
var err error
restClient, err = rest.InClusterConfig()
if err != nil {
return nil, err
}
}
restClient.UserAgent = userAgent
restClient.ContentType = "application/vnd.kubernetes.protobuf"
return kubernetes.NewForConfig(restClient)
}