func()

in controllers/qualityprofile/chain/sync_qualityprofile_rules.go [24:73]


func (h SyncQualityProfileRules) ServeRequest(ctx context.Context, profile *sonarApi.SonarQualityProfile) error {
	log := ctrl.LoggerFrom(ctx).WithValues("name", profile.Spec.Name)
	log.Info("Start syncing quality profile rules")

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

	activeRules, err := h.sonarApiClient.GetQualityProfileActiveRules(ctx, sonarProfile.Key)
	if err != nil {
		return fmt.Errorf("failed to get quality profile active rules: %w", err)
	}

	existingRulesMap := rulesToMap(activeRules)

	for ruleKey, rule := range profile.Spec.Rules {
		_, ok := existingRulesMap[ruleKey]
		if ok {
			delete(existingRulesMap, ruleKey)
			continue
		}

		log.Info("Activating quality profile rule", "rule", ruleKey)

		if err = h.sonarApiClient.ActivateQualityProfileRule(
			ctx,
			sonarProfile.Key,
			sonar.Rule{
				Rule:     ruleKey,
				Severity: rule.Severity,
				Params:   rule.Params,
			},
		); err != nil {
			return fmt.Errorf("failed to acticate rule: %w", err)
		}
	}

	for ruleKey := range existingRulesMap {
		log.Info("Deactivating quality profile rule", "rule", ruleKey)

		if err = h.sonarApiClient.DeactivateQualityProfileRule(ctx, sonarProfile.Key, ruleKey); err != nil {
			return fmt.Errorf("failed to deactivate quality profile rule: %w", err)
		}
	}

	log.Info("Quality profile rules have been synced")

	return nil
}