diff --git a/tests/e2e/e2evalidator/e2evalidator.go b/tests/e2e/e2evalidator/e2evalidator.go index 41806489..53034175 100644 --- a/tests/e2e/e2evalidator/e2evalidator.go +++ b/tests/e2e/e2evalidator/e2evalidator.go @@ -2,15 +2,33 @@ package e2evalidator import ( "fmt" + "github.com/go-playground/validator/v10" + corev1 "k8s.io/api/core/v1" "reflect" "strings" - - "github.com/go-playground/validator/v10" ) +type Ruler interface { + Cmp(val any) error +} + type Rule string -func StructWithRules(actual any, rulesMapping map[string]Rule) (errMessages []string) { +func (r Rule) Cmp(val any) error { + return validator.New().Var(val, string(r)) +} + +type Resource corev1.ResourceRequirements + +func (r Resource) Cmp(val any) error { + if !reflect.DeepEqual(val, corev1.ResourceRequirements(r)) { + return fmt.Errorf("resource not equal, expected %v, got %v", r, val) + } + + return nil +} + +func StructWithRules(actual any, rulesMapping map[string]Ruler) (errMessages []string) { for field, rule := range rulesMapping { actualVal := reflect.ValueOf(actual) @@ -32,7 +50,8 @@ func StructWithRules(actual any, rulesMapping map[string]Rule) (errMessages []st actualVal = actualVal.Elem() } val := actualVal.Interface() - if err := validator.New().Var(val, string(rule)); err != nil { + + if err := rule.Cmp(val); err != nil { errMessages = append(errMessages, fmt.Sprintf("field %q(%v) does not match %q\n", field, val, rule)) } } diff --git a/tests/e2e/envfuncsext/nebulacluster-ready-func.go b/tests/e2e/envfuncsext/nebulacluster-ready-func.go index d2a36dbb..5ad941a0 100644 --- a/tests/e2e/envfuncsext/nebulacluster-ready-func.go +++ b/tests/e2e/envfuncsext/nebulacluster-ready-func.go @@ -19,6 +19,9 @@ package envfuncsext import ( "context" stderrors "errors" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "reflect" "k8s.io/klog/v2" "sigs.k8s.io/e2e-framework/pkg/envconf" @@ -46,7 +49,7 @@ func DefaultNebulaClusterReadyFunc(ctx context.Context, cfg *envconf.Config, nc return true, nil } -func NebulaClusterReadyFuncForFields(ignoreValidationErrors bool, rulesMapping map[string]e2evalidator.Rule) NebulaClusterReadyFunc { +func NebulaClusterReadyFuncForFields(ignoreValidationErrors bool, rulesMapping map[string]e2evalidator.Ruler) NebulaClusterReadyFunc { return func(_ context.Context, _ *envconf.Config, nc *appsv1alpha1.NebulaCluster) (isReady bool, err error) { if errMessages := e2evalidator.StructWithRules(nc, rulesMapping); len(errMessages) > 0 { if ignoreValidationErrors { @@ -61,7 +64,7 @@ func NebulaClusterReadyFuncForFields(ignoreValidationErrors bool, rulesMapping m } } -func defaultNebulaClusterReadyFuncForStatus(_ context.Context, _ *envconf.Config, nc *appsv1alpha1.NebulaCluster) (bool, error) { +func defaultNebulaClusterReadyFuncForStatus(ctx context.Context, cfg *envconf.Config, nc *appsv1alpha1.NebulaCluster) (bool, error) { isReady := nc.IsReady() if isReady { // TODO: Add more checks @@ -110,6 +113,24 @@ func defaultNebulaClusterReadyFuncForStatus(_ context.Context, _ *envconf.Config ) } } + + { // Metad Resource checks + if !isComponentResourceExpected(ctx, cfg, nc.MetadComponent()) { + isReady = false + } + } + + { // Storaged Resource checks + if !isComponentResourceExpected(ctx, cfg, nc.StoragedComponent()) { + isReady = false + } + } + + { // Graphd Resource checks + if !isComponentResourceExpected(ctx, cfg, nc.GraphdComponent()) { + isReady = false + } + } } return isReady, nil @@ -152,7 +173,7 @@ func isComponentStatusExpected( ) bool { if errMessages := e2evalidator.StructWithRules( componentStatus, - map[string]e2evalidator.Rule{ + map[string]e2evalidator.Ruler{ "Version": e2evalidator.Eq(componentSpec.Version), "Phase": e2evalidator.Eq(appsv1alpha1.RunningPhase), "Workload.ReadyReplicas": e2evalidator.Eq(*componentSpec.Replicas), @@ -173,3 +194,41 @@ func isComponentStatusExpected( return true } + +func isComponentResourceExpected(ctx context.Context, cfg *envconf.Config, component appsv1alpha1.NebulaClusterComponent) bool { + sts := &appsv1.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: component.GetName(), + Namespace: component.GetNamespace(), + }, + } + + if err := cfg.Client().Resources().Get(ctx, sts.Name, sts.Namespace, sts); err != nil { + klog.InfoS("Check Component Resource but statefulset not found", + "namespace", sts.Namespace, + "name", sts.Name, + ) + return false + } + + for _, c := range sts.Spec.Template.Spec.Containers { + if c.Name != component.ComponentType().String() { + continue + } + resource := component.ComponentSpec().Resources() + if reflect.DeepEqual(c.Resources.DeepCopy(), resource) { + return true + } else { + klog.InfoS("Check Component Resource but not expected", + "namespace", sts.Namespace, + "name", sts.Name, + "requests", c.Resources.Requests, + "requestsExpected", resource.Requests, + "limits", c.Resources.Limits, + "limitsExpected", resource.Limits, + ) + } + } + + return false +} diff --git a/tests/e2e/envfuncsext/resources.go b/tests/e2e/envfuncsext/resources.go deleted file mode 100644 index 7e4b170b..00000000 --- a/tests/e2e/envfuncsext/resources.go +++ /dev/null @@ -1,155 +0,0 @@ -package envfuncsext - -import ( - "context" - "k8s.io/klog/v2" - "reflect" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/e2e-framework/pkg/envconf" - - appsv1alpha1 "github.com/vesoft-inc/nebula-operator/apis/apps/v1alpha1" -) - -func NebulaClusterReadyFuncForMetadResource(resource corev1.ResourceRequirements) NebulaClusterReadyFunc { - return func(ctx context.Context, cfg *envconf.Config, nc *appsv1alpha1.NebulaCluster) (isReady bool, err error) { - if !reflect.DeepEqual(nc.Spec.Metad.Resources, &resource) { - klog.InfoS("Check Metad Resource but spec.metad.resources not expected", - "requests", nc.Spec.Metad.Resources.Requests, - "requestsExpected", resource.Requests, - "limits", nc.Spec.Metad.Resources.Limits, - "limitsExpected", resource.Limits, - ) - return false, nil - } - - sts := &appsv1.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: nc.MetadComponent().GetName(), - Namespace: nc.Namespace, - }, - } - - if err = cfg.Client().Resources().Get(ctx, sts.Name, sts.Namespace, sts); err != nil { - klog.InfoS("Check Metad Resource but statefulset not found", - "namespace", sts.Namespace, - "name", sts.Name, - ) - return false, nil - } - - for _, c := range sts.Spec.Template.Spec.Containers { - if c.Name != nc.MetadComponent().ComponentType().String() { - continue - } - if reflect.DeepEqual(c.Resources, resource) { - return true, nil - } else { - klog.InfoS("Check Metad Resource but metad sts's resource not expected", - "requests", c.Resources.Requests, - "requestsExpected", resource.Requests, - "limits", c.Resources.Limits, - "limitsExpected", resource.Limits, - ) - } - } - - return false, nil - } -} - -func NebulaClusterReadyFuncForStoragedResource(resource corev1.ResourceRequirements) NebulaClusterReadyFunc { - return func(ctx context.Context, cfg *envconf.Config, nc *appsv1alpha1.NebulaCluster) (isReady bool, err error) { - if !reflect.DeepEqual(nc.Spec.Storaged.Resources, &resource) { - klog.InfoS("Check Storaged Resource but spec.storaged.resources not expected", - "requests", nc.Spec.Storaged.Resources.Requests, - "requestsExpected", resource.Requests, - "limits", nc.Spec.Storaged.Resources.Limits, - "limitsExpected", resource.Limits, - ) - return false, nil - } - - sts := &appsv1.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: nc.StoragedComponent().GetName(), - Namespace: nc.Namespace, - }, - } - - if err = cfg.Client().Resources().Get(ctx, sts.Name, sts.Namespace, sts); err != nil { - klog.InfoS("Check Storaged Resource but statefulset not found", - "namespace", sts.Namespace, - "name", sts.Name, - ) - return false, nil - } - - for _, c := range sts.Spec.Template.Spec.Containers { - if c.Name != nc.StoragedComponent().ComponentType().String() { - continue - } - if reflect.DeepEqual(c.Resources, resource) { - return true, nil - } else { - klog.InfoS("Check Storaged Resource but storaged sts's resource not expected", - "requests", c.Resources.Requests, - "requestsExpected", resource.Requests, - "limits", c.Resources.Limits, - "limitsExpected", resource.Limits, - ) - } - } - - return false, nil - } -} - -func NebulaClusterReadyFuncForGraphdResource(resource corev1.ResourceRequirements) NebulaClusterReadyFunc { - return func(ctx context.Context, cfg *envconf.Config, nc *appsv1alpha1.NebulaCluster) (isReady bool, err error) { - if !reflect.DeepEqual(nc.Spec.Graphd.Resources, &resource) { - klog.InfoS("Check Graphd Resource but spec.graphd.resources not expected", - "requests", nc.Spec.Graphd.Resources.Requests, - "requestsExpected", resource.Requests, - "limits", nc.Spec.Graphd.Resources.Limits, - "limitsExpected", resource.Limits, - ) - return false, nil - } - - sts := &appsv1.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: nc.GraphdComponent().GetName(), - Namespace: nc.Namespace, - }, - } - - if err = cfg.Client().Resources().Get(ctx, sts.Name, sts.Namespace, sts); err != nil { - klog.InfoS("Check Graphd Resource but statefulset not found", - "namespace", sts.Namespace, - "name", sts.Name, - ) - return false, nil - } - - for _, c := range sts.Spec.Template.Spec.Containers { - if c.Name != nc.GraphdComponent().ComponentType().String() { - continue - } - if reflect.DeepEqual(c.Resources, resource) { - return true, nil - } else { - klog.InfoS("Check Graphd Resource but graphd sts's resource not expected", - "requests", c.Resources.Requests, - "requestsExpected", resource.Requests, - "limits", c.Resources.Limits, - "limitsExpected", resource.Limits, - ) - } - } - - return false, nil - } -} diff --git a/tests/e2e/nebulacluster_basic_test.go b/tests/e2e/nebulacluster_basic_test.go index 00806394..edc4213d 100644 --- a/tests/e2e/nebulacluster_basic_test.go +++ b/tests/e2e/nebulacluster_basic_test.go @@ -35,7 +35,7 @@ var testCasesBasicScale = []ncTestCase{ }, InstallWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(false, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(false, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(2), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(3), @@ -59,7 +59,7 @@ var testCasesBasicScale = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(4), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(4), @@ -82,7 +82,7 @@ var testCasesBasicScale = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(5), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(4), @@ -105,7 +105,7 @@ var testCasesBasicScale = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(5), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(5), @@ -127,7 +127,7 @@ var testCasesBasicScale = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(3), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(4), @@ -149,7 +149,7 @@ var testCasesBasicScale = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(3), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(3), @@ -171,7 +171,7 @@ var testCasesBasicScale = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(2), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(3), @@ -194,7 +194,7 @@ var testCasesBasicVersion = []ncTestCase{ }, InstallWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(false, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(false, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(2), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(3), @@ -220,7 +220,7 @@ var testCasesBasicVersion = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(2), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(3), @@ -247,7 +247,7 @@ var testCasesBasicVersion = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(4), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(4), @@ -276,7 +276,7 @@ var testCasesBasicVersion = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Rule{ + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ "Spec.Graphd.Replicas": e2evalidator.Eq(2), "Spec.Metad.Replicas": e2evalidator.Eq(3), "Spec.Storaged.Replicas": e2evalidator.Eq(3), @@ -310,34 +310,36 @@ var testCasesBasicResources = []ncTestCase{ }, InstallWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForMetadResource(corev1.ResourceRequirements{ - Requests: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("500m"), - corev1.ResourceMemory: resource.MustParse("500Mi"), + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ + "Spec.Metad.Resources": &e2evalidator.Resource{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + Limits: corev1.ResourceList{ + "cpu": resource.MustParse("1"), + "memory": resource.MustParse("1Gi"), + }, }, - Limits: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("1"), - corev1.ResourceMemory: resource.MustParse("1Gi"), + "Spec.Storaged.Resources": &e2evalidator.Resource{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + Limits: corev1.ResourceList{ + "cpu": resource.MustParse("1"), + "memory": resource.MustParse("1Gi"), + }, }, - }), - envfuncsext.NebulaClusterReadyFuncForStoragedResource(corev1.ResourceRequirements{ - Requests: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("500m"), - corev1.ResourceMemory: resource.MustParse("500Mi"), - }, - Limits: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("1"), - corev1.ResourceMemory: resource.MustParse("1Gi"), - }, - }), - envfuncsext.NebulaClusterReadyFuncForGraphdResource(corev1.ResourceRequirements{ - Requests: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("500m"), - corev1.ResourceMemory: resource.MustParse("500Mi"), - }, - Limits: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("1"), - corev1.ResourceMemory: resource.MustParse("500Mi"), + "Spec.Graphd.Resources": &e2evalidator.Resource{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + Limits: corev1.ResourceList{ + "cpu": resource.MustParse("1"), + "memory": resource.MustParse("500Mi"), + }, }, }), envfuncsext.DefaultNebulaClusterReadyFunc, @@ -357,14 +359,16 @@ var testCasesBasicResources = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForGraphdResource(corev1.ResourceRequirements{ - Requests: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("500m"), - corev1.ResourceMemory: resource.MustParse("500Mi"), - }, - Limits: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("1100m"), - corev1.ResourceMemory: resource.MustParse("1100Mi"), + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ + "Spec.Graphd.Resources": &e2evalidator.Resource{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + Limits: corev1.ResourceList{ + "cpu": resource.MustParse("1100m"), + "memory": resource.MustParse("1100Mi"), + }, }, }), envfuncsext.DefaultNebulaClusterReadyFunc, @@ -383,14 +387,16 @@ var testCasesBasicResources = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForMetadResource(corev1.ResourceRequirements{ - Requests: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("500m"), - corev1.ResourceMemory: resource.MustParse("500Mi"), - }, - Limits: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("1100m"), - corev1.ResourceMemory: resource.MustParse("1100Mi"), + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ + "Spec.Metad.Resources": &e2evalidator.Resource{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + Limits: corev1.ResourceList{ + "cpu": resource.MustParse("1100m"), + "memory": resource.MustParse("1100Mi"), + }, }, }), envfuncsext.DefaultNebulaClusterReadyFunc, @@ -409,14 +415,16 @@ var testCasesBasicResources = []ncTestCase{ }, UpgradeWaitNCOptions: []envfuncsext.NebulaClusterOption{ envfuncsext.WithNebulaClusterReadyFuncs( - envfuncsext.NebulaClusterReadyFuncForStoragedResource(corev1.ResourceRequirements{ - Requests: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("500m"), - corev1.ResourceMemory: resource.MustParse("500Mi"), - }, - Limits: map[corev1.ResourceName]resource.Quantity{ - corev1.ResourceCPU: resource.MustParse("1100m"), - corev1.ResourceMemory: resource.MustParse("1100Mi"), + envfuncsext.NebulaClusterReadyFuncForFields(true, map[string]e2evalidator.Ruler{ + "Spec.Storaged.Resources": &e2evalidator.Resource{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + Limits: corev1.ResourceList{ + "cpu": resource.MustParse("1100m"), + "memory": resource.MustParse("1100Mi"), + }, }, }), envfuncsext.DefaultNebulaClusterReadyFunc,