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
}