add: main function

This commit is contained in:
2026-02-14 12:09:24 -08:00
parent 88bcf2e507
commit 02c0eebdd9
6 changed files with 238 additions and 64 deletions

View File

@@ -4,13 +4,12 @@ import (
"bufio"
"context"
"fmt"
"os"
"time"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// Logger represents a Kubernetes log tailer
@@ -30,6 +29,20 @@ type Logger struct {
Timeout time.Duration
}
func LoggerFromEnv() *Logger {
deployment := os.Getenv("RCON_DEPLOYMENT")
namespace := os.Getenv("RCON_NAMESPACE")
pod := os.Getenv("RCON_POD")
container := os.Getenv("RCON_CONTAINER")
return &Logger{
Deployment: deployment,
Namespace: namespace,
Pod: pod,
Container: container,
}
}
// Tailer represents a running log tailer
type Tailer struct {
lines chan string
@@ -47,23 +60,17 @@ func (t *Tailer) Stop() {
}
// Start starts the log tailer
func (l *Logger) Start() (*Tailer, func() error) {
func (l *Logger) Start(ctx context.Context, client *kubernetes.Clientset) (*Tailer, func() error) {
tailer := &Tailer{
lines: make(chan string),
done: make(chan struct{}),
}
// Create Kubernetes client
client, err := l.createKubernetesClient()
if err != nil {
close(tailer.lines)
return tailer, func() error { return err }
}
// Get pod name if not specified
var err error
podName := l.Pod
if podName == "" {
podName, err = l.getPodName(client)
podName, err = l.getPodName(ctx, client)
if err != nil {
close(tailer.lines)
return tailer, func() error { return err }
@@ -73,7 +80,7 @@ func (l *Logger) Start() (*Tailer, func() error) {
// Get container name if not specified
containerName := l.Container
if containerName == "" {
containerName, err = l.getContainerName(client, podName)
containerName, err = l.getContainerName(ctx, client, podName)
if err != nil {
close(tailer.lines)
return tailer, func() error { return err }
@@ -81,7 +88,7 @@ func (l *Logger) Start() (*Tailer, func() error) {
}
// Start tailing logs
go l.tailLogs(client, podName, containerName, tailer)
go l.tailLogs(ctx, client, podName, containerName, tailer)
return tailer, func() error {
tailer.Stop()
@@ -89,31 +96,9 @@ func (l *Logger) Start() (*Tailer, func() error) {
}
}
func (l *Logger) createKubernetesClient() (*kubernetes.Clientset, error) {
// Try to load in-cluster config first
config, err := rest.InClusterConfig()
if err != nil {
// If in-cluster config fails, try kubeconfig
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
configOverrides := &clientcmd.ConfigOverrides{}
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)
config, err = kubeConfig.ClientConfig()
if err != nil {
return nil, fmt.Errorf("failed to create kubernetes client: %w", err)
}
}
client, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to create kubernetes client: %w", err)
}
return client, nil
}
func (l *Logger) getPodName(client *kubernetes.Clientset) (string, error) {
func (l *Logger) getPodName(ctx context.Context, client *kubernetes.Clientset) (string, error) {
// List pods with the deployment label
podList, err := client.CoreV1().Pods(l.Namespace).List(context.TODO(), metav1.ListOptions{
podList, err := client.CoreV1().Pods(l.Namespace).List(ctx, metav1.ListOptions{
LabelSelector: fmt.Sprintf("app=%s", l.Deployment),
})
if err != nil {
@@ -135,8 +120,8 @@ func (l *Logger) getPodName(client *kubernetes.Clientset) (string, error) {
return podList.Items[0].Name, nil
}
func (l *Logger) getContainerName(client *kubernetes.Clientset, podName string) (string, error) {
pod, err := client.CoreV1().Pods(l.Namespace).Get(context.TODO(), podName, metav1.GetOptions{})
func (l *Logger) getContainerName(ctx context.Context, client *kubernetes.Clientset, podName string) (string, error) {
pod, err := client.CoreV1().Pods(l.Namespace).Get(ctx, podName, metav1.GetOptions{})
if err != nil {
return "", fmt.Errorf("failed to get pod %s: %w", podName, err)
}
@@ -149,7 +134,7 @@ func (l *Logger) getContainerName(client *kubernetes.Clientset, podName string)
return pod.Spec.Containers[0].Name, nil
}
func (l *Logger) tailLogs(client *kubernetes.Clientset, podName, containerName string, tailer *Tailer) {
func (l *Logger) tailLogs(ctx context.Context, client *kubernetes.Clientset, podName, containerName string, tailer *Tailer) {
defer close(tailer.lines)
// Prepare log request
@@ -163,7 +148,6 @@ func (l *Logger) tailLogs(client *kubernetes.Clientset, podName, containerName s
}
// Create context with timeout if specified
ctx := context.Background()
if l.Timeout > 0 {
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, l.Timeout)