Skip to content

Commit

Permalink
Populate the release_phase response to the related APIs (#4278)
Browse files Browse the repository at this point in the history
* Populate the release_phase response to ruletype related APIs

Signed-off-by: Radoslav Dimitrov <[email protected]>

* Add the release_phase to RuleEvaluationStatus

Signed-off-by: Radoslav Dimitrov <[email protected]>

---------

Signed-off-by: Radoslav Dimitrov <[email protected]>
  • Loading branch information
rdimitrov authored Aug 27, 2024
1 parent 369ac09 commit 02452cc
Show file tree
Hide file tree
Showing 14 changed files with 2,102 additions and 2,004 deletions.
3 changes: 2 additions & 1 deletion database/query/profile_status.sql
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ SELECT
WHEN ere.entity_type = 'artifact'::entities THEN ere.artifact_id
WHEN ere.entity_type = 'repository'::entities THEN ere.repository_id
WHEN ere.entity_type = 'pull_request'::entities THEN ere.pull_request_id
END::uuid as entity_id
END::uuid as entity_id,
rt.release_phase as rule_type_release_phase
FROM latest_evaluation_statuses les
INNER JOIN evaluation_rule_entities ere ON ere.id = les.rule_entity_id
INNER JOIN eval_details ed ON ed.id = les.evaluation_history_id
Expand Down
8 changes: 5 additions & 3 deletions database/query/rule_types.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ INSERT INTO rule_type (
definition,
severity_value,
subscription_id,
display_name
display_name,
release_phase
) VALUES (
$1,
$2,
Expand All @@ -16,7 +17,8 @@ INSERT INTO rule_type (
sqlc.arg(definition)::jsonb,
sqlc.arg(severity_value),
sqlc.narg(subscription_id),
sqlc.arg(display_name)
sqlc.arg(display_name),
sqlc.arg(release_phase)
) RETURNING *;

-- name: ListRuleTypesByProject :many
Expand All @@ -33,7 +35,7 @@ DELETE FROM rule_type WHERE id = $1;

-- name: UpdateRuleType :one
UPDATE rule_type
SET description = $2, definition = sqlc.arg(definition)::jsonb, severity_value = sqlc.arg(severity_value), display_name = sqlc.arg(display_name)
SET description = $2, definition = sqlc.arg(definition)::jsonb, severity_value = sqlc.arg(severity_value), display_name = sqlc.arg(display_name), release_phase = sqlc.arg(release_phase)
WHERE id = $1
RETURNING *;

Expand Down
1 change: 1 addition & 0 deletions docs/docs/ref/proto.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions internal/controlplane/handlers_evalstatus.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"github.com/stacklok/minder/internal/db"
"github.com/stacklok/minder/internal/engine/engcontext"
"github.com/stacklok/minder/internal/history"
"github.com/stacklok/minder/internal/ruletypes"
"github.com/stacklok/minder/internal/util"
minderv1 "github.com/stacklok/minder/pkg/api/protobuf/go/minder/v1"
)
Expand Down Expand Up @@ -596,6 +597,11 @@ func buildRuleEvaluationStatusFromDBEvaluation(
nString = eval.RuleTypeName
}

rp, err := ruletypes.GetPBReleasePhaseFromDBReleaseStatus(&eval.RuleTypeReleasePhase)
if err != nil {
return nil, fmt.Errorf("converting release phase: %w", err)
}

return &minderv1.RuleEvaluationStatus{
RuleEvaluationId: eval.RuleEvaluationID.String(),
RuleId: eval.RuleTypeID.String(),
Expand All @@ -615,6 +621,7 @@ func buildRuleEvaluationStatusFromDBEvaluation(
RuleTypeName: eval.RuleTypeName,
Alert: buildEvalResultAlertFromLRERow(&eval),
Severity: sev,
ReleasePhase: rp,
}, nil
}

Expand Down
7 changes: 7 additions & 0 deletions internal/controlplane/handlers_profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"github.com/stacklok/minder/internal/engine/entities"
"github.com/stacklok/minder/internal/logger"
prof "github.com/stacklok/minder/internal/profiles"
"github.com/stacklok/minder/internal/ruletypes"
"github.com/stacklok/minder/internal/util"
minderv1 "github.com/stacklok/minder/pkg/api/protobuf/go/minder/v1"
)
Expand Down Expand Up @@ -470,6 +471,11 @@ func (s *Server) getRuleEvalStatus(
}
}

releasePhase, err := ruletypes.GetPBReleasePhaseFromDBReleaseStatus(&dbRuleEvalStat.RuleTypeReleasePhase)
if err != nil {
l.Err(err).Msg("error getting release phase")
}

st := &minderv1.RuleEvaluationStatus{
ProfileId: profileID,
RuleId: dbRuleEvalStat.RuleTypeID.String(),
Expand All @@ -491,6 +497,7 @@ func (s *Server) getRuleEvalStatus(
LastUpdated: timestamppb.New(dbRuleEvalStat.AlertLastUpdated),
},
RemediationLastUpdated: timestamppb.New(dbRuleEvalStat.RemLastUpdated),
ReleasePhase: releasePhase,
}

// If the alert is on and its metadata is valid, parse it and set the URL
Expand Down
2 changes: 2 additions & 0 deletions internal/controlplane/handlers_profile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ func TestCreateProfile(t *testing.T) {
ProjectID: dbproj.ID,
Definition: []byte(`{"in_entity": "repository","ruleSchema":{}}`),
SeverityValue: db.SeverityLow,
ReleasePhase: db.ReleaseStatusAlpha,
})
if err != nil {
t.Fatalf("Error creating rule type: %v", err)
Expand Down Expand Up @@ -401,6 +402,7 @@ func ruleTypeSequenceCreate(
ProjectID: projectID,
Definition: []byte(defstr),
SeverityValue: db.SeverityLow,
ReleasePhase: db.ReleaseStatusAlpha,
})
if err != nil {
return err
Expand Down
5 changes: 4 additions & 1 deletion internal/db/profile_status.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions internal/db/profiles_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ func createRandomRuleType(t *testing.T, projectID uuid.UUID) RuleType {
Guidance: rand.RandomString(64, seed),
Definition: json.RawMessage(`{"key": "value"}`),
SeverityValue: SeverityHigh,
ReleasePhase: ReleaseStatusAlpha,
}

ruleType, err := testQueries.CreateRuleType(context.Background(), arg)
Expand Down
12 changes: 9 additions & 3 deletions internal/db/rule_types.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 43 additions & 0 deletions internal/ruletypes/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ func (_ *ruleTypeService) CreateRuleType(
return nil, err
}

releasePhase, err := GetDBReleaseStatusFromPBReleasePhase(ruleType.GetReleasePhase())
if err != nil {
return nil, err
}

ruleType = ruleType.WithDefaultDisplayName()
newDBRecord, err := qtx.CreateRuleType(ctx, db.CreateRuleTypeParams{
Name: ruleTypeName,
Expand All @@ -149,6 +154,7 @@ func (_ *ruleTypeService) CreateRuleType(
Guidance: ruleType.GetGuidance(),
SeverityValue: *severity,
SubscriptionID: uuid.NullUUID{UUID: subscriptionID, Valid: subscriptionID != uuid.Nil},
ReleasePhase: *releasePhase,
})
if err != nil {
return nil, fmt.Errorf("failed to create rule type: %w", err)
Expand Down Expand Up @@ -214,13 +220,19 @@ func (_ *ruleTypeService) UpdateRuleType(
return nil, err
}

releasePhase, err := GetDBReleaseStatusFromPBReleasePhase(ruleType.GetReleasePhase())
if err != nil {
return nil, err
}

ruleType = ruleType.WithDefaultDisplayName()
updatedRuleType, err := qtx.UpdateRuleType(ctx, db.UpdateRuleTypeParams{
ID: oldRuleType.ID,
Description: ruleType.GetDescription(),
Definition: serializedRule,
SeverityValue: *severity,
DisplayName: ruleType.GetDisplayName(),
ReleasePhase: *releasePhase,
})
if err != nil {
return nil, fmt.Errorf("failed to update rule type: %w", err)
Expand Down Expand Up @@ -297,3 +309,34 @@ func validateRuleUpdate(existingRecord *db.RuleType, newRuleType *pb.RuleType) e

return nil
}

// GetDBReleaseStatusFromPBReleasePhase converts a protobuf release phase to a database release status
func GetDBReleaseStatusFromPBReleasePhase(in pb.RuleTypeReleasePhase) (*db.ReleaseStatus, error) {
sev, err := in.InitializedStringValue()
if err != nil {
return nil, errors.Join(ErrRuleTypeInvalid, err)
}
var rel db.ReleaseStatus

if err := rel.Scan(sev); err != nil {
// errors from the `Scan` method appear to be caused entirely by bad
// input
return nil, errors.Join(ErrRuleTypeInvalid, err)
}

return &rel, nil
}

// GetPBReleasePhaseFromDBReleaseStatus converts a database release status to a protobuf release phase
func GetPBReleasePhaseFromDBReleaseStatus(s *db.ReleaseStatus) (pb.RuleTypeReleasePhase, error) {
if s == nil {
return pb.RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED, nil
}

var rel pb.RuleTypeReleasePhase
if err := rel.FromString(string(*s)); err != nil {
return pb.RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED, err
}

return rel, nil
}
7 changes: 6 additions & 1 deletion internal/ruletypes/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ func RuleTypePBFromDB(rt *db.RuleType) (*minderv1.RuleType, error) {
project := rt.ProjectID.String()

var seval minderv1.Severity_Value

if err := seval.FromString(string(rt.SeverityValue)); err != nil {
seval = minderv1.Severity_VALUE_UNKNOWN
}
Expand All @@ -56,6 +55,11 @@ func RuleTypePBFromDB(rt *db.RuleType) (*minderv1.RuleType, error) {
displayName = rt.Name
}

var releasePhase minderv1.RuleTypeReleasePhase
if err := releasePhase.FromString(string(rt.ReleasePhase)); err != nil {
releasePhase = minderv1.RuleTypeReleasePhase_RULE_TYPE_RELEASE_PHASE_UNSPECIFIED
}

// TODO: (2024/03/28) this is for compatibility with old CLI versions that expect provider, remove this eventually
noProvider := ""
return &minderv1.RuleType{
Expand All @@ -72,5 +76,6 @@ func RuleTypePBFromDB(rt *db.RuleType) (*minderv1.RuleType, error) {
Severity: &minderv1.Severity{
Value: seval,
},
ReleasePhase: releasePhase,
}, nil
}
4 changes: 4 additions & 0 deletions pkg/api/openapi/minder/v1/minder.swagger.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 02452cc

Please sign in to comment.