api/handler/service_vm_pod_cleanup_test.go
Rama main · réplica de lectura del repositorio original.
package handler
import (
"context"
"testing"
"time"
promcli "github.com/goodrain/rainbond/api/client/prometheus"
"github.com/goodrain/rainbond/db"
dbmodel "github.com/goodrain/rainbond/db/model"
"github.com/goodrain/rainbond/worker/server/pb"
corev1 "k8s.io/api/core/v1"
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kubefake "k8s.io/client-go/kubernetes/fake"
)
// capability_id: rainbond.vm-pods.cleanup-completed-virt-launcher
type noopPrometheus struct{}
func (noopPrometheus) GetMetric(string, time.Time) promcli.Metric {
return promcli.Metric{}
}
func (noopPrometheus) GetMetricOverTime(string, time.Time, time.Time, time.Duration) promcli.Metric {
return promcli.Metric{}
}
func (noopPrometheus) GetMetadata(string) []promcli.Metadata {
return nil
}
func (noopPrometheus) GetAppMetadata(string, string) []promcli.Metadata {
return nil
}
func (noopPrometheus) GetComponentMetadata(string, string) []promcli.Metadata {
return nil
}
func (noopPrometheus) GetMetricLabelSet(string, time.Time, time.Time) []map[string]string {
return nil
}
func TestGetPodsCleansUpCompletedVMLauncherPodsAfterHotUpdate(t *testing.T) {
serviceDao := &resourceSyncTenantServiceDao{
service: &dbmodel.TenantServices{
ServiceID: "service-vm",
ServiceAlias: "service-vm",
ExtendMethod: "vm",
},
}
db.SetTestManager(resourceSyncTestManager{
serviceDao: serviceDao,
eventDao: &resourceSyncEventDao{},
})
defer db.SetTestManager(nil)
kubeClient := kubefake.NewSimpleClientset(
&corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "virt-launcher-nginx-mywin-6bh9b",
Namespace: "demo-ns",
Labels: map[string]string{
"service_id": "service-vm",
"kubevirt.io": "virt-launcher",
},
},
Status: corev1.PodStatus{Phase: corev1.PodRunning},
},
&corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "virt-launcher-nginx-mywin-gpg7f",
Namespace: "demo-ns",
Labels: map[string]string{
"service_id": "service-vm",
"kubevirt.io": "virt-launcher",
},
},
Status: corev1.PodStatus{Phase: corev1.PodSucceeded},
},
)
action := &ServiceAction{
kubeClient: kubeClient,
prometheusCli: noopPrometheus{},
getServicePodsHook: func(serviceID string) (*pb.ServiceAppPodList, error) {
return &pb.ServiceAppPodList{
NewPods: []*pb.ServiceAppPod{
{
PodName: "virt-launcher-nginx-mywin-6bh9b",
PodIp: "10.42.0.16",
PodStatus: "RUNNING",
},
},
OldPods: []*pb.ServiceAppPod{
{
PodName: "virt-launcher-nginx-mywin-gpg7f",
PodIp: "10.42.0.15",
PodStatus: "SUCCEEDED",
},
},
}, nil
},
}
pods, err := action.GetPods("service-vm")
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if len(pods.NewPods) != 1 || pods.NewPods[0].PodName != "virt-launcher-nginx-mywin-6bh9b" {
t.Fatalf("expected running launcher pod to remain, got %#v", pods.NewPods)
}
if len(pods.OldPods) != 0 {
t.Fatalf("expected completed launcher pod to be filtered, got %#v", pods.OldPods)
}
if _, err := kubeClient.CoreV1().Pods("demo-ns").Get(context.Background(), "virt-launcher-nginx-mywin-gpg7f", metav1.GetOptions{}); !k8sErrors.IsNotFound(err) {
t.Fatalf("expected completed launcher pod to be deleted, got err=%v", err)
}
if _, err := kubeClient.CoreV1().Pods("demo-ns").Get(context.Background(), "virt-launcher-nginx-mywin-6bh9b", metav1.GetOptions{}); err != nil {
t.Fatalf("expected running launcher pod to remain, got err=%v", err)
}
}
func TestGetPodsKeepsCompletedVMLauncherWhenReplacementIsNotRunning(t *testing.T) {
serviceDao := &resourceSyncTenantServiceDao{
service: &dbmodel.TenantServices{
ServiceID: "service-vm",
ServiceAlias: "service-vm",
ExtendMethod: "vm",
},
}
db.SetTestManager(resourceSyncTestManager{
serviceDao: serviceDao,
eventDao: &resourceSyncEventDao{},
})
defer db.SetTestManager(nil)
kubeClient := kubefake.NewSimpleClientset(
&corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "virt-launcher-nginx-mywin-gpg7f",
Namespace: "demo-ns",
Labels: map[string]string{
"service_id": "service-vm",
"kubevirt.io": "virt-launcher",
},
},
Status: corev1.PodStatus{Phase: corev1.PodSucceeded},
},
)
action := &ServiceAction{
kubeClient: kubeClient,
prometheusCli: noopPrometheus{},
getServicePodsHook: func(serviceID string) (*pb.ServiceAppPodList, error) {
return &pb.ServiceAppPodList{
OldPods: []*pb.ServiceAppPod{
{
PodName: "virt-launcher-nginx-mywin-gpg7f",
PodIp: "10.42.0.15",
PodStatus: "SUCCEEDED",
},
},
}, nil
},
}
pods, err := action.GetPods("service-vm")
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if len(pods.OldPods) != 1 || pods.OldPods[0].PodName != "virt-launcher-nginx-mywin-gpg7f" {
t.Fatalf("expected completed launcher pod to remain for diagnostics, got %#v", pods.OldPods)
}
if _, err := kubeClient.CoreV1().Pods("demo-ns").Get(context.Background(), "virt-launcher-nginx-mywin-gpg7f", metav1.GetOptions{}); err != nil {
t.Fatalf("expected completed launcher pod to remain when no replacement is running, got err=%v", err)
}
}