controllers/qualityprofile/chain/sync_qualityprofile_rules.go (61 lines of code) (raw):
package chain
import (
"context"
"fmt"
ctrl "sigs.k8s.io/controller-runtime"
sonarApi "github.com/epam/edp-sonar-operator/api/v1alpha1"
"github.com/epam/edp-sonar-operator/pkg/client/sonar"
)
// SyncQualityProfileRules is a handler for syncing quality profile rules.
type SyncQualityProfileRules struct {
sonarApiClient sonarApiClient
}
// NewSyncQualityProfileRules returns an instance of SyncQualityProfileRules handler.
func NewSyncQualityProfileRules(sonarApiClient sonarApiClient) *SyncQualityProfileRules {
return &SyncQualityProfileRules{sonarApiClient: sonarApiClient}
}
// ServeRequest implements the logic of syncing quality profile rules.
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
}
func rulesToMap(rules []sonar.Rule) map[string]sonar.Rule {
res := make(map[string]sonar.Rule, len(rules))
for _, r := range rules {
res[r.Key] = r
}
return res
}