pkg/controller/common/statefulset/fixtures.go (140 lines of code) (raw):

// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License 2.0; // you may not use this file except in compliance with the Elastic License 2.0. package statefulset import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" esv1 "github.com/elastic/cloud-on-k8s/v3/pkg/apis/elasticsearch/v1" "github.com/elastic/cloud-on-k8s/v3/pkg/controller/common/hash" "github.com/elastic/cloud-on-k8s/v3/pkg/controller/elasticsearch/label" ) type TestSset struct { Namespace string Name string ClusterName string Version string Replicas int32 Master bool Data bool Ingest bool Status appsv1.StatefulSetStatus ResourceVersion string } func (t TestSset) Pods() []client.Object { podNames := PodNames(t.Build()) pods := make([]client.Object, t.Replicas) for i, podName := range podNames { pods[i] = TestPod{ Namespace: t.Namespace, Name: podName, StatefulSetName: t.Name, Master: t.Master, Data: t.Data, Ingest: t.Ingest, Version: t.Version, ClusterName: t.ClusterName, }.BuildPtr() } return pods } func (t TestSset) Build() appsv1.StatefulSet { labels := map[string]string{ label.VersionLabelName: t.Version, label.ClusterNameLabelName: t.ClusterName, } label.NodeTypesMasterLabelName.Set(t.Master, labels) label.NodeTypesDataLabelName.Set(t.Data, labels) label.NodeTypesIngestLabelName.Set(t.Ingest, labels) statefulSet := appsv1.StatefulSet{ ObjectMeta: metav1.ObjectMeta{ Name: t.Name, Namespace: t.Namespace, Labels: map[string]string{ label.ClusterNameLabelName: t.ClusterName, }, ResourceVersion: t.ResourceVersion, }, Spec: appsv1.StatefulSetSpec{ Replicas: &t.Replicas, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, }, }, UpdateStrategy: appsv1.StatefulSetUpdateStrategy{ Type: "OnDelete", }, }, Status: t.Status, } statefulSet.Labels = hash.SetTemplateHashLabel(statefulSet.Labels, statefulSet.Spec) return statefulSet } func (t TestSset) BuildPtr() *appsv1.StatefulSet { built := t.Build() return &built } type TestPod struct { Namespace string Name string ClusterName string StatefulSetName string Version string Revision string Master bool Data bool Ingest bool Ready bool RestartCount int32 Phase corev1.PodPhase ResourceVersion string } func (t TestPod) Build() corev1.Pod { labels := map[string]string{ label.VersionLabelName: t.Version, label.ClusterNameLabelName: t.ClusterName, label.StatefulSetNameLabelName: t.StatefulSetName, appsv1.StatefulSetRevisionLabel: t.Revision, } label.NodeTypesMasterLabelName.Set(t.Master, labels) label.NodeTypesDataLabelName.Set(t.Data, labels) label.NodeTypesIngestLabelName.Set(t.Ingest, labels) status := corev1.PodStatus{ // assume Running by default Phase: corev1.PodRunning, } // unless specified otherwise if t.Phase != "" { status.Phase = t.Phase } if t.Ready { status.Conditions = []corev1.PodCondition{ { Status: corev1.ConditionTrue, Type: corev1.ContainersReady, }, { Status: corev1.ConditionTrue, Type: corev1.PodReady, }, } } status.ContainerStatuses = []corev1.ContainerStatus{ { Name: esv1.ElasticsearchContainerName, RestartCount: t.RestartCount, Ready: t.Ready, }, } return corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ Namespace: t.Namespace, Name: t.Name, Labels: labels, ResourceVersion: t.ResourceVersion, }, Status: status, } } func (t TestPod) BuildPtr() *corev1.Pod { pod := t.Build() return &pod }