func()

in pkg/operator/collection.go [273:336]


func (r *collectionReconciler) ensureCollectorConfig(ctx context.Context, spec *monitoringv1.CollectionSpec, compression monitoringv1.CompressionType, exports []monitoringv1.ExportSpec) error {
	cfg, updates, err := r.makeCollectorConfig(ctx, spec, exports)
	if err != nil {
		return fmt.Errorf("generate Prometheus config: %w", err)
	}

	var credentialsFile string
	if spec.Credentials != nil {
		credentialsFile = path.Join(secretsDir, pathForSelector(r.opts.PublicNamespace, &monitoringv1.SecretOrConfigMap{Secret: spec.Credentials}))
	}

	cfg.GoogleCloud = &GoogleCloudConfig{
		Export: &GoogleCloudExportConfig{
			Compression:     ptr.To(string(compression)),
			CredentialsFile: ptr.To(credentialsFile),
			Match:           spec.Filter.MatchOneOf,
		},
	}

	cfgEncoded, err := yaml.Marshal(cfg)
	if err != nil {
		return fmt.Errorf("marshal Prometheus config: %w", err)
	}

	cm := &corev1.ConfigMap{
		ObjectMeta: metav1.ObjectMeta{
			Namespace: r.opts.OperatorNamespace,
			Name:      NameCollector,
		},
	}
	if err := setConfigMapData(cm, compression, configFilename, string(cfgEncoded)); err != nil {
		return err
	}

	if err := r.client.Update(ctx, cm); apierrors.IsNotFound(err) {
		if err := r.client.Create(ctx, cm); err != nil {
			return fmt.Errorf("create Prometheus config: %w", err)
		}
	} else if err != nil {
		return fmt.Errorf("update Prometheus config: %w", err)
	}

	// Reconcile any status updates.
	var errs []error
	for _, update := range updates {
		// Copy status in case we update both spec and status. Updating one reverts the other.
		statusUpdate := update.object.DeepCopyObject().(monitoringv1.MonitoringCRD).GetMonitoringStatus()
		if update.spec {
			// The status will be reverted, but our generation ID will be updated.
			if err := r.client.Update(ctx, update.object); err != nil {
				errs = append(errs, err)
			}
		}

		if update.status {
			// Use the object with the latest generation ID.
			if err := patchMonitoringStatus(ctx, r.client, update.object, statusUpdate); err != nil {
				errs = append(errs, err)
			}
		}
	}

	return errors.Join(errs...)
}