controllers/qualitygate/chain/sync_qualitygate_conditions.go (65 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"
)
// SyncQualityGateConditions is a handler for syncing quality gate conditions.
type SyncQualityGateConditions struct {
sonarApiClient sonar.QualityGateClient
}
// NewSyncQualityGateConditions creates an instance of SyncQualityGateConditions handler.
func NewSyncQualityGateConditions(sonarApiClient sonar.QualityGateClient) *SyncQualityGateConditions {
return &SyncQualityGateConditions{sonarApiClient: sonarApiClient}
}
// ServeRequest implements the logic of syncing quality gate conditions.
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
}
func conditionsToMap(conditions []sonar.QualityGateCondition) map[string]sonar.QualityGateCondition {
res := make(map[string]sonar.QualityGateCondition, len(conditions))
for _, c := range conditions {
res[c.Metric] = c
}
return res
}