Skip to content

Commit 62773a6

Browse files
committed
wip
1 parent 1f74c3a commit 62773a6

File tree

7 files changed

+445
-313
lines changed

7 files changed

+445
-313
lines changed

internal/database/mariadb/entity.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,15 +1191,15 @@ func (rr *RemediationRow) FromRemediation(r *entity.Remediation) {
11911191
rr.Description = sql.NullString{String: r.Description, Valid: true}
11921192
rr.Type = sql.NullString{String: r.Type.String(), Valid: true}
11931193
rr.Component = sql.NullString{String: r.Component, Valid: true}
1194-
rr.ComponentId = sql.NullInt64{Int64: r.ComponentId, Valid: true}
1194+
rr.ComponentId = sql.NullInt64{Int64: r.ComponentId, Valid: r.ComponentId != -1}
11951195
rr.Service = sql.NullString{String: r.Service, Valid: true}
11961196
rr.ServiceId = sql.NullInt64{Int64: r.ServiceId, Valid: true}
11971197
rr.Issue = sql.NullString{String: r.Issue, Valid: true}
11981198
rr.IssueId = sql.NullInt64{Int64: r.IssueId, Valid: true}
11991199
rr.RemediationDate = sql.NullTime{Time: r.RemediationDate, Valid: true}
12001200
rr.ExpirationDate = sql.NullTime{Time: r.ExpirationDate, Valid: true}
12011201
rr.RemediatedBy = sql.NullString{String: r.RemediatedBy, Valid: true}
1202-
rr.RemediatedById = sql.NullInt64{Int64: r.RemediatedById, Valid: true}
1202+
rr.RemediatedById = sql.NullInt64{Int64: r.RemediatedById, Valid: r.RemediatedById != -1}
12031203
rr.CreatedAt = sql.NullTime{Time: r.CreatedAt, Valid: true}
12041204
rr.CreatedBy = sql.NullInt64{Int64: r.CreatedBy, Valid: true}
12051205
rr.DeletedAt = sql.NullTime{Time: r.DeletedAt, Valid: true}

internal/database/mariadb/issue_test.go

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,93 +1180,3 @@ var _ = Describe("Ordering Issues", Label("IssueOrder"), func() {
11801180
})
11811181

11821182
})
1183-
1184-
var _ = Describe("Counting Issues by Severity", Label("IssueCounts"), func() {
1185-
var db *mariadb.SqlDatabase
1186-
var seeder *test.DatabaseSeeder
1187-
var seedCollection *test.SeedCollection
1188-
1189-
var testIssueSeverityCount = func(filter *entity.IssueFilter, counts entity.IssueSeverityCounts) {
1190-
issueSeverityCounts, err := db.CountIssueRatings(filter)
1191-
1192-
By("throwing no error", func() {
1193-
Expect(err).To(BeNil())
1194-
})
1195-
1196-
By("returning the correct counts", func() {
1197-
Expect(issueSeverityCounts.Critical).To(BeEquivalentTo(counts.Critical))
1198-
Expect(issueSeverityCounts.High).To(BeEquivalentTo(counts.High))
1199-
Expect(issueSeverityCounts.Medium).To(BeEquivalentTo(counts.Medium))
1200-
Expect(issueSeverityCounts.Low).To(BeEquivalentTo(counts.Low))
1201-
Expect(issueSeverityCounts.None).To(BeEquivalentTo(counts.None))
1202-
Expect(issueSeverityCounts.Total).To(BeEquivalentTo(counts.Total))
1203-
})
1204-
}
1205-
1206-
BeforeEach(func() {
1207-
var err error
1208-
db = dbm.NewTestSchema()
1209-
seeder, err = test.NewDatabaseSeeder(dbm.DbConfig())
1210-
Expect(err).To(BeNil(), "Database Seeder Setup should work")
1211-
seedCollection, err = seeder.SeedForIssueCounts()
1212-
Expect(err).To(BeNil())
1213-
err = seeder.RefreshCountIssueRatings()
1214-
Expect(err).To(BeNil())
1215-
})
1216-
AfterEach(func() {
1217-
dbm.TestTearDown(db)
1218-
})
1219-
1220-
It("returns the correct count for all issues", func() {
1221-
severityCounts, err := test.LoadIssueCounts(test.GetTestDataPath("../mariadb/testdata/issue_counts/issue_counts_per_severity.json"))
1222-
Expect(err).To(BeNil())
1223-
testIssueSeverityCount(nil, severityCounts)
1224-
})
1225-
It("returns the correct count for component version issues", func() {
1226-
severityCounts, err := test.LoadComponentVersionIssueCounts(test.GetTestDataPath("../mariadb/testdata/issue_counts/issue_counts_per_component_version.json"))
1227-
Expect(err).To(BeNil())
1228-
1229-
for _, cvi := range seedCollection.ComponentVersionIssueRows {
1230-
cvId := cvi.ComponentVersionId.Int64
1231-
filter := &entity.IssueFilter{
1232-
ComponentVersionId: []*int64{&cvId},
1233-
}
1234-
1235-
strId := fmt.Sprintf("%d", cvId)
1236-
1237-
testIssueSeverityCount(filter, severityCounts[strId])
1238-
}
1239-
1240-
})
1241-
It("returns the correct count for services", func() {
1242-
severityCounts, err := test.LoadServiceIssueCounts(test.GetTestDataPath("../mariadb/testdata/issue_counts/issue_counts_per_service.json"))
1243-
Expect(err).To(BeNil())
1244-
1245-
for _, service := range seedCollection.ServiceRows {
1246-
serviceId := service.Id.Int64
1247-
1248-
filter := &entity.IssueFilter{
1249-
ServiceId: []*int64{&serviceId},
1250-
}
1251-
1252-
strId := fmt.Sprintf("%d", serviceId)
1253-
1254-
testIssueSeverityCount(filter, severityCounts[strId])
1255-
}
1256-
})
1257-
It("returns the correct count for supportgroup", func() {
1258-
severityCounts, err := test.LoadSupportGroupIssueCounts(test.GetTestDataPath("../mariadb/testdata/issue_counts/issue_counts_per_support_group.json"))
1259-
Expect(err).To(BeNil())
1260-
1261-
for _, sg := range seedCollection.SupportGroupRows {
1262-
filter := &entity.IssueFilter{
1263-
SupportGroupCCRN: []*string{&sg.CCRN.String},
1264-
}
1265-
1266-
strId := fmt.Sprintf("%d", sg.Id.Int64)
1267-
1268-
testIssueSeverityCount(filter, severityCounts[strId])
1269-
}
1270-
})
1271-
1272-
})

internal/database/mariadb/migrations/20250827115156_add_mv_count_vulnerability_component.up.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ BEGIN
5454
INNER JOIN ComponentVersion AS CV ON CV.componentversion_id = CI.componentinstance_component_version_id
5555
INNER JOIN IssueVariant AS IV ON IV.issuevariant_issue_id = IM.issuematch_issue_id
5656
INNER JOIN Issue AS I ON I.issue_id = IV.issuevariant_issue_id
57+
LEFT JOIN Remediation R ON CI.componentinstance_service_id = R.remediation_service_id AND I.issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
5758
WHERE
5859
IM.issuematch_status = 'new'
5960
AND I.issue_type = 'Vulnerability'
@@ -63,6 +64,7 @@ BEGIN
6364
AND I.issue_deleted_at IS NULL
6465
AND CI.componentinstance_deleted_at IS NULL
6566
AND CV.componentversion_deleted_at IS NULL
67+
AND (R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE())
6668
GROUP BY
6769
CI.componentinstance_service_id,
6870
CV.componentversion_component_id;
@@ -112,6 +114,7 @@ BEGIN
112114
ON IV.issuevariant_issue_id = IM.issuematch_issue_id
113115
INNER JOIN Issue AS I
114116
ON I.issue_id = IV.issuevariant_issue_id
117+
LEFT JOIN Remediation R ON CI.componentinstance_service_id = R.remediation_service_id AND I.issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
115118
WHERE
116119
IM.issuematch_status = 'new'
117120
AND I.issue_type = 'Vulnerability'
@@ -120,6 +123,7 @@ BEGIN
120123
AND I.issue_deleted_at IS NULL
121124
AND CI.componentinstance_deleted_at IS NULL
122125
AND CV.componentversion_deleted_at IS NULL
126+
AND (R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE())
123127
GROUP BY
124128
CI.componentinstance_service_id;
125129

internal/database/mariadb/migrations/20251031095712_mv_counters_replace_enum_rows_with_columns.up.sql

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ BEGIN
9494
LEFT JOIN Service S ON S.service_id = CI.componentinstance_service_id
9595
LEFT JOIN SupportGroupService SGS ON SGS.supportgroupservice_service_id = CI.componentinstance_service_id
9696
LEFT JOIN SupportGroup SG ON SGS.supportgroupservice_support_group_id = SG.supportgroup_id
97+
LEFT JOIN Remediation R ON S.service_id = R.remediation_service_id AND I.issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
9798
WHERE I.issue_deleted_at IS NULL
99+
AND (R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE())
98100
GROUP BY SG.supportgroup_ccrn;
99101
END;
100102

@@ -143,7 +145,9 @@ BEGIN
143145
LEFT JOIN ComponentInstance CI ON CI.componentinstance_id = IM.issuematch_component_instance_id
144146
LEFT JOIN ComponentVersion CV ON CI.componentinstance_component_version_id = CV.componentversion_id
145147
LEFT JOIN Service S ON S.service_id = CI.componentinstance_service_id
146-
WHERE I.issue_deleted_at IS NULL;
148+
LEFT JOIN Remediation R ON S.service_id = R.remediation_service_id AND I.issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
149+
WHERE I.issue_deleted_at IS NULL
150+
AND (R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE());
147151
END;
148152

149153
--
@@ -204,7 +208,11 @@ BEGIN
204208
LEFT JOIN ComponentInstance CI ON CI.componentinstance_id = IM.issuematch_component_instance_id
205209
LEFT JOIN SupportGroupService SGS ON SGS.supportgroupservice_service_id = CI.componentinstance_service_id
206210
LEFT JOIN SupportGroup SG ON SGS.supportgroupservice_support_group_id = SG.supportgroup_id
211+
LEFT JOIN Remediation R ON SGS.supportgroupservice_service_id = R.remediation_service_id AND I.issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
207212
WHERE I.issue_deleted_at IS NULL
213+
AND CI.componentinstance_deleted_at IS NULL
214+
-- Count only non-remediated or with expired remediation
215+
AND (R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE())
208216
GROUP BY SG.supportgroup_ccrn;
209217
END;
210218

@@ -225,6 +233,7 @@ SET critical_count = CASE WHEN issue_value = 'Critical' THEN issue_count ELSE 0
225233
none_count = CASE WHEN issue_value = 'None' THEN issue_count ELSE 0 END;
226234

227235
ALTER TABLE mvCountIssueRatingsComponentVersion
236+
ADD COLUMN service_id INT DEFAULT NULL,
228237
DROP COLUMN issue_value,
229238
DROP COLUMN issue_count,
230239
ADD COLUMN issue_count INT GENERATED ALWAYS AS (
@@ -237,6 +246,7 @@ BEGIN
237246
TRUNCATE TABLE mvCountIssueRatingsComponentVersion;
238247
INSERT INTO mvCountIssueRatingsComponentVersion (
239248
component_version_id,
249+
service_id,
240250
critical_count,
241251
high_count,
242252
medium_count,
@@ -245,15 +255,19 @@ BEGIN
245255
)
246256
SELECT
247257
CVI.componentversionissue_component_version_id AS component_version_id,
258+
CI.componentinstance_service_id AS service_id,
248259
COUNT(DISTINCT CASE WHEN IV.issuevariant_rating = 'Critical' THEN CONCAT(CVI.componentversionissue_component_version_id, ',', CVI.componentversionissue_issue_id) END) AS critical_count,
249260
COUNT(DISTINCT CASE WHEN IV.issuevariant_rating = 'High' THEN CONCAT(CVI.componentversionissue_component_version_id, ',', CVI.componentversionissue_issue_id) END) AS high_count,
250261
COUNT(DISTINCT CASE WHEN IV.issuevariant_rating = 'Medium' THEN CONCAT(CVI.componentversionissue_component_version_id, ',', CVI.componentversionissue_issue_id) END) AS medium_count,
251262
COUNT(DISTINCT CASE WHEN IV.issuevariant_rating = 'Low' THEN CONCAT(CVI.componentversionissue_component_version_id, ',', CVI.componentversionissue_issue_id) END) AS low_count,
252263
COUNT(DISTINCT CASE WHEN IV.issuevariant_rating = 'None' THEN CONCAT(CVI.componentversionissue_component_version_id, ',', CVI.componentversionissue_issue_id) END) AS none_count
253-
FROM Issue I
254-
LEFT JOIN IssueVariant IV ON IV.issuevariant_issue_id = I.issue_id
255-
LEFT JOIN ComponentVersionIssue CVI ON I.issue_id = CVI.componentversionissue_issue_id
256-
WHERE I.issue_deleted_at IS NULL
264+
FROM ComponentVersionIssue CVI
265+
LEFT JOIN IssueVariant IV ON IV.issuevariant_issue_id = CVI.componentversionissue_issue_id
266+
INNER JOIN ComponentInstance CI ON CVI.componentversionissue_component_version_id = CI.componentinstance_component_version_id
267+
LEFT JOIN Remediation R ON CI.componentinstance_service_id = R.remediation_service_id AND CVI.componentversionissue_issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
268+
WHERE
269+
-- Count only non-remediated or with expired remediation
270+
(R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE())
257271
GROUP BY CVI.componentversionissue_component_version_id;
258272
END;
259273

@@ -302,8 +316,11 @@ BEGIN
302316
FROM Issue I
303317
LEFT JOIN IssueVariant IV ON IV.issuevariant_issue_id = I.issue_id
304318
LEFT JOIN IssueMatch IM ON I.issue_id = IM.issuematch_issue_id
305-
LEFT JOIN ComponentInstance CI ON CI.componentinstance_id = IM.issuematch_component_instance_id
319+
LEFT JOIN ComponentInstance CI ON CI.componentinstance_id = IM.issuematch_component_instance_id AND CI.componentinstance_deleted_at IS NULL
320+
LEFT JOIN Remediation R ON CI.componentinstance_service_id = R.remediation_service_id AND I.issue_id = R.remediation_issue_id AND R.remediation_deleted_at IS NULL
306321
WHERE I.issue_deleted_at IS NULL
322+
-- Count only non-remediated or with expired remediation
323+
AND (R.remediation_id IS NULL OR R.remediation_expiration_date < CURDATE())
307324
GROUP BY CI.componentinstance_service_id;
308325
END;
309326

0 commit comments

Comments
 (0)