Files
BiliBiliToolPro/krew/pkg/utils/client.go
database-mysql e519cac94e
Some checks failed
CodeQL / Analyze (csharp) (push) Has been cancelled
Close Stale Issues / close_stale_issues (push) Has been cancelled
repo-sync / repo-sync (push) Has been cancelled
auto-deploy-tencent-scf / pre-check (push) Has been cancelled
auto-deploy-tencent-scf / deploy serverless (push) Has been cancelled
pull file
2026-02-11 23:32:56 +08:00

74 lines
2.1 KiB
Go

package utils
import (
"context"
"fmt"
"os"
"path/filepath"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func GetK8sClient() (*kubernetes.Clientset, *rest.Config, error) {
var kubeconfig string
envKubeConfig := os.Getenv("KUBECONFIG")
if envKubeConfig == "" {
home, err := os.UserHomeDir()
if err != nil {
return nil, nil, GenErrorMsg(SERVER_ERROR, err.Error())
}
kubeconfig = filepath.Join(home, ".kube", "config")
} else {
kubeconfig = envKubeConfig
}
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, nil, GenErrorMsg(SERVER_ERROR, err.Error())
}
config.QPS = float32(10.0)
config.Burst = 20
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, config, GenErrorMsg(SERVER_ERROR, err.Error())
}
return clientset, config, nil
}
func GetBiliName(client *kubernetes.Clientset, namespace, deploymentName string) (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
defer cancel()
deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deploymentName, metav1.GetOptions{})
if err != nil {
return "", GenErrorMsg(SERVER_ERROR, err.Error())
}
// we dont do much checks here
selector := deployment.Spec.Selector.MatchLabels
if len(selector) == 0 {
return "", GenErrorMsg(SERVER_ERROR, "deployment doesn't have any selectors, please check the deploy template")
}
listOptions := metav1.ListOptions{
LabelSelector: labels.Set(selector).String(),
}
pods, err := client.CoreV1().Pods(namespace).List(ctx, listOptions)
if err != nil {
return "", GenErrorMsg(SERVER_ERROR, "cannot list the pods with deploy selectors")
}
if len(pods.Items) != 1 {
return "", GenErrorMsg(SERVER_ERROR, fmt.Sprintf("pod number is expected to be 1, currently %d", len(pods.Items)))
}
// only one pod is supposed to be existing, soft constraint
return pods.Items[0].ObjectMeta.GetName(), nil
}