102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
package kubernetes_client
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"kube-forge/internal/config"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
"k8s.io/client-go/tools/remotecommand"
|
|
)
|
|
|
|
func ExecuteCommandInPodContainer(commandArray []string, namespace string, podName string, container string) (string, error) {
|
|
clientset, err := kubernetes.NewForConfig(config.GetKubernetesConfig())
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
|
|
execRequest := clientset.CoreV1().RESTClient().Post().
|
|
Resource("pods").
|
|
Name(podName).
|
|
Namespace(namespace).
|
|
SubResource("exec").
|
|
Param("container", container).
|
|
Param("stderr", "true").
|
|
Param("stdout", "true")
|
|
for _, com := range commandArray {
|
|
execRequest = execRequest.Param("command", com)
|
|
}
|
|
|
|
stderr := bytes.NewBufferString("")
|
|
stdout := bytes.NewBufferString("")
|
|
|
|
streamOptions := remotecommand.StreamOptions{
|
|
Stdout: stdout,
|
|
Stderr: stderr,
|
|
Tty: false,
|
|
}
|
|
|
|
exec, err := remotecommand.NewSPDYExecutor(config.GetKubernetesConfig(), http.MethodPost, execRequest.URL())
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
}
|
|
|
|
err = exec.StreamWithContext(context.Background(), streamOptions)
|
|
if err != nil {
|
|
if stderr.Len() == 0 {
|
|
panic(err)
|
|
}
|
|
outputErr := stderr.String()
|
|
return outputErr, err
|
|
}
|
|
output := stdout.String()
|
|
return output, nil
|
|
}
|
|
|
|
func GetPodByName(podName string, podNamespace string) (*corev1.Pod, error) {
|
|
clientset, err := kubernetes.NewForConfig(config.GetKubernetesConfig())
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
for i := 15; i > 0; i-- {
|
|
time.Sleep(time.Second * 1)
|
|
|
|
pod, err := clientset.CoreV1().
|
|
Pods(podNamespace).
|
|
Get(context.Background(), podName, metav1.GetOptions{})
|
|
if err != nil || pod.Status.Phase != "Running" {
|
|
continue
|
|
}
|
|
return pod, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
func GetEnvVariableFromPodContainer(envVarName string, podNamespace string, podName string, containerName string) (string, error) {
|
|
commandArray := []string{"env"}
|
|
output, err := ExecuteCommandInPodContainer(
|
|
commandArray, podNamespace, podName, containerName,
|
|
)
|
|
if err != nil {
|
|
return output, err
|
|
}
|
|
lines := strings.Split(output, "\n")
|
|
|
|
for _, line := range lines {
|
|
if strings.HasPrefix(line, envVarName+"=") {
|
|
parts := strings.Split(line, "=")
|
|
if len(parts) == 2 {
|
|
value := parts[1]
|
|
return value, nil
|
|
}
|
|
}
|
|
}
|
|
return "", NoSuchVarInPod
|
|
}
|