func()

in controllers/qualitygate/chain/sync_qualitygate_conditions.go [24:79]


func (h SyncQualityGateConditions) ServeRequest(ctx context.Context, gate *sonarApi.SonarQualityGate) error {
	log := ctrl.LoggerFrom(ctx).WithValues("name", gate.Spec.Name)
	log.Info("Start syncing quality gate conditions")

	sonarGate, err := h.sonarApiClient.GetQualityGate(ctx, gate.Spec.Name)
	if err != nil {
		return fmt.Errorf("failed to get quality gate: %w", err)
	}

	existingCondMap := conditionsToMap(sonarGate.Conditions)

	for metric, cond := range gate.Spec.Conditions {
		existingCond, ok := existingCondMap[metric]
		if !ok {
			log.Info("Creating quality gate condition", "metric", metric)

			if err = h.sonarApiClient.CreateQualityGateCondition(
				ctx,
				gate.Spec.Name,
				sonar.QualityGateCondition{
					Error:  cond.Error,
					Metric: metric,
					OP:     cond.Op,
				},
			); err != nil {
				return fmt.Errorf("failed to create quality gate condition: %w", err)
			}

			continue
		}

		if existingCond.Error != cond.Error || existingCond.OP != cond.Op {
			log.Info("Updating quality gate condition", "metric", metric)

			existingCond.Error = cond.Error
			existingCond.OP = cond.Op
			if err = h.sonarApiClient.UpdateQualityGateCondition(ctx, existingCond); err != nil {
				return fmt.Errorf("failed to update quality gate condition: %w", err)
			}
		}

		delete(existingCondMap, metric)
	}

	for _, cond := range existingCondMap {
		log.Info("Deleting quality gate condition", "metric", cond.Metric)

		if err = h.sonarApiClient.DeleteQualityGateCondition(ctx, cond.ID); err != nil {
			return fmt.Errorf("failed to delete quality gate condition: %w", err)
		}
	}

	log.Info("Quality gate conditions have been synced")

	return nil
}