pkg/client/sonar/quality_gate.go (123 lines of code) (raw):
package sonar
import (
"context"
"fmt"
)
type QualityGates map[string]QualityGateSettings
type QualityGateProperty struct {
Name string
MakeDefault bool
}
type QualityGateSettings struct {
MakeDefault bool
Conditions []QualityGateCondition
}
type QualityGateCondition struct {
ID string `json:"id"`
Error string `json:"error"`
Metric string `json:"metric"`
OP string `json:"op"`
}
func (q *QualityGateCondition) ToQueryParamMap() map[string]string {
conditionMap := map[string]string{
"gateID": q.ID,
"error": q.Error,
"metric": q.Metric,
"op": q.OP,
}
return conditionMap
}
type QualityGate struct {
ID string `json:"id"`
Name string `json:"name"`
IsDefault bool `json:"isDefault"`
IsBuiltIn bool `json:"isBuiltIn"`
Conditions []QualityGateCondition `json:"conditions"`
}
type Actions struct {
Rename bool `json:"rename"`
SetAsDefault bool `json:"setAsDefault"`
Copy bool `json:"copy"`
AssociateProjects bool `json:"associateProjects"`
Delete bool `json:"delete"`
ManageConditions bool `json:"manageConditions"`
}
// CreateQualityGate creates a new quality gate.
// Returns the created quality gate only with ID and name fields filled.
func (sc *Client) CreateQualityGate(ctx context.Context, qualityGateName string) (*QualityGate, error) {
gate := &QualityGate{}
resp, err := sc.startRequest(ctx).
SetFormData(map[string]string{nameField: qualityGateName}).
SetResult(gate).
Post("/qualitygates/create")
if err = sc.checkError(resp, err); err != nil {
return nil, fmt.Errorf("failed to create quality gate: %w", err)
}
return gate, nil
}
// GetQualityGate returns the quality gate with the given name.
func (sc *Client) GetQualityGate(ctx context.Context, name string) (*QualityGate, error) {
gate := &QualityGate{}
resp, err := sc.startRequest(ctx).
SetQueryParam(nameField, name).
SetResult(gate).
Get("/qualitygates/show")
if err = sc.checkError(resp, err); err != nil {
return nil, fmt.Errorf("failed to get quality gate: %w", err)
}
return gate, nil
}
// DeleteQualityGate deletes the quality gate with the given name.
func (sc *Client) DeleteQualityGate(ctx context.Context, name string) error {
resp, err := sc.startRequest(ctx).
SetFormData(map[string]string{nameField: name}).
Post("/qualitygates/destroy")
if err = sc.checkError(resp, err); err != nil {
return fmt.Errorf("failed to delete quality gate: %w", err)
}
return nil
}
// SetAsDefaultQualityGate sets the quality gate with the given name as default.
func (sc *Client) SetAsDefaultQualityGate(ctx context.Context, name string) error {
resp, err := sc.startRequest(ctx).
SetFormData(map[string]string{nameField: name}).
Post("/qualitygates/set_as_default")
if err = sc.checkError(resp, err); err != nil {
return fmt.Errorf("failed to set default quality gate: %w", err)
}
return nil
}
// CreateQualityGateCondition creates a new quality gate condition.
func (sc *Client) CreateQualityGateCondition(ctx context.Context, gate string, condition QualityGateCondition) error {
resp, err := sc.startRequest(ctx).
SetFormData(map[string]string{
"gateName": gate,
"error": condition.Error,
"metric": condition.Metric,
"op": condition.OP,
}).
Post("/qualitygates/create_condition")
if err = sc.checkError(resp, err); err != nil {
return fmt.Errorf("failed to create quality gate condition: %w", err)
}
return nil
}
// UpdateQualityGateCondition updates the quality gate condition.
func (sc *Client) UpdateQualityGateCondition(ctx context.Context, condition QualityGateCondition) error {
resp, err := sc.startRequest(ctx).
SetFormData(map[string]string{
"id": condition.ID,
"metric": condition.Metric,
"error": condition.Error,
"op": condition.OP,
}).
Post("/qualitygates/update_condition")
if err = sc.checkError(resp, err); err != nil {
return fmt.Errorf("failed to update quality gate condition: %w", err)
}
return nil
}
// DeleteQualityGateCondition deletes the quality gate condition with the given ID.
func (sc *Client) DeleteQualityGateCondition(ctx context.Context, conditionId string) error {
resp, err := sc.startRequest(ctx).
SetFormData(map[string]string{
"id": conditionId,
}).
Post("/qualitygates/delete_condition")
if err = sc.checkError(resp, err); err != nil {
return fmt.Errorf("failed to delete quality gate condition: %w", err)
}
return nil
}