Files
HellreigN/agent/internal/monitor/kubes/impl.go
T

67 lines
1.6 KiB
Go

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
}
}