From 4aafea4586b6e19f34439e0c179fb29bc81d63dd Mon Sep 17 00:00:00 2001 From: Jim Crossley Date: Wed, 29 Apr 2020 16:21:35 -0400 Subject: [PATCH] Add the resources field to the eventing CRD --- config/300-eventing.yaml | 39 +++++++++++++++++++ docs/configuration.md | 1 + .../v1alpha1/knativeeventing_types.go | 4 ++ .../v1alpha1/zz_generated.deepcopy.go | 7 ++++ .../{knativeserving => }/common/resources.go | 10 ++--- .../common/resources_test.go | 2 +- .../common/testdata/manifest.yaml | 0 .../knativeeventing/knativeeventing.go | 1 + .../knativeserving/knativeserving.go | 2 +- 9 files changed, 59 insertions(+), 7 deletions(-) rename pkg/reconciler/{knativeserving => }/common/resources.go (81%) rename pkg/reconciler/{knativeserving => }/common/resources_test.go (99%) rename pkg/reconciler/{knativeserving => }/common/testdata/manifest.yaml (100%) diff --git a/config/300-eventing.yaml b/config/300-eventing.yaml index ad22e771ff..2fa9a59d70 100644 --- a/config/300-eventing.yaml +++ b/config/300-eventing.yaml @@ -93,6 +93,45 @@ spec: description: The default broker type to use for the brokers Knative creates. If no value is provided, ChannelBasedBroker will be used. type: string + resources: + description: A mapping of deployment name to resource requirements + type: array + items: + type: object + properties: + container: + description: The name of the container + type: string + requests: + type: object + properties: + memory: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + cpu: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + storage: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + ephemeral-storage: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + limits: + type: object + properties: + memory: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + cpu: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + storage: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ + ephemeral-storage: + type: string + pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ type: object status: properties: diff --git a/docs/configuration.md b/docs/configuration.md index 9016b0578d..2d5ef884af 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -37,6 +37,7 @@ These are the configurable fields in each resource: * [default](#specregistrydefault) * [override](#specregistryoverride) * [imagePullSecrets](#specregistryimagepullsecrets) + * [resources](#specresources) * [defaultBrokerClass](#specdefaultbrokerclass) diff --git a/pkg/apis/operator/v1alpha1/knativeeventing_types.go b/pkg/apis/operator/v1alpha1/knativeeventing_types.go index dab899c965..e47459814c 100644 --- a/pkg/apis/operator/v1alpha1/knativeeventing_types.go +++ b/pkg/apis/operator/v1alpha1/knativeeventing_types.go @@ -47,6 +47,10 @@ type KnativeEventingSpec struct { // +optional Registry Registry `json:"registry,omitempty"` + // Override containers' resource requirements + // +optional + Resources []ResourceRequirementsOverride `json:"resources,omitempty"` + // The default broker type to use for the brokers Knative creates. // If no value is provided, ChannelBasedBroker will be used. // +optional diff --git a/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go index f8c908c2b8..b6daf3f940 100644 --- a/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/operator/v1alpha1/zz_generated.deepcopy.go @@ -162,6 +162,13 @@ func (in *KnativeEventingSpec) DeepCopyInto(out *KnativeEventingSpec) { } } in.Registry.DeepCopyInto(&out.Registry) + if in.Resources != nil { + in, out := &in.Resources, &out.Resources + *out = make([]ResourceRequirementsOverride, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/pkg/reconciler/knativeserving/common/resources.go b/pkg/reconciler/common/resources.go similarity index 81% rename from pkg/reconciler/knativeserving/common/resources.go rename to pkg/reconciler/common/resources.go index 8e412c4409..495955eb8e 100644 --- a/pkg/reconciler/knativeserving/common/resources.go +++ b/pkg/reconciler/common/resources.go @@ -24,12 +24,12 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/client-go/kubernetes/scheme" - servingv1alpha1 "knative.dev/operator/pkg/apis/operator/v1alpha1" + "knative.dev/operator/pkg/apis/operator/v1alpha1" ) // ResourceRequirementsTransform configures the resource requests for // all containers within all deployments in the manifest -func ResourceRequirementsTransform(instance *servingv1alpha1.KnativeServing, log *zap.SugaredLogger) mf.Transformer { +func ResourceRequirementsTransform(resources []v1alpha1.ResourceRequirementsOverride, log *zap.SugaredLogger) mf.Transformer { return func(u *unstructured.Unstructured) error { if u.GetKind() == "Deployment" { deployment := &appsv1.Deployment{} @@ -38,7 +38,7 @@ func ResourceRequirementsTransform(instance *servingv1alpha1.KnativeServing, log } containers := deployment.Spec.Template.Spec.Containers for i := range containers { - if override := find(instance, containers[i].Name); override != nil { + if override := find(resources, containers[i].Name); override != nil { merge(&override.Limits, &containers[i].Resources.Limits) merge(&override.Requests, &containers[i].Resources.Requests) } @@ -63,8 +63,8 @@ func merge(src, tgt *v1.ResourceList) { } } -func find(instance *servingv1alpha1.KnativeServing, name string) *servingv1alpha1.ResourceRequirementsOverride { - for _, override := range instance.Spec.Resources { +func find(resources []v1alpha1.ResourceRequirementsOverride, name string) *v1alpha1.ResourceRequirementsOverride { + for _, override := range resources { if override.Container == name { return &override } diff --git a/pkg/reconciler/knativeserving/common/resources_test.go b/pkg/reconciler/common/resources_test.go similarity index 99% rename from pkg/reconciler/knativeserving/common/resources_test.go rename to pkg/reconciler/common/resources_test.go index 1fc7960a55..22b8d2b53a 100644 --- a/pkg/reconciler/knativeserving/common/resources_test.go +++ b/pkg/reconciler/common/resources_test.go @@ -282,7 +282,7 @@ func TestResourceRequirementsTransform(t *testing.T) { if err != nil { t.Fatalf("Failed to create manifest: %v", err) } - actual, err := manifest.Transform(ResourceRequirementsTransform(&test.Input, log)) + actual, err := manifest.Transform(ResourceRequirementsTransform(test.Input.Spec.Resources, log)) if err != nil { t.Fatalf("Failed to transform manifest: %v", err) } diff --git a/pkg/reconciler/knativeserving/common/testdata/manifest.yaml b/pkg/reconciler/common/testdata/manifest.yaml similarity index 100% rename from pkg/reconciler/knativeserving/common/testdata/manifest.yaml rename to pkg/reconciler/common/testdata/manifest.yaml diff --git a/pkg/reconciler/knativeeventing/knativeeventing.go b/pkg/reconciler/knativeeventing/knativeeventing.go index 3fde2f55dc..e1353eea22 100644 --- a/pkg/reconciler/knativeeventing/knativeeventing.go +++ b/pkg/reconciler/knativeeventing/knativeeventing.go @@ -149,6 +149,7 @@ func (r *Reconciler) transform(ctx context.Context, instance *eventingv1alpha1.K mf.InjectNamespace(instance.GetNamespace()), common.ImageTransform(&instance.Spec.Registry, logger), common.ConfigMapTransform(instance.Spec.Config, logger), + common.ResourceRequirementsTransform(instance.Spec.Resources, logger), kec.DefaultBrokerConfigMapTransform(instance, logger), } transforms := append(standard, platform...) diff --git a/pkg/reconciler/knativeserving/knativeserving.go b/pkg/reconciler/knativeserving/knativeserving.go index 9e5ec0d022..47c7d39844 100644 --- a/pkg/reconciler/knativeserving/knativeserving.go +++ b/pkg/reconciler/knativeserving/knativeserving.go @@ -151,10 +151,10 @@ func (r *Reconciler) transform(ctx context.Context, instance *servingv1alpha1.Kn mf.InjectNamespace(instance.GetNamespace()), common.ConfigMapTransform(instance.Spec.Config, logger), common.ImageTransform(&instance.Spec.Registry, logger), + common.ResourceRequirementsTransform(instance.Spec.Resources, logger), ksc.GatewayTransform(instance, logger), ksc.CustomCertsTransform(instance, logger), ksc.HighAvailabilityTransform(instance, logger), - ksc.ResourceRequirementsTransform(instance, logger), } transforms := append(standard, platform...) return r.config.Transform(transforms...)