diff --git a/apis/v1beta1/opentelemetrycollector_types.go b/apis/v1beta1/opentelemetrycollector_types.go index 7e14e3167c..8046c743ca 100644 --- a/apis/v1beta1/opentelemetrycollector_types.go +++ b/apis/v1beta1/opentelemetrycollector_types.go @@ -99,7 +99,7 @@ type OpenTelemetryCollectorSpec struct { // +optional // +kubebuilder:default:=3 // +kubebuilder:validation:Minimum:=1 - ConfigVersions *int32 `json:"configVersions,omitempty"` + ConfigVersions int `json:"configVersions,omitempty"` // Ingress is used to specify how OpenTelemetry Collector is exposed. This // functionality is only available if one of the valid modes is set. // Valid modes are: deployment, daemonset and statefulset. diff --git a/apis/v1beta1/zz_generated.deepcopy.go b/apis/v1beta1/zz_generated.deepcopy.go index 0902c1c910..c5e574127c 100644 --- a/apis/v1beta1/zz_generated.deepcopy.go +++ b/apis/v1beta1/zz_generated.deepcopy.go @@ -300,11 +300,6 @@ func (in *OpenTelemetryCollectorSpec) DeepCopyInto(out *OpenTelemetryCollectorSp in.OpenTelemetryCommonFields.DeepCopyInto(&out.OpenTelemetryCommonFields) in.TargetAllocator.DeepCopyInto(&out.TargetAllocator) in.Config.DeepCopyInto(&out.Config) - if in.ConfigVersions != nil { - in, out := &in.ConfigVersions, &out.ConfigVersions - *out = new(int32) - **out = **in - } in.Ingress.DeepCopyInto(&out.Ingress) if in.LivenessProbe != nil { in, out := &in.LivenessProbe, &out.LivenessProbe diff --git a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml index a55210bfd8..ab7f14f557 100644 --- a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml +++ b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml @@ -5543,7 +5543,7 @@ spec: x-kubernetes-preserve-unknown-fields: true configVersions: default: 3 - format: int32 + minimum: 1 type: integer configmaps: items: diff --git a/controllers/opentelemetrycollector_controller.go b/controllers/opentelemetrycollector_controller.go index c9eac8ffba..eaf46f2cf0 100644 --- a/controllers/opentelemetrycollector_controller.go +++ b/controllers/opentelemetrycollector_controller.go @@ -134,26 +134,32 @@ func (r *OpenTelemetryCollectorReconciler) findOtelOwnedObjects(ctx context.Cont if err != nil { return nil, fmt.Errorf("error listing ConfigMaps: %w", err) } + ownedConfigMaps := r.getConfigMapsToReconcile(params.OtelCol.Spec.ConfigVersions, configMapList) + for i := range ownedConfigMaps { + ownedObjects[ownedConfigMaps[i].GetUID()] = &ownedConfigMaps[i] + } + + return ownedObjects, nil +} - // only return collector ConfigMaps older than spec.ConfigVersions +// getConfigMapsToReconcile returns a list of ConfigMaps to reconcile based on the number of ConfigMaps to keep. +// It keeps the newest ConfigMap, the `configVersionsToKeep` next newest ConfigMaps, and returns the remainder. +func (r *OpenTelemetryCollectorReconciler) getConfigMapsToReconcile(configVersionsToKeep int, configMapList *corev1.ConfigMapList) []corev1.ConfigMap { + ownedConfigMaps := []corev1.ConfigMap{} sort.Slice(configMapList.Items, func(i, j int) bool { iTime := configMapList.Items[i].GetCreationTimestamp().Time jTime := configMapList.Items[j].GetCreationTimestamp().Time // sort the ConfigMaps newest to oldest return iTime.After(jTime) }) - configVersionsToKeep := 3 - if params.OtelCol.Spec.ConfigVersions != nil { - configVersionsToKeep = max(1, int(*params.OtelCol.Spec.ConfigVersions)) - } for i := range configMapList.Items { if i > configVersionsToKeep { - ownedObjects[configMapList.Items[i].GetUID()] = &configMapList.Items[i] + ownedConfigMaps = append(ownedConfigMaps, configMapList.Items[i]) } } - return ownedObjects, nil + return ownedConfigMaps } func (r *OpenTelemetryCollectorReconciler) getParams(instance v1beta1.OpenTelemetryCollector) (manifests.Params, error) {