Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Populate the release_phase response to the related APIs #4278

Merged
merged 2 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading