package kubes import ( "context" "os" "path/filepath" "github.com/samber/lo" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/models" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/monitor" ) var _ monitor.ServiceMonitor = new(KubesMonitor) type KubesMonitor struct{ namespace string } func New(namespace string) *KubesMonitor { return &KubesMonitor{namespace} } func (self *KubesMonitor) CheckServices(ctx context.Context) ([]models.Service, error) { home, err := os.UserHomeDir() if err != nil { return nil, err } config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(home, ".kube", "config")) if err != nil { return nil, err } clientset, err := kubernetes.NewForConfig(config) if err != nil { return nil, err } // TODO: consider moving all the shit above into constructor pods, err := clientset.CoreV1().Pods(self.namespace).List(context.TODO(), metav1.ListOptions{}) if err != nil { return nil, err } return lo.Map(pods.Items, func(item corev1.Pod, _ int) models.Service { return models.Service{ Name: item.Name, Status: mapPodPhase(item.Status.Phase), } }), nil } // mapPodPhase maps K8s pod phases to unified ServiceStatus. func mapPodPhase(phase corev1.PodPhase) models.ServiceStatus { switch phase { case corev1.PodRunning: return models.StatusRunning case corev1.PodSucceeded: return models.StatusStopped case corev1.PodFailed: return models.StatusStopped case corev1.PodPending: return models.StatusPending default: return models.StatusUnknown } }